自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(15)
  • 收藏
  • 关注

原创 高并发服务器模型

我们在调用epoll_creat()的时候,内核出来帮我们在epoll文件系统中创建了一个file节点,在内核中还创建了一棵红黑树用来存储加入的socket以外,还会建立一个rbllist双向链表,用来存储准备就绪的事件,当调用epoll_wait()的时候,就只需要观察这个双向链表中有无数据,如果没用就sleep阻塞等待,当阻塞时间超过timeout的时候,就直接返回。epoll反应堆利用了c++的封装的思想,封装了一个自己的结构体,每个结构体都用函数指针,通过不同的事件,来回调不同的函数。

2024-03-07 16:00:13 1024

原创 trie树(前缀树)

在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。

2024-02-28 21:46:45 550 1

原创 常见的socket函数封装和多进程和多线程实现服务器并发

我们在写的时候发现当一些进程完成通信以后,关闭文件描述符,我们的空间是无法进行回收的,这样就会大大浪费空间,因此我们可以写一个函数来返回结束通信的空间位置可利用的空间,来使用这块空间。当有多个客户端向服务器发送数据的时候,我们如何去操作,这就涉及到了我们的多线程和多进程开发了,下面看看如何来实现。(1)首先我们想如何通过多进程来实现呢?那么我们得想清楚父子进程分别来干啥,我们可以这样,(3)最后我们利用信号的方式来回收子进程,防止出现僵尸进程。接下来就是多线程服务器如何去实现呢?

2024-02-27 19:42:45 1176

原创 三次握手和四次挥手

我们可以考虑一下这样的场景,客户端发送的第一个请求连接没有失效,只是因为在网络中滞留的时间太长了,导致客户端迟迟没有收到服务器端的确定报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。如果此时之前滞留的那一次请求连接,因为网络通畅了, 到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。

2024-02-19 19:26:25 930 1

原创 网络的基本概念和socket编程

在这种模式下,数据的低位字节保存在内存的低地址中,而数据的高位字节保存在内存的高地址中。:在这种模式下,数据的高位字节保存在内存的低地址中,而数据的低位字节保存在内存的高地址中。这里的目的地址和源地址都是指MAC地址,MAC地址为6个字节,IP地址为4个字节,不同类型对应了不同的值,CRC是进行校验的。我们在网络传输的时候用的是网络字节序,也就是大端字节序,进行网络通信时要把地址转化为大端字节序,下面是相关函数。SMTP协议:简单邮件传输协议是用于在网络中传输电子邮件的协议。可以通过下面这个代码。

2024-02-10 16:55:48 1997 1

原创 哈希函数和哈希表

现在我们给出一个场景题,现在有个黑名单有100亿个url,我们不希望用户去访问这些url,假设这每个url是64字节,也就是判断这个url是否属于这个集合,我们可能想用hash表来实现,但是这样哈希表要用6400亿万字节,也就是596G的内存。这只是一种优化,JVM还有忧化,用户用哈希表当链过长时,后台会给你生成一个新的更大的哈希表,生成好后让你使用,这个扩容过程不占用用户的资源的。然后我们用这1GB内存依次从每个组中进行哈希,把这些组的出现最多的数据和次数保存下来,最后取Max,求出出现最多的数据。

2024-01-11 20:32:09 1128 1

原创 Manacher算法

Manacher算法又叫马拉车算法,是用来解决最长回文子串长度的问题的。可以通过O(N)的时间复杂度求出最长回文子串,它也会有很多的拓展运用。Mannacher算法也和KMP算法一样有一个数组来记录信息,这个数组是来记录最长回文半径的数组。我们先来看看回文半径的概念对于原字符串中的每一个字符,以这个字符为中心的最长回文串长度的一半向上取整就是其回文半径。然后还有两个变量,一个为C,一个为R。R:最长回文的区间右边界的最大值。C:右边界最大值所对应的中心点,也就是R所对应的圆心。下面举两个例子。

2024-01-06 19:52:14 977 1

原创 bfprt算法

数组中第K大的元素第k大的元素就是第n-k+1小的元素,直接套用bfprt就可以。如果让你求出从小到大排序后,前k个的元素,我们把第k小的元素找出,然后遍历数组,比他小的元素放入数组中,最后如果还有空缺位置,说明和该元素相等,直接填上这个数就可以了。

2024-01-04 16:17:43 1073 1

原创 归并排序和快速排序的相关运用

我们下面就可以通过这样的划分写出快排了,因为等于x的区间已经排好,现在分别处理小于x的和等于x的就可以了。

2024-01-03 16:11:21 1163 2

原创 KMP算法

KMP算法是解决字符串的匹配问题的算法,是用来判断一个字符串是不是另一个字符串的子串的一种算法。设两个字符串的长度分别为m,n。KMP算法的时间复杂度为O(m+n)。

2024-01-01 17:01:13 938 1

原创 二叉搜索树的相关问题

它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树。如果是二叉搜索树的话,它的中序是一个从小到大的一个有序序列如下图就是一个二叉搜索树:那我们如何去判断一个树是不是二叉搜索树呢,我们知道二叉树的根节点要大于所有的左子树结点,小于所有的右子树节点,而且所有的子树根节点也要满足。

2023-12-30 21:18:33 838 1

原创 环形链表找环路入口的方法和证明

证明:没有环的时候这个是很明显正确的,我们现在来看看有环的情况。看下面这个图我们可以看看慢指针刚进环的情况:现在快指针。

2023-12-23 22:08:31 1223

原创 二叉树的序列化和反序列化

序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。简而言之:1.我们二叉树把转化为数组或字符串来进行存储的过程就叫二叉树的序列化。2.我们通过转化的数组或字符串来还原出二叉树的过程叫二叉树的反序列化。1.二叉树的序列化的方式有多种,前序后序,层序都是可以的,只有中序不可以。2.注意:要把空节点补出来,才可以进行。

2023-12-20 20:58:52 905 1

原创 二叉树还能这么遍历?

Morris遍历是可以把空间复杂度降到O(1)的二叉树遍历算法1.首先定义一个cur变量指向根节点。2.(1)如果cur指向的根节点存在左子树,我们要找的cur的前驱节点对一棵二叉树进行中序遍历,遍历后的顺序,当前节点的前一个节点为该节点的前驱节点也就是左子树最右边的叶子节点(用mostright记录),我们将它的右指针指向cur。(2)如果不存在左子树,直接让cur指向它的right。3.继续重复这个过程,知道cur为NULL结束。

2023-12-18 19:15:48 733 1

原创 手写二叉树(c++)

下面是二叉树的节点定义int val;}Node;二叉树的大部分问题可以通过递归解决。当树的节点多时,递归会出现,函数大量压栈,占用栈空间出现爆栈,所以出现了非递归的前中后序遍历。但本质上时间复杂度和空间复杂度都是O(N),没有变化,仅解决了爆栈的问题。那有没有更好的算法呢?答案是有的,Morris遍历可以实现前中后序的遍历,且时间复杂度为O(N),空间复杂度为O(1),优化了空间复杂度。

2023-12-17 20:40:41 144 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除