自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Linux系统篇】:Linux文件管理的“地图与指南针”--从文件描述符表到内核缓冲区

第二次:在关闭文件描述符0(键盘文件)后,再打开一个新的文件,打印这个新文件的文件描述符就是0;对于没有打开的文件则是在磁盘上存放,但是没有打开的文件非常多,对于没有打开的文件主要研究文件是如何被分门别类的放置好,也就是如何存储,通过对文件的存储进行管理,实现用户可以快速的找到目标文件,进行增删查改。而关闭文件的本质:当某个程序关闭当前文件时,当前文件的引用计数就会减一,该文件在数组中对应下标中的地址置为空,如果该文件的引用计数变为0,表示没有被任何程序打开了,操作系统就会回收该文件的内核数据结构。

2025-04-01 14:48:12 568

原创 【Linux系统篇】:进程流水线的精密齿轮--创建,替换,终止与等待的工业级管控艺术

进程替换是指在当前运行的进程中,替换其正在执行的程序为新程序的代码,同时保持替换前进程的部分属性不变。这一过程通过exec系列函数实现。先用单进程版的进程替换看一下现象,然后再讲解原理,最后再演示多进程版的进程替换。1.单进程版进程替换这里先调用execl()函数演示一下,后面会具体讲解:根据运行后的现象,可以发现,函数execl()完成了指令ls -a -l(指令本质上也是可执行程序)的工作。

2025-03-25 11:03:09 908

原创 【Linux系统篇】:程序世界的“隐形地图“--破解环境变量与地址空间的共生秘密

根据上面的演示可以明白,环境变量是系统提供的一组name=value形式的变量,不同的环境变量有不同的用户,通常具有全局属性。如何理解环境变量的全局属性,这就要引入另一个概念,命令行参数来解释。

2025-03-21 15:32:05 1034

原创 【Linux系统篇】:进程抢占式调度的量子纠缠--状态,优先级与上下文切换的三角博弈

优先级表示当前进程已经获取CPU资源访问的权限,只是对于资源的访问,谁先访问,谁后访问的问题。

2025-03-17 21:59:07 863

原创 【Linux系统篇】:初步理解何为进程--从硬件“原子“到PCB“粒子“的进程管理革命

根据上面的四个问题就可以真正明白fork函数的功能,而对于fork函数创建子进程后,父子进程是谁先被运行的,并不能明确说明是哪一个,因为这是由调度器决定的。

2025-03-17 21:52:58 1097

原创 【Linux基础篇】:Linux常用工具全解析--探索高效的工具宝藏

答案是提高编译效率。[-o]选项的作用是指生成目标文件[.o],[.o]文件是已经完成预处理,编译以及汇编三个阶段的文件。一个工程项目的源文件不计其数,按照类型,功能,模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先进行编译,那些文件需要后进行编译,那些文件需要重新进行编译,甚至于进行更复杂的功能操作。图片左边为要编译的.c文件,右边为已经完成预处理阶段的.i文件,右边文件中的行数在经过头文件展开后变成了八百多行,红色方框中的注释也已经去掉,绿色方框中的宏也已经完成替换。

2025-03-09 14:49:10 1082

原创 【Linux基础篇】:揭秘Linux权限问题--如何设置与管理,让系统更安全

这里举一个例子,比如现在有一个校长叫做张三,张三作为校长可以进入校长办公室,但是小明是一个学生,他想要进行校长办公室但是不能进入因为他的身份是学生,不是校长,而张三又为什么能进入校长办公室,是因为他的身份是校长,而不是张三他这个名字。上面的这三种表示的是身份,而上面有讲到用户的分类,可以是超级用户,也可以是普通用户,这两个叫做具体的人,超级用户可以是拥有者也可以是所属组,也可以是其他人;列出的文件详细信息中,在第一个字符串中除了开头的字符表示文件的类型,剩下的九个字符表示的是文件对应的权限属性。

2025-02-26 22:06:25 1014

原创 【Linux基础篇】:Linux操作系统新手必修课--从零开始学习基本概念和指令

操作系统(,简称OS)简单来说就是一款做软硬件管理的软件。上面图中是计算机的层级结构,从底层到顶层的依赖关系。硬件作用:直接执行计算,存储数据,输入输出等基础功能;设备驱动作用:将操作系统的通用指令转换为硬件能理解的信号,同时将硬件状态反馈给操作系统;操作系统作用:管理硬件资源,提供系统调用接口供应用软件使用硬件功能,隔离应用软件和硬件,确保安全性和稳定性;应用软件作用:用户使用应用软件时通过操作系统的接口调用硬件资源来完成特定任务;

2025-02-24 22:10:29 845

原创 【动态规划篇】:解析背包问题--动态规划塑造的算法利器

题目算法原理根据题意要求,假设现在有一堆石头,先挑选b和c两个石头,剩余,然后挑选d和e两个石头,剩余,然后挑选a和b-c两个石头,剩余,最后两个石头相减,剩余,最后剩余石头的质量就是每个石头的质量相加减,其实和上一题有点相似,最后这个表达式就是在每个数字前添加正号和负号,然后分成两堆,一堆为正数,一堆为负数。假设所有正数的总和为a,所有负数的总和绝对值为b,所有数的和为a+b=sum,要使a-b的。

2025-02-21 22:49:01 680

原创 【动态规划篇】:动态规划中的“双线叙述”--如何用状态转移解决双序列难题

如果反着来看就是找两个字符串的公共子序列最大ASCLL码和,然后用两个字符串总的ASCLL码和减去二倍的公共子序列中的最大ASCLL码和(这里减去二倍是因为存在两个字符串,需要减去两次公共子序列的最大ASCLL码和),因此本道题就转换成了找两个字符串的公共子序列的最大ASCLL码和。本道题虽然是三个字符串,但是第三个字符串是由前两个字符串拼接而成的,所以还是属于两个字符串类的DP问题,这里还是从某段区间考虑,分析前两个字符串的某段区间的子串能否拼接成第三个字符串的某段区间的子串。最后取三种情况中的最大值。

2025-02-17 23:17:47 857

原创 【动态规划篇】:当回文串遇上动态规划--如何用二维DP“折叠”字符串?

无法同时包含这两个字符,需要舍弃左端的字符然后在左侧插入一个右端的字符或者舍弃右端的字符然后在右侧插入一个左端的字符,然后找剩余区间中的回文子串最少插入次数,存储所有子串的信息,在填表的时候,如果当前区间的子串是回文子串,就判断是否更新最长长度,注意还要保留最长回文子串的起始位置。的子串是否是回文串,其中i位置的字符是子串的起始位置,j位置的字符是子串的结束位置,存储每一个子串的信息,是。本道题有点不同,需要找到的是回文子序列,关键点:回文子序列是允许字符不连续的,因此需要灵活利用状态转移。

2025-02-15 22:31:33 865

原创 【动态规划篇】:解剖子序列类DP问题--如何用“以始为终“的思维暴力破解难题(二)?

返回值:因为并不知道最长的斐波那契子序列是以哪两个位置为结尾的,所以需要遍历整个状态表找到最大值返回,但是这里可能会有特殊情况,比如整个序列不存在斐波那契子序列,那状态表中的值就一直是2,最后获取到的最大值还是2,但是题意要求斐波那契子序列的长度最小为3,所以,在返回时,需要先判断一下最大值是否小于3,如果小于,直接返回0,说明不存在;,以k位置和i位置元素a,b为结尾的等差数列有多少个,以i位置和j位置元素b,c为结尾的等差数列就有多少个,因为a,b,c同样也是等差数列,所以个数还要多加一。

2025-02-14 11:24:24 739

原创 【动态规划篇】:解剖子数组类DP问题--如何用“以始为终“的思维暴力破解难题(一)?

返回值:如果数组中全为负数比如[-1,-1,-2],最小子数组和就等于整个数组和-4,两个相减得到的最大子数组和就是0,但是根据数组中可以看出,最大子数组和为-1,两个直接返回最大的会出现错误,所以需要单独判断一下这种特殊情况:如果最小子数组和等于整个数组和,直接返回最大子数组和;状态转移方程:如果当前位置i的字符和上一个位置i-1的字符是相邻字符,也就是差值为1或者当前字符是’a’,上一个字符是’z’满足两种情况的其中一种,找以当前位置i的字符为结尾的字符串有多少子字符串满足条件(

2025-02-13 16:59:36 843

原创 【动态规划篇】:多状态DP的量子纠缠现象--看似独立却相互制约的状态演化

本道题相较于上面的股票题,因为加上了交易次数限制,所以当天结束后,可能会出现非常多的状态,比如处于交易一次的买入状态,或者交易两次的卖出状态,因此本道题的难点在于对多个状态的处理,还有对初始化的处理。表示第i天结束时,此时的最大利润,第i天有多种状态,可能是买入,或者卖出,也可能交易一次或者交易两次,继续细分(用两个二维数组表示买入和卖出状态,每个数组中的行数i表示第几天,列数j表示交易多少次)。初始化:由方程中的i-1大于等于0可以得到,i要大于等于1时,才不会越界,所以需要单独处理下标i=0时的情况。

2025-02-11 11:30:49 963

原创 【动态规划篇】:动态规划解决路径难题--思路,技巧与实例

状态表示是否合理,能否覆盖所有可能的路径情况。状态转移方程是否正确,是否覆盖了当前位置所有的移动方向。初始化是否正确,特别是边界处理,如果添加虚拟下标,能否保证后面边界状态值的正确以及下标的映射是否对应。特殊情况的处理,比如当前路径上存在障碍,起点终点不可达等情况。

2025-02-10 21:17:49 963 1

原创 【动态规划篇】:动态规划入门--斐波那契数列模型练习题讲解

动态规划()是一种解决复杂问题的算法思想,核心是通过分解子问题,存储中间结果,避免重复计算来优化效率。通常用于解决具有重复子问题和最优子结构的问题。由上面的斐波那契数为例简单地讲解了什么是动态规划,在开始学习动态规划时,一定要掌握好对基础题的理解,因为动态规划属于较难的算法,特别是对状态表示的理解以及状态转移方程的推导,两个都是较难点,特别的抽象,大多都是根据一些经验和题目要求来得出,因此在做基础题时一定要理解清它们的状态表示含义和状态转移方程的推导,这些都是后面做较难题的经验。

2025-02-08 11:16:57 695

原创 【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(四)

本篇文章是对贪心算法练习题的讲解,有关贪心算法的讲解可以看本系列的第一篇文章,这里就不再讲解,继续讲解相关练习题。

2025-02-05 23:46:11 1098 2

原创 【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(三)

本篇文章是对贪心算法练习题的讲解,有关贪心算法的讲解可以看本系列的第一篇文章,这里就不再讲解,继续讲解相关练习题。

2025-02-04 23:12:52 1153

原创 【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(二)

本篇文章是对贪心算法练习题的讲解,有关贪心算法的讲解可以看本系列的第一篇文章,这里就不再重复讲解,直接继续讲解例题。

2025-02-02 21:44:08 1896

原创 【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(一)

贪心算法()是一种在每一步选择中都采取在当前状态下的最优决策的算法策略。他并不从整体最优上加以考虑,而是做出在当前看来是最好的选择。1.把解决问题的过程分为若干步骤。2.解决每一步时都选取当前看起来最优的选择。3.“希望”得到全局最优解。(注意是“希望”,可不一定就是最优解)简单形容就是贪婪+鼠目寸光,因此叫做贪心算法。

2025-02-01 23:27:35 1414 1

原创 【搜索回溯算法篇】:拓宽算法视野--BFS如何解决拓扑排序问题

拓扑排序是对有向无环图(DAG, Directed Acyclic Graph)的顶点的一种排序,使得如果存在一条从顶点uuu到顶点vvv的有向边uv(u, v)uv,那么在排序中uuu出现在vvv之前。它在许多实际应用场景中有重要作用,例如任务调度(每个任务有前置任务要求)、课程安排(先修课程的顺序安排)等。

2025-01-31 23:25:20 1081

原创 【搜索回溯算法篇】:多源BFS--从简单BFS到多点协同,探索搜索算法的进化

多源BFS(,广度优先搜索)是BFS的一种扩展形式,用于从多个起点同时开始搜索。与传统的BFS只能从一个起点出发不同,多源BFS允许从多个起点同时进行搜索,适用于需要从多个位置同时探索的场景。在我的上一篇文章中,用关于使用BFS解决最短路问题的讲解,在这类问题中其实就可以理解为单源BFS搜索,也就是只从一个起始位置开始搜索,而本篇文章则是探讨多个起始位置的最短路问题,使用多源BFS来解。因此在学习这个模块时建议先把单源BFS解决最短路问题理解清楚,才能更好的学习多源BFS。

2025-01-28 16:21:39 750

原创 【搜索回溯算法】:BFS的魔力--如何使用广度优先搜索找到最短路径

题目:算法原理:广度搜索,最短路的经典例题,给定迷宫中的起始位置,找到距离出口的最近距离,也就是离开迷宫的最短路径长度。本道题就是棋盘格式,在二维数组中搜索,所以每一个位置都有上下左右四个方向可以搜索,但是不能越界,具体的搜索方式和上面图中的样例相同。代码实现:2.为高尔夫比赛砍树题目:!算法原理:因为力扣官方给的示例不是很好,没有完整的描述题目中的规则,所以这里没有展示官方示例,在下面图片中,我会先写一个示例来讲解本道题的题意,然后再写算法原理。本道题可以理解为上面的那道题的扩展,不再局限于一个起始位

2025-01-27 22:30:10 1220

原创 【搜索回溯算法篇】:探秘Flood Fill算法--逐题解析,轻松掌握

floodfill概念Floodfill算法,也被称为种子填充算法。它是一种在图像或网格数据结构中,从给定的起始点开始,填充与起始点相连通的区域的算法。连通性概念这里的连通性可以根据不同的规则来定义,比如四连通(上下左右四个方向相邻)或者八连通(上下左右以及四个对角方向相邻)。

2025-01-23 11:43:59 579 1

原创 【搜索回溯算法篇】:搜索无界,回溯有方--算法练习题精选解析

在学习搜索和回溯算法之前一定要学会递归的使用,下面的几道题都是使用递归来实现,如果对于递归有不理解的可以看我上一篇的文章,有关于递归的简单题讲解。接下来就是开始讲解搜索和回溯的练习题。

2025-01-21 11:28:35 1132 1

原创 【搜索回溯算法篇】:深入理解递归算法--用简单的代码解决复杂问题

递归算法是一种在程序设计和数学计算中广泛应用的算法策略。递归算法在我们学习中十分常见,比如二叉树问题中多是使用递归来解以及排序算法中的快速排序和归并排序,同样也是借助递归来实现。

2025-01-15 23:00:33 599 1

原创 【优选算法篇】:分而治之--揭秘分治算法的魅力与实战应用

分治算法()是一种重要的算法设计范式。它的核心思想是将一个复杂的,规模较大的问题分解成若干个规模比较小,相互独立且与原问题类型相干的子问题,然后逐个解决这些子问题,最后再将子问题的解合并成原问题的解。

2025-01-14 23:32:15 921 1

原创 【优选算法篇】:模拟算法的力量--解决复杂问题的新视角

模拟算法是通过计算机程序模仿现实世界中的系统或过程的方法。它首先根据要模拟的对象建立数学模型或逻辑模型,然后设置初始状态,并按照设定的规则和逻辑逐步推进模拟过程。模拟可以关注离散事件的发生和处理(如交通流量模拟),也可以模拟随时间连续变化的系统(如化学反应模拟)。模拟算法在科学研究、工程领域、商业和经济等多个领域有广泛应用,如预测交通拥堵、模拟城市发展和游戏开发中的物理运动等。通过模拟,我们可以对系统的行为进行分析,为决策提供依据。简单的来说,其实就是根据题中要求模拟实现整个过程,通常会借助其他的算法来加以

2025-01-13 22:36:42 798

原创 【优选算法篇】:深入浅出位运算--性能优化的利器

位运算(Bitwise operation)是直接对整数在内存中的二进制位进行操作的运算。在计算机编程中,位运算非常高效,因为它们直接在二进制层面上操作数据,能够以较少的操作实现复杂的逻辑。下面是几种常用的位运算符号讲解。

2025-01-12 23:24:57 1053

原创 【优选算法篇】:揭开二分查找算法的神秘面纱--数据海洋中的精准定位器

基本思想二分查找算法的基本思想是:首先确定目标值可能存在的区间,然后逐步缩小区间直到确定目标值的位置或者确定目标值不存在。这个过程中,每次都会将查找范围缩小一半,因此大大提高了查找效率。前提条件有些地方可能对于二分查找算法的前提条件要求必须是有序的待查找数组,如果数组无序则不能使用二分查找。但实际上并不是“必须有序”才能使用,只要待查找数组满足二段性,可以将数组分成两个区间,这两个区间中的子数组又是有序的,同样可以使用二分查找,在后面的一些例题中就有这样的使用。算法步骤这里不具体讲解,直接在后面通过模板来讲

2024-12-10 22:37:23 1301 5

原创 【优选算法篇】:滑动窗口算法--开启高效解题的“窗口”,透过例题看奥秘

,避免不必要的重复过程,从而提高算法的效率。它通过维护一个滑动窗口(窗口大小可变),也就是两个通向移动的指针再数组或者字符串上移动,比根据问题的要求进行相应的操作。:确定窗口的起始位置和结束位置,通常是数组或者字符串的开头或者任意位置。根据问题要求,确定窗口的大小和滑动规则。:在每一步,计算或者更新窗口内的数据,并根据需要更新结果,比如窗口内的大小,最大值,最小值等变量。滑动窗口的核心思想是利用窗口的移动来优化问题的求解过程(:当窗口的结束位置达到数组或者字符串的末尾时,算法结束。

2024-12-07 23:16:48 1940 39

原创 【优选算法篇】:双指针算法--开启高效编码的两把“魔法指针”,练习题演练

双指针算法最核心的用途是优化时间复杂度。原本两个指针有n2中组合,时间复杂度是O(n2)。而双指针算法通过运用单调性,使得指针只能单项移动,因此总的时间复杂度只有O(n)。,又称快慢指针算法,龟兔赛跑算法等,是一种在链表,数组,矩阵等数据结构中,通过设置两个指针,并通过特定的移动策略来遍历数据元素同时解决问题的编程技巧。

2024-12-06 22:42:31 1654 36

原创 【c++篇】:探索哈希表--数据结构中的独特存在,打开数据组织与查找的新视界

哈希表(Hash Table)是一种非常重要的数据结构,它利用哈希函数将键值key映射到表中的一个位置,从而实现快速的1插入,删除和查找操作。哈希表的核心思想是通过空间换时间,即通过开辟一定的空间资源来实现接近O(1)的平均时间复杂度操作。下面将会详细讲解哈希表的概念,原理以及代码实现。

2024-12-01 22:46:23 1889 35

原创 【c++篇】:解读Set和Map的封装原理--编程中的数据结构优化秘籍

在之前的文章中,我们知道,set和map是两种常用的关联容器。他们内部通常使用红黑树来实现高效的查找,插入和删除操作,尽管它们提供了不同的接口函数,但它们依然可以通过共享相同的底层数据结构(也就是同一个红黑树)来实现。下面将详细讲解如何通过改造我们之前的红黑树来实现我们自己的set和map容器。(红黑树的实现在我上一篇文章中有详细讲解,不清楚的可以看我之前的文章)

2024-11-26 23:26:22 1380 31

原创 【c++篇】:探秘红黑树平衡旋转原理--维持树的高度平衡之道

在上一篇文章中,我们已经学习了平衡树之一的AVL树,在这篇文章中,我们将要继续学习另一个平衡树–红黑树。注意:如果想要更好地学习红黑树,建议先看一下关于二叉搜索树以及AVL树的讲解,红黑树是在这两个基础上来讲解的,有了上面两个的基础才能更好的理解和学习红黑树。红黑树是一种带有颜色属性的二叉搜索树,其中每个节点都带有红色或者黑色的颜色标志。它通过一系列的规则来确保树的平衡性,从而在插入,删除和查找操作中保持较高的效率,红黑树的性质包括:1.每个节点要么是红色要么是黑色2.根节点是黑色。

2024-11-24 22:47:20 1732 43

原创 【c++篇】:探秘AVL树平衡旋转原理--维持树的高度平衡之道

在之前的文章中,我们已经对二叉搜索树以及容器map和set有了简单的了解,这几个容器有个共同点是:其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现。而平衡树有AVL树和红黑树,本篇文章将详细讲解AVL树是如何实现平衡。定义。

2024-11-23 23:04:23 1492 22

原创 【c++篇】:深入c++的set和map容器--掌握提升编程效率的利器

在C++编程的世界里,容器是非常重要的部分,它们为高效地处理数据提供了强大的支持。其中,set(集合)和map(映射)这两种容器有着独特且广泛的用途。无论是新手在初步探索C++ 数据结构的奥秘,还是经验丰富的程序员想要优化代码中的数据管理部分,深入了解set和map的使用都是非常必要的。本篇文章将详细介绍set和map的使用方法和一些常用的技巧,帮助读者更好地将它们融入到自己的编程实践中。直接定义空set对象//定义一个存储int类型元素的set使用列表初始化set对象//使用列表初始化set对象。

2024-11-20 23:29:04 1830 46

原创 【c++篇】:二叉搜索树--有序存储与高效查找的关键

在之前的初阶数据结构中,我们已经了解过一点关于二叉树的概念和使用,这里我们将要了解一个新的二叉树–二叉搜索树。二叉搜索树也是一种树形结构。学习二叉搜索树是为了后面学习map和set进行铺垫,有助于我们更好的理解map和set的特性。其次二叉树中有的部分OJ题使用C语言写起来会比较麻烦,而在我们学过c++之后在去尝试写这些OJ题就会非常方便,废话不多说,让我们步入正题,开始学习二叉搜索树。二叉搜索树是一种特殊的二叉树,二叉搜索树又称二叉排序树或者二叉查找树,可以是空树,如果不是空树时,具有以下性质:有序性:递

2024-11-17 23:03:54 2200 50

原创 【c++篇】:栈、队列、优先队列:容器世界里的秩序魔法 - stack,queue与priority_queue探秘

在编程的世界里,数据结构是构建高效程序的基石。而在C++等编程语言中,容器则是对数据结构的一种方便的实现与封装。其中,stack(栈)queue(队列)和priority_queue(优先队列)是非常重要且基本的容器类型。Stack以其独特的后进先出(LIFO)的操作模式,为解决一些特定顺序相关的问题提供了简洁的方法,例如函数调用栈。Queue遵循先进先出(FIFO)的原则,如同现实生活中的排队场景,在任务调度等场景有着广泛的应用。而。

2024-11-10 23:34:48 1308 33

原创 【c++篇】:掌握list--实用的基本使用方法与模拟实现思路

在C++编程中,数据结构是理解和应用算法的基础。列表list作为线性数据结构的一种,它提供了有序的元素集合,支持高效的插入和删除操作。掌握list的基本使用和模拟实现,不仅有助于加深对数据结构的理解,也是提高编程能力的关键。本文将深入探讨list的基本概念、常见操作以及模拟实现方法。我们将从list的定义开始,逐步介绍如何使用标准库中的list类,并进一步探讨如何手动模拟实现一个简单的list数据结构。通过理论与实践的结合,帮助读者更好地理解和运用listt数据结构。

2024-11-08 23:40:49 1877 55

空空如也

空空如也

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

TA关注的人

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