- 博客(17)
- 收藏
- 关注
原创 如何自己动手去实现一个nslookup
nslookup 这个命令大家一定非常熟悉,我们常常使用这个命令查看指定域名的IP地址。那这个命令是如何实现的呢?能否自己亲自动手实现一个属于自己的nslookup呢?
2022-09-14 21:23:10
810
原创 如何实现一个百万并发量的TCP服务器
朋友问我:你现在年薪百万吗?我说:我没有,倒是并发量超百万的服务器可以有(坏笑)。实现一个并发量超一百万的TCP服务器使用epoll获取请求+线程池处理请求四台虚拟机(一个服务端以及三个服务端)服务端硬件配置要求:双核处理器,4G运行内存客服端硬件配置要求:单核处理器,2G运行内存虚拟机运行操作系统:ubuntu server 64位虚拟机软件:VMware Fusion操作系统:macOS
2022-09-07 18:44:32
1177
原创 手写线程池
我们写的线程池中预计最多会有8个线程在同时工作。这8个线程会组成一个工作队列(队列使用双向链表进行实现)。需要我们去处理的任务量暂定为2000条。这2000条任务会依次存储到一个任务队列中(队列使用双向链表进行实现)。工作内容为将自身的ID给输出到屏幕上。每个线程会先判断任务队列中有没有任务需要去处理,如果有的话就去调用任务函数去处理任务任务全部处理完成后将相关的资源进行释放。...
2022-08-18 17:05:07
138
原创 关于 printf(“%c\n“,c);的一些感想
我们先来看一下这段代码:我们进行编译后会发现是无法通过编译的:提示我们printf函数的第二个参数需要的是一个int类型变量,而不是指向char类型的指针变量。这里我就有一个疑问既然我要的是输出一个字符,那为什么不是需要char类型的变量做参数,反而这里需要的是int类型的变量呢?我大胆猜测,这里之所以第二个参数需要的是int类型是因为printf函数想要输出一个字符的话肯定是需要这个字符的ASCII码的,而某一个字符的ASCII码就是int类型,所以我们将printf的函数的第二个参数改为想要输出字符
2022-07-09 21:02:11
486
原创 char *c = “abc“; 以及 char c[] = “abc“ 区别
当我们代码中有下面这两行代码的时候:我们是无法通过编译的,因为指针c指向的字符串“abc”在常量区,而常量是不能够被改变的。我们可以对上面的两行代码做以下修改使得编译可以通过:下面两行代码与上面的不同之处在于我们将常量区的字符串“abc”中的值:‘a’ ‘b’ ‘b’ 复制给了数组c中的c[0],c[1],c[2]。而数组c中的各个元素是存储在栈区的,这样我们就可以对数组中的指定元素进行修改。...
2022-07-09 19:11:08
741
原创 图的深度优先与广度优先遍历
深度优先遍历当我们要从图中的某一个点开始要进行深度优先遍历的时候,首先要访问这个点,在访问完这个点后,就要看这个点是否有未被访问的邻接顶点,假如有,则访问这个邻接顶点,在访问完这个邻接顶点后我们还要继续判断这个邻接顶点是否也有未被访问到的邻接顶点,假如有那就继续访问…就这样不停的循环下去,直到图中所有的顶点都被访问到。举个例子:假如现在我们要从这个无向图中标号为1的顶点开始深度遍历,那么它的遍历次序应该是这样的:1 -> 2 -> 4 -> 8 -> 5 -> 3 -&
2022-05-31 22:00:59
186
原创 钢条切割问题(自顶向下)
钢条切割问题其实这个问题与我们大家熟知的背包问题本质上是一样的,我们来看一下问题本身:首先这里有一个价格表(表格摘自《算法导论》),表中列出了不同长度的钢条的价格:长度12345678910价格1589101717202430假如现在我们有一块长度为5的钢条,那么我们通过切割这块钢条为不同大小的钢条后可以获得的最大利益是多少。我们可以先从一块长度为5的钢条上截一块长度为a_legth(初始值为1)的钢条,然后考虑如何切割剩下长度为5-le
2022-05-30 17:17:50
293
原创 B树的插入与删除
实现#include <iostream>using namespace std;//定义B树节点struct BTree{ //关键字个数 int number; //指向孩子数组的二级指针 BTree **childrens; //是否是叶子节点 bool leafnode; //指向关键字数组的二级指针 int *key; //最小度数 int t;};//创建节点并且初始化BTree *c
2022-05-10 20:41:21
284
原创 红黑树(删除)
红黑树(删除)我们在给红黑树插入一个节点的时候我们走的是先插入然后再调整颜色这一路线。这里我们在给红黑树进行删除某一个节点的时候也一样走的是先删除某一个节点,然后对红黑树的颜色进行调整的路线。那么要在红黑树上删除某一个节点,那我们首先就要知道在二叉排序树上是怎样删除一个节点的。二叉排序树删除某一个节点假设我们要在红黑树中删除某一个节点z,那在我们删除节点z之后肯定要找另外一个节点来顶替我们删除掉的z节点。而寻找z节点的顶替节点需要根据z的孩子节点的不同情况来进行挑选,有下面这四种情况:情况1 z节
2022-05-01 18:00:28
2577
原创 红黑树(插入)
红黑树的插入性质性质1 每个节点要么是红色的要么是黑色的性质2 根节点一定是黑色的性质3 每个叶子节点肯定是黑色的性质4 一个红色节点的父亲节点一定不是红色的性质5 任何一个节点到叶子节点的简单路径上所包含的黑色节点的数量是相同的左旋 右旋接下来我们试着把上面的图片(图片针对叶子节点进行了隐藏,文章之后的图片也一样,故以后不再说明)中的x节点进行左旋void leftRotate(T,x){ //x的右孩子 y = x.right; //y的左孩子变为x的右孩子
2022-04-23 22:57:39
380
原创 二叉树的插入与中序遍历
//定义二叉树节点struct binaryTreeNode{ //左孩子指针 binaryTreeNode *left; //右孩子指针 binaryTreeNode *right; //数据 int data;};//创建新的节点,节点的值为valuebinaryTreeNode *newNode(int value){ binaryTreeNode *newNode = new binaryTreeNode; newNode-
2022-04-19 16:40:55
551
原创 单链表的就地逆置
单链表的就地逆置基本思路将原有的链表断开为一个头节点以及一个新的链表,将新的链表的各个节点从头到尾依次使用头插法插入到之前断开的头节点之后。代码实现//单链表就地逆置LNode* reverseList(LNode* list){ //将头节点与链表断开 first为待插入链表的第一个节点 LNode* first = list->next; list->next = NULL; //将断开的链表使用头插法插入到头节点后 work为待插入节点 w
2022-04-18 19:11:43
2449
原创 kmp算法
KMPKMP算法可以用来确定模式串是否存在于主串中.在匹配的过程中,当模式串在某个位置上与主串发生失配的时候,不必回溯只需要按照模式串在该失配位置上的next函数值进行向右滑动,从而进行新的适配。那么什么是模式串在失配位置上的next函数值举个例子:主串 :a c a b模式串:a b位置 :1 2这里模式串在第二个位置与主串发生了失配,接下来就是将模式串右移一位继续比较,变为:主串:a c a b
2022-04-18 17:41:23
105
原创 快慢指针判断链表中是否有环
基本思想快指针:从头开始移动 每次移动两个距离慢指针:从头开始移动 每次移动一个距离如果单链表中存在有环的话,那么快慢指针一定是会相遇的。为什么?首先快指针在环内肯定是可以追上慢指针的对吧,那存不存在一种可能就是快指针恰好跳过了慢指针(因为快指针的步长为2)然后快慢指针就没有相遇了呢?答案是不存在这一种情况的,我们这里首先要明确一点就是“假如没有相遇,又何来的超越呢?”对吧,好比咱俩在操场上跑步,假如你都没有与我相遇那你又何谈超过我,对吧。当快慢指针首次相遇的时候,慢指针肯定在环内的移动距离肯定没
2022-04-18 17:29:29
634
原创 直接插入排序
直接插入排序实现过程假设最开始的有序序列中只有数组内的第一个元素,将数组剩下的其他元素依次按序插入到之前排好的有序序列中.代码实现int main() { //定义一个容量为10的数组 int array[] = {12, 23, 43, 33, 44, 55, 32, 45, 54, 22}; //假设最开始的有序序列中只有数组中的第一个元素 //从第二个元素开始依次插入到之前的有序序列中 for (int i = 1; i < 10; i++) { //假如
2022-04-07 15:03:01
1037
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人