自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++ Json-Rpc框架-3项目实现(1)(1.其它函数实现2.消息类型字段定义3.消息Message/通信Muduo抽象具象实现)

2.Json序列化和反序列化工具序列化反序列化二.项⽬消息类型字段信息定义三.消息/通信抽象实现2.缓冲区抽象类协议抽象类连接抽象类服务端抽象类6.客户端抽象类四.消息/通信具象层实现1.BaseMessage消息具体实现JsonRequest基类Response类型实现JsonResponse基类:消息对象的生产工厂

2025-03-24 16:34:21 695

原创 C++ Json-Rpc框架-2框架(服务端模块 客户端模块 框架设计)

本质上来讲,我们要实现的rpc(远端调⽤)思想上并不复杂,甚⾄可以说是简单,其实就是客⼾端想要完成某个任务的处理,但是这个处理的过程并不⾃⼰来完成,⽽是,将请求发送到服务器上,让服务器来帮其完成处理过程,并返回结果,客⼾端拿到结果后返回。然⽽上图的模型中,是⼀种多对⼀或⼀对⼀的关系,,且其服务端的负载也会较⾼,因此在rpc实现中,我们不仅要实现其基本功能,还要再进⼀步,分布式架构:简单理解就是由,这些节点通常指的是服务器,,通过协同⼯作解决⾼并发的问题,提⾼系统扩展性和可⽤性。

2025-03-21 15:52:37 1042

原创 C++ Json-Rpc框架-1准备工作(JsonCpp Muduo 异步操作)

Json 是⼀种数据交换格式,它采⽤完全独⽴于编程语⾔的⽂本格式来存储和表⽰数据。如: 我们想表⽰⼀个同学的学⽣信息• C 代码表⽰• Json 表⽰"姓名" : "xx","年龄" : 18,"成绩" : [88.5, 99, 58],"爱好" :{"书籍" : "西游记","运动" : "打篮球"Json 的数据类型包括对象,数组,字符串,数字等。• 对象:使⽤花括号 {} 括起来的表⽰⼀个对象• 数组:使⽤中括号 [] 括起来的表⽰⼀个数组。

2025-03-20 17:44:34 936

原创 多路转接 select/poll epoll

poll 解决了 select 的 FD 数量限制问题,但仍然存在 O(N) 遍历的问题。 epoll 通过事件驱动机制,避免遍历所有 FD,提高了 epoll_wait() 的效率,适用于高并发。epoll 采用 ET 模式,可以减少 epoll_wait() 调用次数,提高吞吐量,但需要开发者正确处理 recv() / send()。

2025-03-18 15:57:53 675

原创 TCP 全连接队列 内核层理解socket

参数表示。那什么是全连接队列呢?accept()accept()accept()也就是说我们访问服务器会由内核自动进行3次握手,,服务端再。而listen的,如果服务器来不及调用accept()处理连接,连接会堆积在超过最大连接长度,再进行连接就会三次握手失败。所以全连接队列本质就是一种backlog不能太长也不能太短。1.太短,可能丢失大量连接(客户端需要重试,增加网络负担)。2.太长,一方面会让用户,另一方面会。

2025-03-14 12:30:00 1118 1

原创 五种 IO 模型 (异步IO同步IO)

任何 IO 过程中, 都包含两个步骤. 第一是等待, 第二是拷贝.IO=等待+拷贝而且在实际的应用场景中, 等待消耗的时间往往都远远高于拷贝的时间. 让 IO 更高效, 最核心的办法就是让等待的时间尽量少.即单位时间内,IO等待时间的比重越低效率越高。I/O 模型等待方式等待时间长短CPU 利用率适用场景阻塞 I/O(Blocking I/O)等待recv()返回长(进程完全被阻塞)低(进程无法做其他任务)小规模应用非阻塞 I/O(Non-blocking I/O)recv()轮询数据中。

2025-03-12 17:22:29 644

原创 NAT NAPT

通过这种方式,正向代理可以实现多种功能,如提高访问速度、隐藏客户端身份、实施访问控制等。工作原理客户端将请求发送给正向代理服务器。正向代理服务器接收请求,并根据配置进行处理,如缓存查找、内容过滤等。正向代理服务器将处理后的请求转发给目标服务器。目标服务器处理请求,并将响应返回给正向代理服务器。正向代理服务器将响应返回给客户端。功能特点。

2025-03-10 18:11:43 746

原创 数据链路层 (以太帧 MAC地址 ARP协议)

"以太网" 不是一种具体的网络, 而是一种技术标准;既包含了数据链路层的内容, 也包含了一些物理层的内容.以太网是当前应用最广泛的局域网技术;和以太网并列的还有令牌环网, 无线LAN 等;

2025-03-10 13:30:00 1903

原创 网络层 IP协议

通过IP协议能把数据送到目标主机,

2025-03-09 13:30:00 947

原创 UDP协议 TCP协议(格式 超时重传 滑动窗口 拥塞控制...)

是。

2025-03-07 13:05:05 1212 1

原创 Linux网络_应用层自定义协议与序列化_守护进程

比如说我们传一个结构体data,里面包含 int x,char oper ,int y。我们不要一个一个传,可以把成员元素整合成一个字符串,再传。这个就是序列化但当我们获取到了这个字符串,怎么获取到里面包含的消息呢?我们可以自己进行规定,每个元素间用空格进行隔开,依次进行获取。根据制定的规则进行解包,获取元素,就是反序列化。序列化: 你将结构体的各个成员转换成某种格式的字符串,以便传输或存储。例如,使用空格分隔成员。反序列化: 接收端根据预定的规则解析字符串,并将其恢复为原始数据结构。

2025-03-03 19:42:16 606

原创 Linux网络_套接字_UDP网络_TCP网络

AF_INET网络 AF_UNIX本地AF_INETAF_INET6AF_UNIXAF_LOCALAF_PACKETAF_NETLINKSOCK_DGRAMSOCK_RAW0返回值-1errno错误代码。

2025-01-15 15:35:40 1131 1

原创 排序算法的实现(插入,希尔,选择,冒泡,堆排,快排)

对n个元素进行选择排序,我们可以遍历一轮找出最大值放在末尾,直到循环n-1次。为了提高效率,我们可以同时找出最大值和最小值,分别放在末尾和开头。

2025-01-07 18:24:04 747 2

原创 滑动窗口_⻓度最⼩的⼦数组&&⽆重复字符的最⻓⼦串&&将x减到0的最⼩操作数

思路一:两个指针,p1p2同时指向第一个元素。sum+=p2,如果sum

2025-01-07 17:55:01 342

原创 链表_逆序链表_合并链表

2.重复n次,逆序k长度的链表1.cur指向原链表中需要插入到新链表的结点2.prev进行头插时要用到的节点3.tmp记录下一次要插入位置的使用的结点(cur进入循环前的位置)(新链表的尾结点)从每条链表中取第一个元素(链表最小值),再从这些节点中选出一个最小的插入到新链表中。把s->next=nullptr断开链表后,新建head2新的空头节点,遍历右侧链表进行头插,完成逆序。我们可以再新建一个链表,进行尾插,第一次取左侧链表的结点,第二次取右侧链表节点,直到两个链表节点都取完。

2025-01-07 17:15:21 969

原创 floodfill算法_dfs

对靠近Pac洋的格子dfs进行标记,还要对靠近Atl洋的格子dfs进行标记。边界情况:如果初始位置值结束目标值,那在dfs过程中不会改值,就会出现走重复路径的情况。每遍历到一个1且没有标记过,就从该位置进行dfs,进入dfs就标记并记录当前面积,dfs结束获取这一块1的面积。1.看临边是Pac洋的格子从低到高走,四周的格子比它大就可以走。2.看临边是Atl洋的格子从低到高走,四周的格子比它大就可以走。(用红色标记走过的格子)每个格子上都有水,水从高处流向低处,问那个格子的水可以流向太平洋和大西洋。

2025-01-06 16:33:36 402

原创 综合练习dfs_2(N皇后 解数独 单词搜索)

一共有9个格子,我们不要考虑一个格子一个格子进行考虑,第一个Q放在第一行的第一个格子,第二个Q放在第一行的第二个格子。row[9][10] 判断行 [9]9行 [10]该行内是否存在对应数 eg.row[0][1]=true 该行第一个行中有1。gird[3][3][10] 把9个格子分成三份 下标0 1 2 /3都对应0,[10]用来统计每个大格子中是否存在对应的数。,n=3就可以分为3中情况,再分别以这3种情况再进行划分,第二行中Q可以放在哪里。,n=3有几条正对角线,可看出5条(n*2-1)。

2025-01-05 16:32:11 949

原创 综合练习dfs_1

递归返回的路径字符数肯定是n*2的,我们直接递归枚举出所有的情况,再进行剪枝剪去不能组成括号的情况:1.左括号数不能大于n 2.在递归过程中右括号的数不能大于左括号的数。因为不能出现重复的eg.[1,2] [2,1],所以在递归时要进行剪枝 eg.2_ _ _选数时不能选自身 也不能选前面的数,只能选后面的数。eg.[1,1,1,2] 看似可以选4个数,但为了不重复第一个数只能选1_ _ _ 2_ _ _。当我们选了第一个1,第二个1第三个1就不能选了,因为以第2 3个1开头的数和第一个1都是值一样的。

2025-01-04 16:23:58 902

原创 穷举vs暴搜vs深搜vs回溯vs剪枝_全排列_子集(重点)

递归解决:一开始选一个数,递归进入下一层再选一个新的数,直到到最后一个数。定义一个全局的path数组记录一条路径的数,再定义一个全局的二维数组re记录每条路径。方法二就是根据选数的个数来找,选0个数的组合 1个数的组合 2个数的组合...当我们选完一个数后,选下一个数时,只能选该数在nums数组后面的数。传参数pos标记该数在nums数组中的位置,for循环遍历它后面的数。每一次进入dfs函数时,当前的path都是一次结果,存入直接返回。这样我们就画出了一个二叉树,遍历该二叉树,叶子节点就是结果。

2024-12-29 15:17:39 623

原创 二叉树的深搜_求根节点到叶节点数字之和_验证二叉搜索树_二叉树的所有路径

深度遍历二叉树时,用一个path字符串来记录经过的结点:不是叶子节点加val->,叶子节点加val,并返回。我们定义一个全局的变量prve记录上一个遍历数的大小,进行中序遍历,如果prve不是单调变化的,就说明它不是二叉搜索树。像上述左右子树+当前节点val==0,3个节点val都为0,根据上面的判断从叶子节点开始删也可以一个一个删除。每遍历一个节点就累加当前节点的val,如果为叶子节点就直接返回,有孩子继续递归累加数字。在遍历的过程中,维护一个当前路径列表,用来存储从根节点到当前节点的路径。

2024-12-28 20:11:36 558

原创 递归_汉诺塔_链表_快速求幂

逆序整个链表就可以分为逆转诺干个两个节点 可以用递归 dfs完成后面第一个节点后面所有节点的逆转,再把第一个 第二个节点逆转 并让第一个节点指向空就可以了。但-2^31 <= n <= 2^31-1 如果n==-2^31 它变为正数int会存存不下,所以n要用long long。如果n是偶数x^n=x^(n/2)*x^(n/2) 是奇数x^n=x^(n/2)*x^(n/2)*x。我们只需要处理好前两个节点的交换 剩下节点交换交给dfs并返回交换完成的头节点。一直找两链表头节点较小的节点 就可以用递归。

2024-12-27 17:37:50 301

原创 BFS 解决拓扑排序_ 课程表_火星词典

拓扑排序的基本要求有向无环图(DAG):拓扑排序只适用于没有环的有向图。如果图中有环,无法进行拓扑排序。唯一性:对于一个DAG,拓扑排序不一定是唯一的,可能有多种有效的拓扑排序结果。把操作看成结点,每个结点都有入度和出度,但每次都只能去入度=0的结点(没有指向它的),把该节点取下来 再看它指向的节点是否入度为0 为0就取下来。一直重复直到没有节点,或者没有入度为0的节点。排序的情况可能不止有一种 只要入度为0就可以取下来。

2024-12-25 21:27:14 769

原创 多源 BFS最短路问题_矩阵

我们要根据isWater数组推出最大的高度的数组,一开始我们只知道下标val值==1的海洋的高度是0,根据这个就可以推出海洋周围陆地的高度,因为高度差最大1且求最大高度的数组,海洋周围的陆地最大为1,再根据1再推2...先对四周进行bfs把为1的陆地标记或者直接设置为0,最后再遍历一次二维数组,把没有标记的1累计,返回累计的陆地面积。这道题和之前做的被淹没的陆地一样,只不过上到题是算还剩几块陆地,这个算剩余陆地的面积。之前我们都是做的一个点到另一个点的最短路径问题,现在有多个点,找它们到最短路的距离。

2024-12-18 16:30:00 335

原创 BFS 解决最短路问题_最短迷宫_基因变化_为高尔夫比赛砍树

用一个队列q存储当前层要遍历的节点,当前层节点全遍历完同时入队下一层要遍历的节点,并记录当前层数。遍历的时候用二维数组map记录遍历的位置,防止不必要的遍历。如下图砍的第一颗树必须是所有val值中最小的,也就是2,我们要求出来[0,0]起始下标到vla=2的下标的最短距离。vector<pair<int,int>>tree sort(tree.begin(),tree.end(),[](){里面实现根据val完成降序};和上一题基本一样,只是两层for循环不同,还有算的是单词的个数,不是变化的次数。

2024-12-17 13:30:00 567

原创 BFS 解决 FloodFill 算法_图像渲染_岛屿数量_被围绕的区域

bfs,广度优先遍历,先以一个点,向四周扩散,再以新扩散的点向四周扩散,直到没有目标点。起始点可以看作根节点,它四周的目标节点就相当于它的孩子,pop根节点 push它的孩子,遍历进入下一层,以此类推,直到队列为空。1.numIslands 函数通过遍历整个网格,每次遇到未访问的陆地 '1',就开始 BFS 搜索并将与之连接的所有陆地标记为已访问。完成后,靠近边界的O块及其连接的O块对应的map都为1。3.map 数组用于记录哪些点已经被访问过,避免重复访问。靠近边界的O块及其连接的O块,不能改。

2024-12-16 12:30:00 201

原创 优先级队列_ 前K个高频单词_数据流的中位数

如果定义成左边多,left==right left+1==right都可以看做平衡,反之left==right+1就不平衡了。3.比较器(比如 std::greater<int>小堆 或 std::less<int>大堆)。1.num<=left.top() || left.empty() 小于左边的最大值 或者 左边没有值 去左边。如果是偶数,左右两部均分。如果是奇数,肯定有一边多1,可以自己定义左边多,也可以定义成右边多。小根堆:堆顶是当前 k 个最大元素中的最小值,所以第 k 大的元素就是堆顶元素。

2024-12-15 12:30:00 953

原创 队列+宽搜_429. N 叉树的层序遍历_二叉树最大宽度

定义一个队列q,将一层的节点入队,并记录节点个数。根据节点的个数,出队列,并将其孩子入队列。出完队列,队列当前剩余节点的个数就是下次出队列的次数。2.知道队列头节点的下标 尾节点的下标 : i尾 - i头 +1 尾两节点的距离就是当前层最长的距离。1.存入队列中的元素类型为pair<TreeNode*,int>,也要把对应节点的下标传过去。入完后再把存有孩子节点的数组t复制到原数组q上,减少数组出队列移动元素的时间。3.算完当前层,再把它们左右孩子入队列,直到队列为空.出队父母节点,入队其孩子节点。

2024-12-14 19:45:18 199

原创 栈_删除字符串中的所有相邻重复项_基本计算器 II_字符串解码

借助栈结构,遍历字符串 放入一个字符前看看是否和栈顶元素相同,相同就出栈栈顶元素,如果为空或者不相等就入栈。遍历结束栈中剩余的字符就是目标结果。1.先用栈存储运算后的结果 char sym记录运算符(因为题目说所有数都是整数,所以sym初始化=+)一个表达式中* / 优先运算,我们先把* / 先运算完,最后再把这些数加起来。看当前sym是什么,我们可以用string来模拟栈,返回时就不用再从栈中获取返回结果。方法二:用两个栈,一个栈记录字符串 一个记录数字。+直接入栈 -取反入栈 *乘栈顶 /除栈顶。

2024-12-13 12:00:00 251

原创 字符串_最长公共前缀_最长回文子串_字符串相乘

tmp代表每一次运算出的结果 "837" "0516" "00294" 把它们加到ret,再reverse翻转,最后把末尾的0除去。奇数aba 取中间点i,left=i right=i left right分别向两边走,如果不相等就不是,直到全遍历完。倒着遍历a b,存在且为1 t++位数和 re+=t%2+'0'除去进位的余数 t/=2进位。1.定义一个数组 tmp[n+m] ,下标0存个位和个位无进制相乘的数,下标1存十位和个位,...(如果乘数有一方==0,那么re字符串就全为0)

2024-12-12 12:53:33 379

原创 哈希表_两数之和_字母异位词分组

a+b=target,遍历数组固定a,在数组中找b。eg.固定a=2,在数组中找7。有什么快速的方法能找到对应的数呢?先遍历一般数组,用哈希表记录所有的数及其下标,再遍历一次数组根据哈希表找对应的数的下标。但这会出现一个问题,如果有两个相同的值怎么办?哈希表中只能存唯一的一个Key。我们应该遍历一次数组,当我们遍历到一个数a时,应该在a数前面找b,没有就把a放入到哈希表中。然后继续下一个数,直到在该数前找到对应的b。两个字符串中每个字母出现的次数必须相同。

2024-12-11 17:26:36 275

原创 分治_归并_归并排序(逆序对)

但cur2向右移,等再找到时,cur2左边的个数就包含的上一次找到的个数,就会重复。我们以降序为基础,cur1固定 cur2++找cur2<cur1,right-cur2+1(cur2右边)的数就是可以和cur1组成逆序对的数,再根据index映射到cur1在原数组的下标。想一想,如果第一次原数组,分为左右部分,左部分的个数=它的左部分+它的右部分+它的一左一右。再把临时数组排好的内容写回原数组。那逆序对的个数=左半部分逆序对的个数+右半部分逆序对的个数+左边取一个数和右边取一个数组成的逆序对的个数。

2024-12-08 18:19:23 965

原创 Linux网络_网络协议_网络传输_网络字节序

TCP/IP 协议的本质是一种解决方案TCP/IP协议和操作系统的关系不同主机的操作系统不同,但可以相互通信,就是因为所有主机的协议栈都是按标志进行相同实现的。传输层最著名的协议TCP 网络层最著名的协议IP而传输层 网络层两层必须实现在内核中,无论OS再怎么不同,这部分都要遵守协议,必须一样。因此,传输层和网络层协议在不同操作系统中确实必须遵循相同的标准,无论操作系统如何实现,它们的核心行为和协议功能应保持一致。问题:主机 B 能识别 data,并且准确提取 a=10,b=20,c=30 吗?

2024-12-01 17:53:08 978

原创 分治_快排_排序数组_第k个最值数_前K个最值数

先在数组中随机取一个数当作key,以key把数组分为三个部分,左边小于key的部分,中间等于key的部分,右边大于key的部分。要找次大的元素就把第一个元素和最后一个元素交换,并以刚交换的第一个元素为父母节点向下调整(传入的元素个数-1 ),再找出其中最大的元素。在快排中我们根据key,把数组分为>key ==key

2024-11-28 11:45:00 557

原创 Linux线程_sem信号量_线程安全_饿汉 懒汉实现方式

1。

2024-11-27 18:42:07 1066

原创 Linux线程_线程互斥_线程同步

互斥锁和条件变量怎么搭配使用呢?先讲一个场景,生产消费者模型。有多个工厂向超市放资源,超市存入资源且大小有限,消费者从超市拿资源。可以理解为有多个线程向临界区存入资源,有多个线程从临界区取资源。在此过程中要保证临界区的安全,还有保证高效。1.生产者和生产者 两个生产者可以同时进入超市吗?不能,如果超市刚好差一个资源就满,那么就不能保证资源安全。所以生产者和生产者关系为:互斥2.消费者和消费者 两个消费者可以同时进入超市吗?不能,超市有只有一个资源的情况所以消费者和消费者关系为:互斥。

2024-11-23 19:51:36 1035

原创 Linux线程_线程控制_线程库

(并不是绝对访问不到,通过全局指针指向a线程栈上定义的变量,b线程也可以访问到,但不建议,有可能生命周期结束 访问到野指针)

2024-11-23 16:23:29 806

原创 模拟_6. N 字形变换_1419. 数青蛙

1.遍历给的混合字符串 如果是roak其中一个,就看前驱字符(o的前驱字符r r的前驱c)是否存在,存在前驱字符--,当前字符++。croakcroak 当遇到第二个c时,此时除了k为1 其它字符均为0,如果k不--,那么最后k存入的值就为2。3.看最后一个字符k前面的字符是否仍有存入的数,有就代表有不完整的croak,返回-1。>0表示已经有完整的croak,哈希表最后一个字符k--,当前字符c++我们用数组模拟哈希表,下标是字符在字符串的位置,记录出现的次数。2.如果是c,看哈希表k存入的数是否>0。

2024-11-20 20:20:10 266

原创 位运算_消失的两个数字

1~N中缺失了2个数,我们把这些数和1~N完整的数进行异或。得到的结果就是缺失的两个数a,b a^b的结果。这样两部分都可以异或出1个数来。

2024-11-20 18:30:49 301

原创 Linux线程_线程概念

这个虚拟地址是一个字节的地址,如果访问结构体,还要知道结构体大小,再往后继续访问等大小字节的空间。

2024-11-16 18:39:26 603

原创 位运算_判定字符是否唯一

1.先用求和公式算出0~n所有数的和,再减去数组中数的和,剩下的就是缺失的数。0 1为1 0 0为0 1 1为0 和二进制满2进1一样。3.因为不需要统计出现的次数,只关心是否存在,并且

2024-11-11 21:48:49 332

空空如也

空空如也

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

TA关注的人

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