- 博客(75)
- 收藏
- 关注
原创 哈夫曼树的讲解
在我们为指令编码时,需要对不同频率的指令编不同长度的编码,对于一些使用频率非常频繁的指令来说,我们就会将他的指令编的足够短,使整体的运行速度变快,但是这样就要有一个标准,那么如何来对各种各样的指令进行编码呢?这就是哈夫曼树的产生原因,就是逐步给每一个指令编码的规则。哈夫曼树,又称最优二叉树,是一种特殊的二叉树结构,广泛应用于数据压缩和编码领域。它通过为不同频率的字符分配不同长度的编码,实现数据的高效压缩哈夫曼树的核心思想是基于字符出现的频率构建一棵带权路径长度(WPL)最短的二叉树。
2025-03-08 19:00:00
391
原创 快速排序的代码实现和性质
个人感觉快速排序和归并排序有一定的相似之处,都是采用分治的手段拆分区间,但是快排是一边拆分区间,一边排序,而归并排序是将区间拆分完毕以后进行合并排序,所以说快速排序算法也非常适合使用递归来进行实现快速排序是一种高效的排序算法,基于分治思想,通过选择一个“基准”元素,将数组分为两部分:一部分包含小于基准的元素,另一部分包含大于基准的元素,然后递归地对这两部分进行排序。这这篇文章中,我们的基准元素就是使用最右侧的元素,或者最左侧的元素。
2025-03-08 18:00:00
609
原创 希尔排序的代码实现和性质
希尔排序是一种基于插入排序的改进算法,属于**分组插入排序**,它通过引入“步长序列”来优化传统插入排序的效率。希尔排序是第一个突破时间复杂度为O(n²)的排序算法。这就是希尔排序的意义,这里我感觉本质上就是通过缓慢调整数组元素的大致顺序,直到全部有序,因为对于插入排序来说,就是数组越有序,插入排序也就越快。
2025-03-08 10:29:45
520
原创 堆排序的代码实现
是一种基于二叉堆数据结构的比较排序算法。它利用了堆的性质来高效地完成排序任务。堆排序的主要思想是将待排序的数组构建成一个最大堆(或最小堆),然后通过不断提取堆顶元素(最大值或最小值)并重新调整堆,最终实现整个数组的有序排列。个人感觉堆排序就是采用了先建一个大堆,然后使得堆顶和数组的尾部进行交换,然后堆再进行向下调整,不断进行,使得整个数组都变为升序。
2025-03-06 22:02:12
1095
原创 哈希表的代码实现以及性质
哈希表本质上是一种存储键值对的容器,但是和avl树或者是红黑树比较而言,哈希表的查找要更加直接和快速,我个人感觉有点像打靶一样,直接打入某个位置,如果那个位置已经有元素了,就去附近的位置,直到找到空白的地方,但是这个打靶也是存在着一定的规则,一般情况下都是采用哈希值取模的结果进行打靶。直接来说它通过哈希函数将键映射到表中的一个位置,从而实现快速的数据插入、查找和删除操作。哈希表的核心思想是利用哈希函数将键的值转换为存储位置的索引,从而实现高效的访问。
2025-03-06 17:56:29
1043
原创 归并排序的代码实现和介绍
归并排序是一种高效的排序算法,属于分治算法的一种。它通过将数组不断拆分成更小的子数组,然后对这些子数组进行排序,最后将排序好的子数组合并成一个有序数组。从这样的性质来看,实现归并算法就非常适合递归。
2025-03-05 10:16:41
513
原创 冒泡排序,插入排序,选择排序三个简单排序的代码实现
冒泡排序的思想在于将一个数组里面最左侧的元素向旁边的元素进行比较,如果旁边的元素比他更小,则进行交换,然后再让旁边的元素和旁边的元素进行比较,直到最后一位,那么最后一位就是最大的元素,这个时候我们在除开最后一位元素再重复这个过程,这样自然就得到了一个升序的数组,这就是冒泡排序的思想,使用两次循环就可以实现int c = *a;*a = *b;*b = c;a < n;i++)
2025-03-05 09:06:12
371
原创 C++中的右值引用
右值引用是C++11提出来的概念,和左值引用一起形成了C++的引用类型,它的产生使得代码更加的灵活和高效,那么,到底什么是右值引用呢,这边我个人感觉左值引用就是对于一些生命周期长的变量的引用,而右值引用则是对于一些将亡值进行引用,然后延长他们的生命周期。这里右值引用就是使用&&进行引用。
2025-03-04 16:18:51
558
原创 C++中shared_ptr的实现和weak_ptr的实现
因为unique_ptr没办法实现对一块空间进行多次指向,所以就产生了shared_ptr,这样就表明其实shared_ptr可以多次指向同一块空间,但是它本身又存在一点点内存释放的缺陷,所以就有了waek_ptr和它一起工作。
2025-03-04 10:45:21
513
原创 C++中unique_ptr的实现
在C++中,为了防止内存泄漏和野指针的产生,创建了智能指针,而unique_ptr便是其中一种,这个产物本质上就是让指针可以像对象一样使用,而这个指针的缺点就是只能够指向同一个空间一次,而不可以重复指向同一个空间,原因就是防止析构时发生混乱和错误。
2025-03-03 19:19:40
817
原创 DDoS攻击的介绍和防治
DDoS攻击:dos是服务器拒绝提供服务的意思,最前面的D是分布式的意思,所以说这个大概可以理解为分布式的机器攻击服务器,占用服务器资源,使得服务器拒绝提供服务的一种攻击手段,虽然原理简单,但是攻击的成本低,效果明显,危害大。
2025-03-03 16:57:05
1057
原创 C++中三种常见的智能指针
这类智能指针的作用是当你的指针变量离开对应的作用域范围时,就会自动释放指针指向的空间,这样就使得你不需要关心你主动申请的这块空间是否没有主动释放,例如new,malloc等申请的空间,主要因为还是因为他们本质上是一个变量,当离开作用域时,就会被销毁,调用析构函数,此时自然而然就会将空间释放。
2025-02-06 19:30:00
539
原创 使用C++构建一个优先级队列
优先级队列是一种特殊的队列数据结构,它是队列,但又不完全是,因为它要将装载的数据进行优先级排序,找到一个最大或者最小优先级的元素,下一次出队列的元素就是这个元素,所以说它不完全是一个队列,优先级队列广泛应用于任务调度、资源分配、事件处理、Dijkstra算法、A*搜索算法等领域。
2025-02-05 19:32:19
656
原创 使用C++实现vector
vector是C++中的一个常用的STL容器,它提供了一个动态数组的实现,可以进行任意添加,删除数据的操作,并且内置了多种函数,使得用起来非常方便,但是为了更好的使用vector,我们也应该了解这个容器的设计和实现。
2025-02-05 13:56:49
422
原创 Linux下使用C++设计线程池
线程池是一种用于管理和复用线程的机制,它通过预先创建一定数量的线程,并将它们放入一个“池”中,从而避免频繁创建和销毁线程带来的性能开销。线程池广泛应用于多线程编程中,尤其在高并发场景下,能够显著提高系统的性能和资源利用率。线程池的基本概念1. 线程池的作用提高性能:线程的创建和销毁是相对耗时的操作。线程池通过复用线程,减少了线程的创建和销毁次数,从而提高了系统的性能。资源管理:线程池可以限制同时运行的线程数量,避免系统资源被过度消耗。例如,过多的线程可能会导致系统频繁切换上下文,降低性能。简化线程管理。
2025-02-03 17:16:59
1198
原创 stack的实现(C++)
我个人的理解中stack是一个先进后出的一个容器,那么对与这个容器的对应数据结构肯定就是顺序表比较好,因为顺序表更加适合尾部的删除和插入,它的时间更加短,并且由于要知道头部的索引,所以肯定要管理一个top的索引,并且对于一个stack中,我们也要知道这个容器所占有的空间,所以说也需要维护一个size的大小,这便是具体的思路,如果用链表来进行管理,其实大致也是一样的思路。int top;int size;
2025-01-10 16:19:28
324
原创 双向列表的实现(C++)
主要是一个空间存储一个数值,然后为了索引后面的数据单元和前面的数据单元,所以在每个空间里面还要存储前面和后面数据单元的指针,就形成了每个数据单元后面就是要管理的是双向列表的头结点和尾节点,方便实现后面的头插和尾插这些就是一个双向列表的一个整体逻辑。
2025-01-09 21:39:58
913
原创 C++中的String的实现
在C++中,我们使用String类型的变量,是一种面向对象的思想,主要是和char字符串相比较而言,用起来更加方便,而主要方便的原因就在于对象中内嵌了很多函数,所以说,实现String的本质就是将char*字符串进行管理,并且对应的增加函数和重载符号。
2025-01-09 19:34:40
886
原创 http报头解析
http报文主要有两类是常见的,第一类是请求报文,第二类是响应报文,每个报头除了第一行,都是采用键值对进行传输数据,请求报文的第一行主要包括http方法(GET,PUT, POST),请求资源的url,http协议版本。响应报文第一行是状态行,它包括http协议版本,状态码(200表示成功,404表示没有找到等),状态消息(如OK,Not found等)请求报文一般是客户端发送给服务端的,表示要请求的资源,响应报文一般是服务端给客户端的,返回对应的资源。
2024-12-27 19:30:00
1084
1
原创 ping指令的实现与icmp协议的讲解
用于在IP主机、路由器之间传递控制消息。这些控制消息用于提供有关网络通信的反馈,比如目的地不可达、时间超过、参数问题等。ICMP报文通常封装在IP数据包中,用于通知发送方网络中发生的问题,以便发送方可以采取适当的行动。
2024-12-27 19:00:00
586
原创 TCP可靠传输机制的实现
滑动窗口是tcp协议中的一个重要概念,滑动窗口是字节为单位,而tcp头部的序列化和确认号也是以字节为单位的,滑动窗口里是含有可以传输的字节的数量(可以传输不是已经传输),而滑动窗口的大小是由接受数据的那一方来进行控制(通过发送报文的形式,tcp头部有一个字段就是滑动窗口的大小),这也是tcp流量控制的基础。
2024-12-26 19:00:00
810
原创 TCP的拥塞控制机制的实现
TCP的拥塞控制机制是一组用于防止网络拥塞和有效利用网络资源的算法和规则。网络拥塞发生在网络中的路由器或链路无法处理通过它们的数据流量时,导致数据包丢失和传输延迟。TCP的拥塞控制机制旨在避免这种情况,确保网络的稳定性和高效性。
2024-12-26 18:00:00
309
原创 tcp的三次握手和四次挥手
1.第一次握手:第一次握手就是客户端发送一条tcp数据包,数据包里面将SYN标志位置为1,选择一个初始序列号J。2.第二次握手:当服务端接收到客户端发来的这条tcp数据包以后,会将SYN标志位置为1,ACK标志位也置为1,表示确认接收到你刚刚发来的这条信息并且也和你建立连接,然后将确认应答号置为J+1,然后也选择一个初始序列号K。
2024-12-25 19:00:00
1427
原创 TCP的流量控制的实现
流量控制机制的益处防止过载:流量控制可以防止发送方发送数据的速度超过接收方处理数据的能力,从而避免接收方的缓冲区溢出。提高资源利用率:通过允许接收方根据其当前的处理能力和可用资源来调整窗口大小,流量控制有助于更有效地利用网络资源。避免数据丢失:如果接收方无法及时处理数据,流量控制可以减少因缓冲区溢出导致的数据丢失。适应不同网络条件:流量控制机制可以根据网络的当前状况(如带宽、延迟和拥塞)动态调整数据传输速率,以适应不同的网络环境。提高传输效率。
2024-12-25 18:00:00
889
原创 ssl/tls加密算法讲解
在我的理解中ssl算法属于是tls算法的父亲,但是由于tls算法比ssl算法优秀很多,所以说现在基本上都使用tls算法,而tls算法的使用情景和我们的日常生活息息相关,比如http协议和https协议,这两个协议的根本区别是http协议采用明文传输,而https协议采用了tls加密算法,采用公钥,私钥,会话秘钥进行加密(公钥/私钥对用于非对称加密,主要用于密钥交换;会话密钥用于对称加密,用于实际的数据传输。),还有vpn协议,也是采用了tls加密。
2024-12-24 22:24:11
625
原创 tcp报头分析
面向连接:TCP是面向连接的协议,这意味着在数据传输开始之前,必须在通信双方之间建立一个连接。可靠性:TCP通过使用确认和重传机制确保数据包的可靠传输。如果数据包丢失或损坏,接收方会要求发送方重新发送。有序性:TCP保证数据包按照发送的顺序到达接收方。它使用序列号来确保数据包的顺序,并在接收时重新组装。流量控制:TCP使用窗口大小来控制数据流,防止发送方发送数据过快,导致接收方处理不过来。拥塞控制:TCP能够检测网络拥塞并相应地调整数据传输速率,以避免网络过载。全双工通信。
2024-12-24 19:00:00
386
原创 udp协议解析
长度:UDP数据报的长度,包括UDP头部和UDP数据校验和:用于检测UDP数据报在传输过程中是否出现错误源端口号:发送方程序的端口号目的端口号:接收方程序的端口号无连接服务:UDP不建立连接,每个数据包(用户数据报)独立发送,不需要建立连接。不可靠性:UDP不保证数据包的顺序、完整性或可靠性。数据包可能会丢失、重复或乱序到达。校验和:UDP提供可选的校验和功能,用于检测数据在传输过程中是否出现错误。 面向报文:UDP是面向报文的,发送方的UDP对应用程序交下来的报文,在添加了首部后就向下交付给IP层,不进行
2024-12-23 19:00:00
360
原创 8086下的中断调用过程
中断分为软件中断和硬件中断,主要作用都是让CPU停止执行当前程序,转而调转到执行对应的中断服务程序的过程,而我个人理解硬件中断就像是被迫去执行对应的中断服务程序,这种情况一般是系统出现了一定的问题,而软件中断一般是个人在程序中所调用的中断程序,让程序去执行我们选中的中断服务程序,比如显示,输入等。
2024-12-22 19:00:00
402
原创 IP地址格式解析(ipv4)
IP协议是一种无连接的不可靠协议,IP地址主要可以分为以下几种内网IP,外网IP(私有地址和公有地址),特殊用途的地址,子网划分这几类知识点。首先,IP地址是在IP协议传输中确定位置的地址,ipv4是由32个二进制位组成的,其中的不同部分可能有着不同的含义(因为子网掩码的存在)适用于需要大量主机的网络,比如互联网的核心服务提供商。适合中等规模的企业或组织。非常适合小型网络,比如家庭或小企业。常用于组播应用,比如视频会议、IPTV。主要用于科研和测试,普通设备无法使用。
2024-12-22 19:00:00
730
原创 汇编语言下的标志位和跳转指令(8086)
在汇编语言中,所有的标志位都存放在flags寄存器,寄存器的每一位都代表不同的标志位在我个人的理解中,感觉主要是前面四个标志位用的比较多,后面四个标志位没有如何使用。
2024-12-21 15:47:41
604
原创 汇编语言中的寄存器(8086)
AX ,BX,CX, DX,这四个寄存器在操作中可以存放各种类型的数据,但是他们存放的数据都有一定的规范 ,当我们使用loop指令时,他的循环次数受到CX里面数据的影响,CX里面存了什么数,就循环多少次,每循环一次又会将CX里面的值减一,当我们使用MUL和DIV指令时,他们都是单操作数,这个时候就有很多人疑惑了,乘除不应该是双操作数吗,但是系统的处理是在这两个指令后面一般放BX,BX里面的是除数,而被除数在AX里面,最后的商放在AX里面,余数放在BX里面,还有当我们使用一些系统调用时,也会有类似的情况。
2024-12-21 14:59:12
1128
原创 集线器,交换机,路由器的职责,区别,工作层级
集线器:工作在物理层,广播所有端口,不识别MAC地址。交换机:工作在数据链路层,根据MAC地址转发数据包,隔离冲突域。路由器:工作在网络层,根据IP地址转发数据包,连接和管理不同网络。
2024-12-15 18:00:00
720
原创 mac地址,IP地址和arp协议
Mac地址是一种位于网络设备(网卡,手机,路由器等)上面的地址,全球唯一,是在局域网通信时进行寻找的标志,确保在局域网中消息可以发送到对应设备上,由12位16进制数构成,也因为如此大的表示范围,所以可以不像ipv4地址一样需要考虑公网地址复用的问题,位于数字链路层工作。
2024-12-15 12:23:38
481
原创 内网穿透讲解
内网穿透是一种网络技术,它允许外网或者其他局域网的用户来访问这个局域网的服务器资源,让资源的利用率更高,更加灵活,但是也要确保网络安全。
2024-12-14 19:38:47
326
原创 DNS域名解析协议
这个首先我们要知道我们访问一个网站主要还是通过他的IP地址加上端口号进行访问,但是我们会发现有些比较大型的网站是没有直接使用IP地址加上端口号进行访问的,比如www.baidu.com,我们可以直接通过这个域名就访问到百度的网址,这是什么原因呢?这就是因为我们在访问这个字符串时,浏览器发现这个字符串就是一个域名,于是就是将字符串转换成了对应的IP地址加上端口号,就完成了访问,而将字符串转换成IP地址的规则就是DNS域名解析协议。
2024-12-14 17:04:21
827
原创 NAT网络地址转化技术
NAT技术是一种将自己内网的多个私有IP地址转换为一个公网IP进行访问互联网的一项技术,这个技术主要是用来解决IPv4地址不够的问题。
2024-12-14 16:34:42
386
原创 VPN技术讲解
个人理解的VPN是一种加密机制和隐藏自己真实IP地址去访问特定服务器的一种技术,你要使用VPN技术肯定要有一台服务器为你提供VPN服务,然后这台服务器的IP就会代替你的IP去访问对应的服务器,如果是在公司进行办公,那么通常公司也会有一个VPN服务器,这个服务器会检测你发的消息是否是合法的,也就是是不是我们的人,然后检查你的消息是不是被更改过的,如果都没有,那么你也就可以在家里就可以访问公司的数据,并且其中VPN也会对你的数据进行加密,使得你的数据不会泄漏。
2024-12-10 22:21:26
320
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人