- 博客(319)
- 收藏
- 关注
原创 linux:应用层自定义协议与序列化
协议就是一种规定,在代码上体现为包含了相关字段,序列化与反序列化方法的类/结构体空行是用来区分报头和有效载荷的。
2026-01-30 16:18:48
645
1
原创 linux:线程概念与控制
CR3中存储了当前进程页表目录的物理地址,我们根据虚拟地址高10位查找该虚拟地址所属页表(物理地址 = 页表目录物理地址 + 高10位值*4),页表目录存储的是地址元素,4字节为单位,所以偏移项*4。
2025-12-13 19:57:12
589
2
原创 linux:进程信号
sighanler_t是一个函数指针(返回值为空,参数为int类型)signal函数:用于捕捉对应信号,并让对应设置好的自定义函数执行参数1:信号值 参数2:自定义函数。
2025-12-09 10:00:31
868
原创 linux:动静态库
库的代码不会合并到使用库的源代码中,直接动态链接使用,就像租电脑一样库的代码会合并到库的源代码中,相当于帮我们写了一堆库功能实现进源代码,就像买电脑。
2025-11-23 18:27:14
630
原创 linux:Ext系列文件系统
摘要:本文系统介绍了磁盘硬件结构、存储原理及文件系统管理。首先阐述了磁盘的机械特性及其在企业存储中的应用,详细解析了磁盘的物理结构(磁头、盘片、主轴)和CHS定位方式,并说明LBA地址转换逻辑。其次,深入探讨了文件系统架构,包括块组管理、inode机制、文件操作流程及目录结构实现原理。最后对比了软硬链接的区别与应用场景,分析了硬链接对目录的限制原因。全文从硬件到软件层面完整呈现了磁盘存储系统的运作机制,为理解计算机数据存储提供了全面的技术视角。(149字)
2025-11-17 09:36:40
1078
原创 基础算法(上)
根据题目给出的公式或解法模拟解决题目题目介绍较长,且关于规则叙述较多时仔细看题目规则,并模拟出题目给的解题方法题目中细节较多,可能的特殊情况也要思考到位2.
2025-11-11 10:26:24
741
原创 linux:io基础
当我们打开文件时,磁盘就会将文件属性和文件内容分别加载出来,然后file结构体就可以用指针指向对应的加载空间,当我们需要使用write进行文件内容写入时,直接将用户定义的缓冲区的内容拷贝到文件内核缓冲区,然后等待操作系统将文件内核缓冲区的内容同步给磁盘空间。
2025-11-06 19:34:57
764
原创 算法题(255):无向图的最小环问题
由于我们的floyd算法已经计算出了考虑1~k-1节点时,从i到j的最短路径和f[i][j],所以只要再加上i到k的和k到j的距离就可以得出所有该类环,不断min维护出最小值即可。由于环的节点不能重复,所以我们寻找环的第二层循环j不能初始化为1,而是要初始化为i+1,这样才不会和i重复。由于我们的代码中有f[i][j] + e[i][k] + e[j][k],这种情况有可能出现三个正无穷相加。节点编号最高值为3,节点编号最高值为4,节点编号最高值为5........节点编号最高值为n。
2025-11-05 18:34:16
285
原创 算法题(253):岛上寻宝
然后我们最后走的路径(1-2-1-4-3-5),我们可以提取出1-2-3-5路径出来,这种路径也是满足题意的。题目中要求的找到宝藏的规定路线其实不是说这个路径是完整路径,因为题目说了不一定相邻。所以其实我们就是需要找出每段规定路径的最小危险指数(多源最短路),从而得到最终结果。本题需要在保证按照规定路线走过岛(找到宝藏前提)下,危险指数之和值最小。
2025-11-03 18:53:38
276
原创 算法题(252):Floyd
默认初始化为正无穷,这可以让所有节点默认为不连接,然后后续再修改对角线上的值为0(自己走到自己的路径距离),以及在录入数据时给有边直接相连的节点修改距离即可。此时我们可以将路径分为先从i走到k,再从k走到j两段,然后将这两段的最短路径相加就可以求出总的从i经过k走到j的最短路径。由于每次都是使用上一层k的数据,所以我们可以将第一维度k给去掉,只要保证后续填表的时候是从k为1开始逐层填表即可。Floyd算法的核心思想,不断考虑增加可能经过的点,从而最终将考虑所有点的情况都计算出来。
2025-11-02 11:33:03
683
原创 算法题(251):最短路计数
由于某个节点的最短路径dist[i]等于他的有效前驱节点(最短路径走到i位置的节点)的dist值相加,所以我们需要通过搜索方法找到节点的有效前驱节点,而这种搜索方法就是dijkstra算法。题目中特别说明了需要取模,所以我们在进行累加的时候顺便就进行取模操作,最终输出的时候就不用再取模了。当进行松弛操作时,表示当前节点找到了更短的路径,直接将前驱的f值覆盖掉当前节点f值。本题的图是无向无权图,也就是说边是双向可走的,边权都是一样的我们可以记为1。本题需要我们找到从节点1开始到其他节点的最短路径有多少条。
2025-11-01 20:10:59
168
原创 算法题(250):拉进距离
根据题意,本题存在负边权,且可能存在负环,所以dijkstra算法不可使用,而nm又为1e7不算大,所以可以使用bellman_ford算法。如果其中一方有负环,说明他们的距离就是无限接近,输出foreverlove,若两方都没有负环,那么输出他们之间最近的一个距离。我们判断负环的方法是进行n轮松弛操作,然后如果第n轮仍然有松弛操作进行,说明有负环,返回true,否则返回false。本题需要我们找到小明和小红之间的最短距离,且结构为图结构。
2025-10-31 12:16:01
504
原创 算法题(249):采购特价商品
由于本题的路都是双向可走,所以所有边都是双向边,那么我们有两种解决方法,其一是存储双向边,也就是将一条边存储两次,一次正向一次反向。其二是只存储一次,但是进行两次松弛操作,一次正向,一次反向,这样也相当于是将双向的边都考虑进去松弛。由于题目中给的条件是所有点的坐标,以及点之间的边关系,所以我们需要根据这两类条件将所有的边权值求出(利用勾股定理即可)题目求的是从s到t的最短路径,而我们可以将s定位起点,利用bf算法求出所有节点的dist,然后再输出dist[t]即可。关键1:数据类型的定义。
2025-10-30 15:38:10
171
原创 算法题(248):邮递员送信
这已经属于多源最短路了,但是其实我们可以通过反向存储一个图的方式将多源最短路变为单源最短路,这是基于一条路不管从哪边走到哪边时间都是一样的。本题不仅需要我们找到从起点1走到各个节点的最短路径(时间),也需要找到从各个节点回到起点1的最短路径(时间)如果单独看送信过程,可以看成从起点1走到终点i(2<=i<=n),然后从i走回1,循环执行此过程n次。而我们可以将所有从1走到i的路径和求出,将所有从i走到1的路径和求出,然后将他们加起来即可。
2025-10-29 17:13:26
315
原创 算法题(247):负环(spfa算法)
(1)edges数组,dist数组,st数组,cnt数组都要清空残留数据,edges一定要在录入数据前清空,不能在spfa中清空,否则数据就没了。1.多组答案输出:我们需要每一组数据都进行一次spfa判断,并进行输出。(2)队列q则通过创建为spfa函数局部变量来达到清空目的。本题我们使用spfa算法解决负环的判断问题。
2025-10-28 12:39:46
322
原创 算法题(246):负环(bellman_ford算法)
在bellman_ford算法中,我们已经知道正常情况下最多只会进行n-1轮松弛操作,如果存在负环会就一直进行松弛操作,所以我们可以把松弛操作轮数限定为n轮,如果第n轮中仍然进行了松弛操作,那么就说明有负环,否则就没有。这里虽然有负环,但是无法从起点1到达,所以正确答案应该是NO,可是不进行节点可达性检测,就会让右侧三个节点不断进行松弛操作,从而让返回值变为true。如果进行了n轮都没有检测到flags为false,说明第n轮仍然有松弛操作,一定有负环存在。本题需要我们判断图中是否存在负环。
2025-10-27 19:40:55
363
原创 算法题(245):单源最短路(spfa算法)
如果队列中已经存在该节点,且该节点此时又成功进行了松弛操作,那么此时是不用讲该节点再次加入到队列中的,因为最新的dist更新已经覆盖了旧的,仅需对该节点一次松弛操作即可。由于只有上一轮成功进行过松弛操作的节点的dist值才会发生改变,而只有dist值发生改变才可能影响后续节点的dist值,所以只有上一轮成功松弛操作的节点才进行松弛操作。本题我们使用优化过的bellman_ford算法,也就是spfa算法。优化bellman_ford算法中的冗余松弛操作。使用队列来维护需要进行松弛操作的节点。
2025-10-26 11:35:29
296
原创 算法题(244):单源最短路(bellman—ford算法)
由于松弛操作的本质是更新更小的dist值,所以当所有dist都无法进行松弛操作等价于所有dist的值都没法变得更小,此时自然是所有节点都找到最短路。我们可以用bool变量judge的状态表示是否进行下一轮循环,当judge为true时,表示需要进行下一轮,为false表示不用进行下一轮。当dist值在本轮被更新过,表示还有dist没达到最小值,需要进行下一轮更新,反之表示都更新完了,结束循环。多轮进行所有边的松弛操作,直到所有dist都无法进行松弛操作为止,此时获得所有节点单源最短路。
2025-10-25 17:12:00
365
原创 linux:自定义shell
1.让子进程执行父进程代码的一部分,比如父进程进行数据更新更新的时候,让子进程进行数据备份2.让子进程执行一个全新的程序,比如shell。
2025-10-24 17:25:31
617
原创 算法题(243):单源最短路(标准版)
由于可能两个节点之间出现多条边,所以我们可以根据st数组的值判断该节点是否已经确定最短路径,如果已经确定就直接进行下一次循环,忽略该边。由于我们的排序是根据pair的第一个参数排序的,所以我们存储节点编号和边权值的时候需要将边权值放在前面。本题的n数据范围变成了1e5,所以不能使用最初的dijkstra算法,而应该使用查找优化版本的。使用优先级队列的小根堆维护数据,只需要logn的次数就可以快速查到。查找当前dist数组中未确定最短路径的节点中权值最小的节点的方式。
2025-10-24 12:39:24
140
原创 算法题(242):单源最短路(弱化版)
首先我们需要遍历所有的dist值(从1到n),并对每一个dist值都进行判断,如果该值等于正无穷,说明无法到达该节点,直接输出2^31 -1,否则就输出dist的值。将dist数组所有值设置为正无穷,因为这表示都没有最短路,起点还没有确定,然后特别注意将i==0位置也要初始化,方便后续查找dist最小权值。因为一共是n个节点,将n-1个节点的路径都确定了之后,最后一个节点dist数组也已经被其前面的节点更新完,从而确定了。本题需要我们找到起点固定,到达各个节点的最短权值,若不能到达则输出2^31 - 1。
2025-10-23 16:20:22
319
原创 算法题(241):杂物
第一行是总共的任务个数n,然后下面有n行,每行的第一个参数是从1开始依次递增的任务编号,第二个参数是当前编号任务的耗时,后面的参数表示当前任务的前置任务编号,数量不确定,但是一定以0结尾,表示前置任务列举完毕。由于题目要求必须完成所有前置任务才可以继续进行当前任务,所以我们需要的不是某个最少耗时的前置任务,而是耗时最长的前置任务,获得耗时最长的前置任务时间后再加上当前任务的耗时即可。由于题目所求是完成所有任务的最短时间,所以我们需要遍历f数组,找到最大值,这样才能保证所有任务都被完成。
2025-10-22 11:07:55
363
原创 算法题(240):最大食物链计数
由于我们求f[i]前必须先把所有能吃i位置的位置的f填写好,所以我们的填写顺序是先从生产者(入度为0)的点开始,最后再到分解者(出度为0),这时我们就可以使用拓扑排序的顺序进行填表了。通过画图我们知道,起点就是入度为0的1号,终点是出度为0的5号。这是正常的有向无环图,f[i][j]依赖于其上方和左侧的节点,即要求出f[i][j]的值必须先知道f[i-1][j]和f[i][j-1]的值。此时具有环形结构,f[i][j]和f[i-1][j]互相依赖,是无法利用状态转移方程求出他们中的任意一个结果的。
2025-10-21 21:04:25
327
原创 linux:进程控制
我们发现进程程序替换的接口有个规律表示存储执行程序名和命令参数的方式,l是单独一个个传递,v是以数组保存然后再传递表示需要先配置程序的路径给环境变量PATH,然后就可以直接传递程序名当第一个参数了表示还传递了环境变量表4.其实我们不用用参数形式传递命令行参数表和环境变量表,因为有environ的char**指针指向父进程的程序地址空间,而由于父子进程是写实拷贝,只要不产生分歧写入,两者访问的物理地址甚至都是一样的。
2025-10-21 09:38:06
774
原创 算法题(239):摄像头
然后我们需要对所有位置都遍历一次,将属于摄像头且入度为0的节点插入队列(此时不能让非摄像头进入,因为其他很多无关空位置也是0)按照规则,当某个位置的摄像头没有其他摄像头监视时可以损毁,这可以看成是AOV图中入度为0时的情况,所以拆除摄像头的过程就是不断将当前入度为0的摄像头移除的过程,可以使用拓扑排序。所以我们需要在录入信息的时候使用bool类型数组st[N]记录对应位置上是否有摄像头,最后在移除入度为0的节点时,就可以先判断该位置是否是摄像头,若是就cnt--
2025-10-20 19:03:19
368
原创 算法题(238):拓扑排序
使用int数组in存储入度数,并用vector<int>存储子节点(不确定有多少个子节点所以动态申请空间存储,使用vector)由于某个节点的子节点录入是输入0之后结束,所以我们需要在while循环中使用逗号表达式,当输入数据是0就退出循环。2.遍历队列中的节点,将该节点的所有边删除,并判断其链接的后续节点是否入度变为0,若变为0就加入队列中。一个有向图,节点表示活动,边ab表示a活动必须先于b活动进行。的节点进行排序,要求排在前面的节点不能依赖于排在后面的节点。1.先将入度为0的节点加入队列。
2025-10-19 11:28:13
190
原创 算法题(237):滑雪
由于给定的图不一定是连通图,所以不是所有的边都要纳入kruskal算法的考量的,那么我们就需要先存储初始图,然后在dfs中再将从1号节点出发可以经过的边存储起来并提供给kruskal计算。由于这里不是无向图,我们如果先滑到低点,就无法从低点滑到高点了,从而导致经过的点变少,故我们需要尽量先滑到较高点,若目标点高度一致,则让路径权值小的排前面。本题需要我们找到从1号景点开始滑雪所能经过的最多景点数,以及经过最多景点时最小的滑雪路径和。2.a等于b:存储a->b的边,b->a的边。1.找到能经过的最多景点数。
2025-10-18 20:16:01
325
原创 算法题(236):繁忙的都市
根据这三个条件我们判断出题目要求的是瓶颈生成树(权值最大的边的权值最小的生成树),而瓶颈生成树和最小生成树是完全一样的,所以我们使用。本题需要我们在满足三个条件的前提下选路修整,并输出方案中所有道路数和权值最大的那条道路的权值。题目中说明了是连通图,所以一定有最小生成树,不用维护cnt来进行特殊判断。解决问题,只要注意ret是最大权值,并维护好ret即可。
2025-10-17 12:53:09
323
原创 算法题(235):买礼物
我们可以将题目的礼物存储看成图结构(题目给出的输入数据就是图的邻接矩阵存储),礼物看成图的节点,kij的活动价格看成边权值。最终ret值 = A + ret:因为第一个加入最小生成树的礼物没有包含在权值累加求出的ret中,所以需要单独购买。1.去除重复边:由于给出的是邻接矩阵存储,包含了双向的边信息,而kruskal算法对于同一对端点只需要一条边。综上我们可以将情况1和情况2都合并起来,因为当cnt == n-1时带入情况2公式发现结果是一样的,行和列分别表示边的起点和终点,值表示边的权值。
2025-10-16 16:46:05
414
原创 算法题(234):最小生成树(kruskal算法)
使用基于并查集的find函数,find函数会返回当前端点的根节点,若两个端点根节点相同说明是连通状态,直接跳过当前边。否则就更新ret(总权值),并将集合合并,cnt++(用于和n-1比较,判断最终是否构成了最小生成树)f[N]是并查集数组(树状结构),他的第i个位置存储的是i号节点的父节点,当f[i]==i时表示i是一个集合的标识元素,是树结构的根节点。直接让f[i]==i即可,表示一开始所有节点都是一个集合,处于同一集合表示连通,否则表示非连通。其中cmp函数是根据边的z变量(权值)进行比较的。
2025-10-15 20:24:47
439
原创 算法题(233):最小生成树(prim算法+vector存储)
由于后续prim算法中会在逻辑中顺便解决重边问题,所以我们这里不用提前处理重边问题。首先我们需要包含头文件,然后将pair<int,int>重命名,方便后续书写。这里只更新了和当前加入最小生成树的节点有链接的节点,并且顺便解决了重边情况。edges[a] = {b,c} : 表示节点a和b之间的边值为c。本题是最小生成树的模板题,本题解是基于。的prim算法vector数组存储版本。
2025-10-14 20:37:03
233
原创 算法题(232):最小生成树(prim算法+邻接矩阵存储)
由于edges中存储的是边的值,且结果求解过程需要利用min函数求出最短边,所以要将无法连接的两点间距离设置为无穷大,我们可以将边的值都初始化为无穷大,表示一开始所有节点都无法互相连接,对于题目中给的可以连接的节点,在数据录入的过程将可以连接的节点间的边的值修改掉。由于题目中没有说不考虑重边,所以题目中就可能出现a,b之间有多条值不同的边连接,又因为题目要求的是最小生成树,我们就取最短的边为最终的边值。将原图的n个节点取出,并用n-1条边连接起来,满足少一条边就变成非连通图,多一条边会出现环的子图。
2025-10-13 19:56:03
454
原创 算法题(231):248G
根据最后一步判断法,合并区间的最后一步一定是将左区间与右区间合并,所以我们可以遍历出所有的区间分法,k表示左区间右边界(i<=k<j)对于不满足条件的情况,由于是非法情况,所以我们不用做任何操作(初始化让所有情况都标识为非法,若实际上是合法会覆盖掉0)不能直接输出f[1][n],因为不是所有f数组都是合法的情况,所以我们需要遍历整个f数组,然后找到最大值输出。本题的合并规则是将相邻且值相同的数合并为一个比原来的数大一的数,属于区间dp问题。我们让所有的f值初始化为0,表示初始化为非法情况。
2025-10-10 12:44:11
283
原创 linux:进程
环境变量具有全局属性,可以被子进程继承(本地变量则不可以被子进程继承,只被父进程独享)export可以将本地变量导入为环境变量,unset可以取消该操作这里我们的myenv是本地变量,但是echo明明是一个可执行程序,一个子进程,为什么子进程可以获取到bash的本地变量?其实echo是bash的内建命令,他不是bash的一个子进程,而是bash内部实现的命令,这就是内建命令。
2025-10-09 20:57:02
1336
原创 算法题(230):石子合并
其实我们直接初始化为0即可,因为g负责求最大值,而答案的范围是大于等于0的,所以在max函数判断下,无论答案是0还是大于0,初始值为0都不会影响最终结果。由于我们的环形排列情况有n种,所以也有n个最大最小值,为了维护绝对意义上的最大最小值,我们需要对每一种情况的max与min值进行比较,并维护出最终答案。的基础上添加了两个条件,第一个是石头从线性排列变为了环形排列,第二个是还需要求最大得分。其实排列从线性变为环形会带来一个显著变化,那就是情况变多了,我们以下图为例。
2025-10-09 12:48:16
350
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅