自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【C++算法】70.队列+宽搜_N 叉树的层序遍历

然后出根节点1,入孩子节点2,3,4,然后统计根节点的孩子节点有3个。然后出2,入2的孩子节点5,6…直到3个孩子都出来。此时剩下来的4个元素就是最后一层节点。使用队列层序遍历就可以了。

2025-05-20 19:53:43 386

原创 【C++算法】69.栈_验证栈序列

直接用栈来验证栈序列。

2025-05-20 19:52:43 393

原创 【C++算法】68.栈_字符串解码

拿出来,就变成空串了,所以有个细节就是字符串的栈里面要先放入一个空串。,就直接放到栈顶元素的后面,因为没有右括号就不需要重复。然后就遇到第一个右括号了,把两个栈的栈顶拿出来,接着把bcbc放到原来栈顶元素的后面。两个栈,一个放字符串一个放数字。

2025-05-20 19:51:52 228

原创 【Linux】49.高级IO(3)

如果服务端写的代码是阻塞式的read, 并且一次只 read 1k 数据的话(read不能保证一次就把所有的数据都读出来,参考 man 手册的说明, 可能被信号打断), 剩下的9k数据就会待在缓冲区中.这种说法是不准确的. 我们定义的struct epoll_event是我们在用户空间中分配好的内存. 势必还是需要将内核的数据拷贝到这个用户空间的内存中的.epoll的高性能, 是有一定的特定场景的. 如果场景选择的不适宜, epoll的性能可能适得其反.另一方面, ET 的代码复杂程度更高了.

2025-05-20 19:47:09 997

原创 【Linux】48.高级IO(2)

它是在2.5.44内核中被引进的(epoll(4) is a new API introduced in Linux kernel 2.5.44)fdset的方式,poll使用一个pollfd不同与 的指针实现 select.使用三个位图来表示三个。它几乎具备了之前所说的一切优点,被公认为Linux2.6下性能最好的多路。按照man手册的说法: 是为处理大批量句柄而作了改进的poll.收集在epoll监控的事件中已经发送的事件.创建一个epoll的句柄.epoll的事件注册函数.

2025-05-20 19:45:26 1348

原创 【Linux】47.高级IO(1)

理解select模型的关键在于理解fd_set,为说明方便,取fd_set长度为1字节,fd_set中的每一bit可以对应一个文件描述符fd。任何IO过程中, 都包含两个步骤. 第一是等待, 第二是拷贝. 而且在实际的应用场景中, 等待消耗的时间往往都远远高于拷贝的时间. 让IO更高效, 最核心的办法就是让等待的时间尽量少。另外, 我们回忆在讲多进程多线程的时候, 也提到同步和互斥. 这里的同步通信和进程之间的同步是完全不想干的概念.(4)执行select(6,&set,0,0,0)阻塞等待。

2025-04-22 19:19:03 1001

原创 【Linux】46.网络基础(3.3)

主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称.域名使用 . 连接com: 一级域名. 表示这是一个企业域名. 同级的还有 “net”(网络提供商), “org”(非盈利组织) 等.baidu: 二级域名, 公司名.www: 只是一种习惯用法. 之前人们在使用域名时, 往往命名成类似于这样的格式, 来表示主机支持的协议.数据链路层数据链路层的作用: 两个设备(同一种数据链路节点)之间进行传递数据以太网是一种技术标准;

2025-04-22 19:18:00 1080

原创 【Linux】45.网络基础(3.2)

虽然我们在这里介绍ARP协议, 但是需要强调, ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议;MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产生的限制.使用ifconfig命令, 即可查看ip地址, mac地址, 和MTU;由于数据链路层MTU的限制, 对于较大的IP数据包要进行分包.ARP协议建立了主机 IP地址 和 MAC地址 的映射关系.对比理解 “数据链路层” 和 “网络层”还是 [唐僧例子之白龙马]MSS和MTU的关系。

2025-04-21 19:10:08 1141

原创 【Linux】44.网络基础(3.1)

8位服务类型(Type Of Service): 3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个. 对于ssh/telnet这样的应用程序, 最小延时比较重要;我们知道, IP地址(IPv4)是一个4字节32位的正整数. 那么一共只有 2的32次方 个IP地址, 大概是43亿左右. 而TCP/IP协议规定, 每个主机都需要有一个IP地址.节点: 主机和路由器的统称;

2025-04-21 19:09:07 877

原创 【Linux】43.网络基础(2.5)

客户端状态正常, 但是服务器端出现了 SYN_RECV 状态, 而不是 ESTABLISHED 状态。此时启动 3 个客户端同时连接服务器, 用 netstat 查看服务器状态, 一切正常.全连接队列满了的时候, 就无法继续让当前连接的状态进入 established 状态了.对于服务器, listen 的第二个参数设置为 2, 并且不调用 accept。这个队列的长度通过上述实验可知, 是 listen 的第二个参数 + 1.但是启动第四个客户端时, 发现服务器对于第四个连接的状态存在问题了。

2025-04-19 15:20:17 828

原创 【C++算法】67.栈_基本计算器 II

表达式求值,一般是用栈来模拟计算过程。

2025-04-19 15:18:43 356

原创 【C++算法】66.栈_比较含退格的字符串

【代码】【C++算法】66.栈_比较含退格的字符串。

2025-04-19 15:17:24 220

原创 【C++算法】65.栈_删除字符中的所有相邻重复项

元素依次进栈,当进栈元素和栈顶元素一样的时候,就弹出栈顶字符,然后元素继续往后处理。利用string模拟栈。

2025-04-19 15:16:45 163

原创 【C++算法】64.字符串_字符串相乘

现在tmp数组包含了所有位相乘的结果(未处理进位):[15, 22, 13, 4]两个数字的乘积最多有m+n位,但由于未处理进位,所以是m+n-1位。解法二:对解法一的优化:无进位相乘然后相加,最后处理进位。所以 123 × 45 = 5535,这是正确的结果。此时ret = “5355”,表示计算结果的反向存储。解法一:模拟列竖式运算。例如:123x456。

2025-04-19 15:15:51 731

原创 【C++算法】63.字符串_二进制求和

解法:模拟列竖式运算。

2025-04-19 15:15:03 283

原创 【C++算法】62.字符串_最长回文子串

【代码】【C++算法】62.字符串_最长回文子串。

2025-04-16 19:22:56 295

原创 【C++算法】61.字符串_最长公共前缀

先算前两个字符串的最长公共前缀,然后拿这个最长公共前缀和后面一个来比较,得到最长公共前缀。直到比到最后一个字符串。先比较第一列,然后比较第2列,直到有字符串越界,或者有字符不一样,停止。

2025-04-16 19:22:09 437

原创 【C++算法】60.哈希表_字母异位词分组

最后遍历哈希表,把里面的value提取出来。

2025-04-15 14:09:42 446

原创 【C++算法】59.哈希表_存在重复元素 II

处理 nums[0] = 1。处理 nums[1] = 0。处理 nums[2] = 1。处理 nums[3] = 1。

2025-04-15 14:08:38 476

原创 【Linux】42.网络基础(2.4)

在延迟应答的基础上, 我们发现, 很多情况下, 客户端服务器在应用层也是 “一发一收” 的. 意味着客户端给服务器说了 “How are you”, 服务器也会给客户端回一个 “Fine, thank you”;因为网络上有很多的计算机, 可能当前的网络状态就已经比较拥堵. 在不清楚当前网络状态下, 贸然发送大量的数据,是很有可能引起雪上加霜的.TCP引入 慢启动 机制, 先发少量的数据, 探探路, 摸清当前的网络拥堵状态, 再决定按照多大的速度传输数据;大量的丢包, 我们就认为网络拥塞;

2025-04-14 21:16:49 1064

原创 【Linux】41.网络基础(2.3)

MSL是TCP报文的最大生存时间, 因此TIME_WAIT持续存在2MSL的话就能保证在两个传输方向上的尚未被接收或迟到的报文段都已经消失(否则服务器立刻重启, 可能会收到来自上一个进程的迟到的数据, 但是这种数据很可能是错误的);接收端处理数据的速度是有限的. 如果发送端发的太快, 导致接收端的缓冲区被打满, 这个时候如果发送端继续发送,就会造成丢包, 继而引起丢包重传等等一系列连锁反应.刚才我们讨论了确认应答策略, 对每一个发送的数据段, 都要给一个ACK确认应答. 收到ACK后再发送下一个数据段。

2025-04-14 21:15:23 1164

原创 【C++算法】58.哈希表_存在重复元素 I

在哈希表里添加代码,如果元素已存在于集合中,说明找到了重复元素。

2025-04-13 13:24:31 392

原创 【C++算法】57.哈希表_判断是否互为字符重排

找出字符串的全排序,然后比较是否相同(指数级别的,太恐怖了)统计每个字符出现的次数。次数相同就是字符重排。这里是用数组模拟哈希表,用容器的话会麻烦一点。

2025-04-13 13:23:40 280

原创 【C++算法】56.哈希表_两数之和

哈希表是什么?存储数据的容器有啥用?“快速”查找某个元素。O(1)什么时候用?频繁的查找某一个数的时候怎么用?容器(哈希表)用数组模拟简易哈希表字符串中的字符数据范围很小的时候(int:1~107)但是出现(-103~103)就不建议用了。

2025-04-12 15:17:14 418

原创 【C++算法】55.链表_K个一组翻转链表

【代码】【C++算法】55.链表_K个一组翻转链表。

2025-04-12 15:16:21 307

原创 【C++算法】54.链表_合并 K 个升序链表

先把其中的两个链表有序合并,然后把合并后的链表和后面一个链表有序合并,每次合并两个直到结束。节点,哪一个链表的指针取走了就让那个链表指针的后一个位置放进小根堆,直到所有链表指针都指向。个指针,然后把每个链表的第一个指针放入小根堆里面,取走堆顶元素放入。每个链表的平均长度为n,有k个链表,时间复杂度。解法二:利用优先级队列做优化。解法三:归并排序,递归。解法三(递归/分治)

2025-04-10 23:30:53 350

原创 【C++算法】53.链表_重排链表

【代码】【C++算法】53.链表_重排链表。

2025-04-10 23:30:13 302

原创 【Linux】40.网络基础(2.2)

如果发送端调用一次sendto, 发送100个字节, 那么接收端也必须调用对应的一次recvfrom, 接收100个字节;在TCP/IP协议中, 用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信(可以通过netstat -n查看);我们注意到, UDP协议首部中有一个16位的最大长度. 也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部)下一次你从哪里开始发。应用层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并;

2025-04-09 20:59:17 1888

原创 【Linux】39.一个基础的HTTP Web服务器

提供Web服务,响应客户端(浏览器)的HTTP请求。网页服务器(HttpServer.hpp)服务器启动器(HttpServer.cc)支持静态文件服务(如HTML、图片等)网络通信器(Socket.hpp)日志记录器(Log.hpp)

2025-04-09 20:57:57 922 3

原创 【C++算法】52.链表_两两交换链表中的节点

【代码】【C++算法】52.链表_两两交换链表中的节点。

2025-04-08 22:00:11 325

原创 【C++算法】51.链表_两数相加

画图 --> 直观,形象,便于理解引入虚拟头节点便于处理边界情况方便我们对链表进行操作不要吝啬空间,大胆去定义变量快慢双指针判断链表中是否有环链表中环的入口找链表中倒数第n个结点。

2025-04-08 21:59:14 309

原创 【C++算法】50.分治_归并_翻转对

493. 翻转对最后合并两个有序数组。降序版本升序版本图解例如:

2025-04-07 21:50:18 1115

原创 【C++算法】49.分治_归并_计算右侧小于当前元素的个数

6.处理剩余元素while(cur2 <= right)当前元素的后面,有多少个比我小。(结果数组,初始全为0)这些是单个元素,不再划分。这些是单个元素,不再划分。

2025-04-07 21:48:43 419

原创 【Linux】38.网络基础(2.1)

最常见的状态码, 比如 200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定向), 504(Bad Gateway)协议是一种 “约定”。无论我们采用方案一, 还是方案二, 还是其他的方案, 只要保证, 一端发送时构造的数据, 在另一端能够正确的进行解析, 就是ok的。但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输协议)就是其中之一。虽然我们说, 应用层协议是我们程序猿自己定的。

2025-03-10 19:40:18 1105

原创 【Linux】37.网络版本计算器

主要的时序特点是采用了经典的多进程并发服务器模型,每个客户端连接由独立的子进程处理,保证了请求处理的隔离性和可靠性。定义客户端服务器间通信协议,处理消息的序列化和反序列化。封装底层Socket网络通信功能。实现服务器程序,处理客户端请求。将进程转换为守护进程的工具类。实现客户端程序,发送计算请求。实现服务器端的核心计算逻辑。实现TCP服务器的主框架。

2025-03-10 19:38:34 401

原创 【Linux】36.简单的TCP网络程序

这种模块化的结构设计使得程序具有良好的可维护性和扩展性,各个模块之间职责明确,耦合度较低。下面介绍程序中用到的socket API,这些函数都在sys/socket.h中。

2025-03-10 19:37:15 1101

原创 【Linux】35.封装 UdpSocket(2)

/udpserver 8080 // 在8080端口启动服务器。

2025-02-22 23:01:53 1177

原创 【Linux】34.封装 UdpSocket(1)

这实际上是一个简单的远程命令执行系统,允许客户端远程在服务器上执行命令并获取结果。不过需要注意,当前实现没有加入安全机制(如身份验证、命令过滤等),在实际使用中需要添加相应的安全措施。支持多种日志级别(Info、Debug、Warning、Error、Fatal)将客户端发来的命令在服务器端执行,并将执行结果返回给客户端。运行后创建服务器端,客户端运行可以和这个服务器端通信。可以选择日志输出方式(屏幕、单文件、分类文件)UDP服务器 (UdpServer.hpp)UDP客户端 (UdpClient.cc)

2025-02-22 23:00:48 486

原创 【Linux】33.网络基础(1.2)

我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分。如果我们了解了系统,也了解了网络协议栈,我们就会清楚,传输层是属于内核的,那么我们要通过网络协议栈进行通信,必定调用的是传输层提供的系统调用,来进行的网络通信。进程 ID 属于系统概念,技术上也具有唯一性,确实可以用来标识唯一的一个进程,但是这样做,会让系统进程管理和网络强耦合,实际设计的时候,并没有选择这样做。而启动的APP,浏览器都是进程。

2025-02-21 22:03:06 871

原创 【Linux】32.网络基础(1.1)

协议” 是一种约定。计算机之间的传输媒介是光信号和电信号. 通过 “频率” 和 “强弱” 来表示 0 和 1 这样的信息。要想传递各种不同的信息, 就需要约定好双方的数据格式。只要通信的两台主机, 约定好协议就可以了么?定好协议,但是你用频率表示 01,我用强弱表示 01,就好比我用中国话,你用外国话一样,虽然大家可能遵守的一套通信规则,但是语言不同,即是订好了基本的协议,也是无法正常通信的。所以,完善的协议,需要更多更细致的规定,并让参与的人都要遵守。

2025-02-21 22:01:32 1026

空空如也

空空如也

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

TA关注的人

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