- 博客(95)
- 收藏
- 关注
原创 一篇搞定 CMake 的基础语法
创建可执行文件目标# 解释:# - my_app: 生成的可执行文件名称# - ${SRC_FILES}: 构建所需的源文件列表# 创建库目标# 解释:# - STATIC: 生成静态库(可选 SHARED 生成动态库)# - 其他参数同 add_executable。
2025-11-01 18:04:01
150
原创 学习Docker前提:多环境安装Docker
Docker发展过程中衍生了以下版本,目前我们学习和使用提到的版本是docker-ce。上文中提到,Ixc是最早的linux容器技术,早期版本的docker直接使用Ixc来实现容器的底层功能。虽然使用者相对较少,但xc项目仍在持续开发演进中。docker从 O.9 版本开始自行开发了libcontainer模块来作为Ixc 的替代品实现容器底层特性,并在1.10版本彻底去除了Ixc。
2025-10-24 21:51:37
659
1
原创 一篇初识什么是容器,引出 Docker
实际的服务器或者计算机。相对于虚拟机而言的对实体计算机的称呼。物理机提供给虚拟机以硬件环境,有时也称为“寄主”或“宿主”。是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。容器化是一种虚拟化技术,又称操作系统层虚拟化(Operating system level。
2025-10-24 21:51:16
905
原创 【Linux多线程篇】初探线程的基本雏形
线程是进程内的一个执行分支,线程的执行粒度要比进程更细。今天的分享到这里就结束了,今日给大家分享了关于进程的终止情况。如果各位看官觉得还不错的话,可以三连支持一下欧。各位的支持就是捣蛋鬼前进的最大动力!
2025-09-23 21:53:13
892
原创 【算法系列】队列 && 优先级队列 算法
队列和优先级队列的常见算法实现。队列部分包含:1)N叉树的层序遍历,使用队列实现广度优先搜索;2)二叉树的锯齿形层序遍历,通过反转偶数层结果实现;3)计算二叉树最大宽度,使用节点编号差值求解;4)寻找每层最大值,维护当前层最大值。优先级队列部分包含:1)最后一块石头重量问题;2)数据流第K大元素,使用小根堆维护TopK;3)前K个高频单词,自定义比较函数处理词频和字典序。这些算法通过合理使用队列和堆结构,有效解决了树形结构遍历和TopK问题。
2025-06-12 08:01:06
455
1
原创 【算法】一篇搞定~BFS宽度搜索算法
BFS算法在四大类问题中的应用:1) FloodFill算法解决图像渲染、岛屿计数及区域标记问题;2) 最短路径问题处理迷宫出口、基因突变和单词转换;3) 多源BFS求解矩阵距离、飞地统计和地形高程;4) 拓扑排序应用于课程安排。通过队列实现BFS核心思想,配合方向数组处理邻接节点,展示了该算法在解决网格遍历、状态转换和依赖排序等问题的通用模式,为相关算法问题提供了标准化解题框架。
2025-06-11 21:32:46
537
原创 算法—栈系列
栈结构解决问题的算法实现:1)删除字符串相邻重复项,用栈匹配并消除重复字符;2)比较含退格字符串,通过栈处理退格操作后比较结果;3)基本计算器II,用栈处理加减乘除运算;4)字符串解码,通过双栈处理数字和字符的嵌套解码;5)验证栈序列,模拟入栈出栈过程验证序列合法性
2025-06-09 20:29:28
345
原创 算法—字符串题型讲解
字符串处理算法:1) 最长公共前缀解法,通过逐字符比较所有字符串;2) 最长回文子串的中心扩展算法,分别处理奇偶长度情况;3) 二进制求和实现,模拟进位加法过程;4) 字符串相乘方法,通过反转字符串后逐位相乘并处理进位,最后处理前导零。这些解决方案都采用高效的处理方式,通过遍历和比较实现各自功能。
2025-06-09 08:31:18
277
原创 算法—哈希表题型讲解
五个基于哈希表的算法解决方案:1)两数之和,通过哈希表快速查找目标值;2)判断字符串是否为字符重排,使用数组统计字符频率;3)检测数组是否存在重复元素;4)查找在k范围内是否存在重复元素;5)将字母异位词分组,通过对字符串排序作为哈希键。这些解法均利用哈希表的高效查找特性,时间复杂度多为O(n),适用于不同场景下的数据处理需求。
2025-06-09 07:29:23
274
原创 【优选算法】链表系列算法题
本文介绍了五个链表操作算法:1)两数相加:通过遍历两条链表逐位相加并处理进位;2)两两交换节点:使用虚拟头节点辅助完成相邻节点交换;3)重排链表:采用找中点、反转后半段、合并两链表的步骤;4)合并K个升序链表;5)K个一组翻转链表。算法均通过指针操作实现,关键点包括处理进位、节点交换顺序管理、以及多步骤链表重组等技巧。典型解法时间复杂度为O(n),空间复杂度O(1)。
2025-06-08 20:42:53
197
原创 【优选算法】分治
本文展示了五个基于三指针分区法的快速排序算法实现:(1)颜色分类使用红白蓝三色排序,(2)排序数组,(3)寻找第K大元素,(4)库存管理选取前cnt个小值,(5)计算逆序对等。核心算法均采用随机化三指针分区策略(<key/=key/>key),通过递归处理子区间实现高效排序。其中库存管理问题直接返回排序后的前cnt项,寻找第K大元素则通过完整排序后取倒数第K位实现。代码结构高度统一,均包含随机基准值选取和标准三指针分区流程,体现了快速排序在各类应用中的灵活性和高效性。
2025-06-08 17:03:25
366
原创 【优选算法】模拟 问题算法
本文展示了五个算法问题的解决方案:1)替换字符串中的问号,确保相邻字符不相同;2)计算提莫攻击的中毒总时间;3)Z字形字符串转换;4)生成外观数列;5)通过字符计数确定青蛙最小数量。每个问题都采用C++实现,涉及字符串处理、数组操作和哈希映射等技术,展示了不同算法场景下的高效解决思路。代码简洁高效,体现了对边界条件的全面考虑。
2025-06-08 11:30:03
452
原创 【优选算法】位运算
本文展示了五个位运算问题的C++解决方案:1) 检查字符串字符是否唯一,使用位掩码判断重复;2) 寻找缺失数字,通过异或运算实现;3) 不使用加减运算符实现整数加法;4) 找出数组中唯一不重复三次的数字;5) 查找缺失的两个数字,利用异或和位掩码分割结果。这些解法充分利用位运算特性,在O(1)或O(n)时间内高效解决问题,展示了位操作在算法优化中的巧妙应用。
2025-06-08 08:41:00
231
原创 【优选算法】前缀和
本文展示了多个前缀和应用实例的代码实现:(1)一维前缀和用于区间求和;(2)二维前缀和处理矩阵区域求和;(3)寻找数组中心下标;(4)计算除自身外的数组乘积;(5)和为K的子数组统计;(6)可被K整除的子数组统计;(7)二进制连续数组;(8)矩阵区域和计算。这些算法都利用了前缀和思想来提高效率,通过预处理和数组或矩阵的部分和,使得后续查询可以在O(1)时间内完成,有效降低了时间复杂度。
2025-06-07 21:11:16
462
原创 【优选算法】C++滑动窗口
本文摘要: 文章总结了8道滑动窗口算法的经典题目及其解法,包括:1)长度最小的子数组(求满足条件的最小窗口);2)无重复字符的最长子串(维护字符频率哈希表);3)最大连续1的个数III(允许K次翻转);4)将x减到0的最小操作数(转化为求和为sum-x的最长子数组);5)水果成篮(限制两种类型水果);6)字母异位词(双哈希表比较);7)串联单词的子串(多层滑动窗口);8)最小覆盖子串(综合运用哈希表和窗口收缩)。所有解法均采用统一的滑动窗口框架,通过调整进窗口、判断和出窗口逻辑来解决问题。
2025-06-07 18:15:06
949
1
原创 【优选算法】C++双指针问题
三个区间:[ 0, dest ] [ dest + 1, cur - 1 ] [ cur, n - 1 ]dest:已处理的区间内,非零元素的最后一个位置。cur:从左往右扫描数组,遍历数组。双指针,一个cur,一个dest。
2025-05-09 10:37:11
555
原创 【Linux网络】初识socket套接字
在进行网络通信的时候,用户使用应用层软件来完成整个数据发送和接受的。而用户使用应用层软件之前,必须先把这个软件启动起来,即本质上就是将进程启动起来。所以,网络通信的本质就是进程间通信。网络协议中的下三层,主要解决的是数据安全可靠的送到远端机器
2025-03-26 15:35:42
733
原创 【C++进阶篇】map和set的底层实现:红黑树
每个结点不是红色就是黑色根节点是黑色的如果一个节点是红色的,则它的两个孩子结点是黑色的。【不能出现连续的红色结点,即父子结点颜色:黑+黑、黑+红、红+黑】对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点。【每条路径都包含相同数量的黑色节点】每个叶子结点都是黑色的(此处的叶子结点指的是空结点)
2025-03-26 15:34:43
1243
原创 【Linux进程地址空间】再谈进程地址空间
今天我们来继续讲一下关于进程地址空间的内容点。一个 .c 文件在被编译成为 .exe 可执行文件的时候,是会加上地址的。即一个 .c 文件会先编译形成汇编文件,将 C语言代码转化为一条条的汇编指令。之后将汇编指令转化为所对应的机器码。此时都已经被加上地址了。即 .exe 中也是有地址的概念的。
2025-03-12 15:39:53
789
原创 【Linux基础进程篇】初谈进程地址空间——初窥进程地址空间的雏形
今天分享的是关于地址空间的理解,此为第一篇,目的是打牢基础篇。一:历史核心问题回顾二:语言层面的地址空间2.1:了解2.2:验证三:系统层面的地址空间3.1:引入新概念,初步理解这种现象——引入地址空间的概念3.2:加深粒度再来理解上面父子进程同意变量的现象四:谈细节4.1:地址空间究竟是什么4.2:为什么要有进程地址空间4.3:页表4.3.1:CR3寄存器4.3.2:页表项4.3.3:缺页中断五:结语。
2025-03-12 15:39:21
1273
原创 【Linux通信篇】进程间通信——system V共享内存
今天我们来了解一些有关SystmV共享内存的内容知识。申请共享内存三步申请法:操作系统在内存上去申请一段空间将申请到的内存挂接到进程地址空间的共享区返回起始虚拟地址1.2、释放共享内存释放共享内存:去关联,释放内存。这些一系列操作(申请、挂载、去关联、释放)并不是进程自己做的,而是由操作系统完成的。即我们用户(进程)通过调用一些系统调用接口让操作系统来做这些事情。因为OS中肯定有很多进程都在相互交互、通信的,那么操作
2025-03-10 10:24:04
1052
原创 【Linux系统】深入理解日志模块
今天我们来了解一些日志板块的内容。可变参数。va_list 一个 char* 类型的指针,va_start 函数作用是将 s 指向函数栈帧中的第一个非可变形参,因为函数的实参是从右向左的顺序进行在栈帧中压栈的,所以只需要知道第一个非可变形参的位置,那么就能找到第一个可变参数的位置,之后再解析出所有的可变参数,故此必须要求可变参数的最左边必须要有一个具体的参数(n),va_arg 函数作
2025-03-10 10:23:27
877
原创 【Linux通信篇】深入理解进程间通信——管道
今天我们来了解一些关于进程间通信的管道知识,进程间通信是两个或者多个进程实现数据层面的交互。因为进程独立性的存在,就导致了进程通信的成本比较高。
2025-03-09 08:15:40
1038
原创 【Linux系统】精通动静态库的制作和使用
今天讲解动静态库的制作与使用规则,静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)动态库可以在多个程序间共享,所以动态链接使得
2025-03-09 08:13:21
721
原创 【Linux文件系统】数据在内存和磁盘之间的传输
今天带大家来谈一下关于数据在内存和磁盘中的交互问题。操作系统是一定能看到物理内存的,即能看到物理内存的物理地址的。而对物理内存的管理,既然要管理,还是要 "先描述,再组织",在OS内核中有一个结构体 struct page 用来描述物理内存的。
2025-03-08 09:15:41
1086
原创 【Linux文件操作篇】文件系统 && 深度学习对缓冲区的理解
今天我们来说一些关于用户文件缓冲区的理解,进程打开的每一个文件都有一个独属于它自己的操作系统级别的文件缓冲区,这个缓冲区可以减少对外设的读写操作来提高计算机的效率。write 作为系统调用接口,它直接就向文件缓冲区内写入数据了,最后调用 close 接口或程序退出时会将文件缓冲区的内容刷新到外设中。(磁盘/网卡...)。
2025-03-08 09:15:07
1062
原创 【Linux文件操作篇】基础IO重定向的实现原理
今天我们学习基础IO重定向的知识内容,计算机上进行的所有操作任务都会被操作系统解释为进程。即目前对文件的操作都依赖于进程操作。
2025-03-06 08:54:38
812
原创 【Linux文件系统】文件系统,未被打开的文件【inode与软硬链接】
今天我们来谈一下关于inode和软硬连接的内容,记录地信息有整个分区到底有多大、该分区里面每个块组的起始位置、结束位置和大小,每个块组内部的inode和block的数量、每个组的起始inode编号,还有bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。软链
2025-03-06 08:53:53
1361
原创 【Linux文件操作篇】IO基础——被打开的文件,引入文件描述符
今天我们开启新篇章——基础IO的内容用法,文件 = 文件内容 + 文件属性。即不管是内容还是文件属性,都是数据,都需要储存在磁盘当中。文件分为打开的文件还有没打开的文件。没打开的文件,一般都是在磁盘中存储,因为磁盘中的文件非常多,那么文件是如何分门别类的存储号呢?本质就是我们要快速的对其进行增删改查(快速找到文件)。打开的文件,本质就是研究进程和文件的关系。对于文件的所有操作都是通过代码来实现的,但是代码最终是到CPU上来执行的。又根据 冯·诺依曼体系结构,CPU不能直接和外设交互数据打交道,所以一
2025-03-05 15:02:13
943
原创 【Linux_进程shell版】手撕一个shell简易进程外壳程序
今天我们来谈一下关于 shell 相关内容的理解,Shell是用户与操作系统内核(Kernel)之间的命令行接口,负责解析和执行用户输入的命令。一:命令行提示符二:读取键盘指令三:键盘指令分割四:普通命令执行五:内建命令执行六、总代码结语:
2025-03-05 15:01:44
1035
原创 【Linux进程控制篇】进程的替换
今天我带大家来谈一些关于进程替换的内容知识,用 fork 创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种 exec 函数以执行另一个程序。当进程调用一种 exec 函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用 exec 并不创建新进程,所以调用 exec 前后该进程的 pid 并未改变。
2025-03-04 08:37:39
797
原创 【Linux进程控制篇】进程等待
今天我们来谈一些关于进程等待的知识内容,之前讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为力,因为谁也没有办法杀死一个已经死去的进程。最后,父进程派给子进程的任务完成的如何,我们需要知道。如,子进程运行完成,结果对还是不对,或者是否正常退出。父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息。
2025-03-04 08:36:50
911
原创 【Linux进程控制篇】进程的终止
今天我们来谈一下关于进程的终止相关内容,我们以前写代码的时候总是在最后面写 return 0,那么为什么 main 函数总是会返回 return 0?这个返回值给了谁呢?为什么要返回这个值?下面就带大家好好探索一下关于进程的退出。
2025-03-03 15:24:48
872
原创 【Linux进程控制篇】进程的创建
今天我们来谈一下进程创建的相关细节。Linux中,fork函数功能:在当前进程运行时创建一个新进程,该进程是当前运行进程的子进程,原进程为父进程。
2025-03-03 15:20:23
878
原创 【C++进阶】模拟map和set底层了解必备——AVL平衡树
二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。与以前写的二叉搜索树不同,AVL树的结点不仅包括了左右孩子结点,还包括了其双亲结点(方便调整负载因子)。size_t _bf;// 负载因子,_kv(kv),_bf(0){}
2025-01-05 11:00:12
947
1
学生成绩信息管理系统源码资源
2024-09-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅