- 博客(91)
- 收藏
- 关注
原创 【算法】DP系列之 路径问题
动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上)。【Tips】动态规划算法解决问题的分类计数:有多少种方式走到右下角 / 有多少种方法选出k个数使得和是 sum。
2024-10-11 10:47:20
1458
1
原创 【算法】DP系列之 斐波那契数列模型
动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上)。【Tips】动态规划算法解决问题的分类计数:有多少种方式走到右下角 / 有多少种方法选出k个数使得和是 sum。
2024-10-10 15:32:12
1348
1
原创 【算法】DFS系列之 记忆化搜索
记忆化搜索是一种典型的空间换时间的思想,可以看成带备忘录的爆搜递归。搜索的低效在于没有能够很好地处理重叠子问题。在搜索过程中,会有很多重复计算,如果我们能记录一些状态的答案,就可以减少重复搜索量。动态规划虽然比较好地处理了重叠子问题,但是在有些拓扑关系比较复杂的题目面前,又显得无奈。记忆化搜索正是在这样的情况下产生的,它采用搜索的形式和动态规划中递推的思想将这两种方法有机地综合在一起,扬长避短,简单实用,在信息学中有着重要的作用。
2024-10-08 11:51:32
1601
1
原创 【算法】DFS系列之 FloodFill 算法
FloodeFill算法即填充算法,原理就是从一个点开始向四周扩散,向周围可以走到的点填充颜色,直到将可扩散到的点全部填充颜色。BFS (宽搜)算法通常使用队列实现,将起始像素点加入队列中,并不断扩展队列中的像素点,直到队列为空为止。DFS(深搜) 算法通常使用递归实现,在处理当前像素点的相邻像素点时,递归调用 DFS 函数,不断深入直到无法找到相邻像素为止。假设这一块4*4的方格是一块土地,有凸起的地方,也有凹陷的地方(凹陷的地方用负数表示)。此时下大雨发洪水,会把凹陷的地方填满。
2024-10-07 11:27:28
1002
3
原创 【算法】DFS 系列之 穷举/暴搜/深搜/回溯/剪枝(下篇)
回溯算法是一种经典的递归算法,通常⽤于解决组合问题、排列问题和搜索问题等。回溯算法的基本思想:从一个初始状态开始,按照⼀定的规则向前搜索,当搜索到某个状态无法前进时,回退到前一个状态,再按照其他的规则搜索。回溯算法在搜索过程中维护一个状态树,通过遍历状态树来实现对所有可能解的搜索。回溯算法的核心思想:“试错”,即在搜索过程中不断地做出选择,如果选择正确,则继续向前搜索,否则,回退到上一个状态,重新做出选择。回溯算法通常用于解决具有多个解,且每个解都需要搜索才能找到的问题。// 回溯算法的模板。
2024-10-06 13:51:49
1064
原创 【算法】字符串相关
字符串是一种数据结构,大多与别的算法结合在一起出题,例如模拟、高精度算法、双指针、dp、回溯等,因此这个专题的题型本身是特别丰富的。本篇选取了较为典型的字符串题型,除了涵盖一些常用算法,还包括经常用到的容器、接口等。
2024-09-28 09:30:27
1010
4
原创 【算法】DFS 系列之 穷举/暴搜/深搜/回溯/剪枝(上篇)
回溯算法是一种经典的递归算法,通常⽤于解决组合问题、排列问题和搜索问题等。回溯算法的基本思想:从一个初始状态开始,按照⼀定的规则向前搜索,当搜索到某个状态无法前进时,回退到前一个状态,再按照其他的规则搜索。回溯算法在搜索过程中维护一个状态树,通过遍历状态树来实现对所有可能解的搜索。回溯算法的核心思想:“试错”,即在搜索过程中不断地做出选择,如果选择正确,则继续向前搜索,否则,回退到上一个状态,重新做出选择。回溯算法通常用于解决具有多个解,且每个解都需要搜索才能找到的问题。// 回溯算法的模板。
2024-09-27 11:03:51
1566
2
原创 【算法】二叉树中的 DFS
二叉树是一种经典的树结构,是节点的一个有限集合(该集合为空,或由一个根节点加上两棵别称为左子树和右子树的二叉树组成)。二叉树中又有一些特别的类型,例如二叉搜索树、红黑树等。若根的左子树不为空,则左子树上所有节点的值都小于根节点的值;若根的右子树不为空,则右子树上所有节点的值都大于根节点的值;根的左右子树也分别为二叉搜索树。前序遍历:根->左子树->右子树。中序遍历:左子树->根->右子树。后序遍历:左子树->右子树->根。
2024-09-26 09:38:35
938
1
原创 【项目综合】高并发内存池
central cache 是哈希桶结构,每个桶里挂的都是一个个双向循环链表 spanList,链表中的每一个节点 span 都是一个管理以页为单位的大块内存的结构体。span 结构体中既封装了页的相关字段,也有维护双向链表结构的前驱指针和后继指针,还有对分配给 thread cache 的内存块进行计数的计数器,以及管理着切好的小块内存的自由链表头指针。Common.h#endif//管理切分好的定长内存块的自由链表//...//计算定长内存块的对齐映射规则//...
2024-09-25 09:54:47
1338
4
原创 【算法】递归
常见的、典型的搜索算法有 BFS(宽度优先搜索)和 DFS(深度优先搜索)。而递归是搜索算法的基础。如果将递归看作是一个大类,那么搜索算法就是递归下面的一个分支,因此要掌握搜索算法,就必须掌握递归。【Tips】递归是什么?简单来说,递归就是一个函数自己调用自己的行为。【Tips】为什么会用到递归?把一个问题看作是主要问题,这个主要问题可以划分为若干个相同的子问题,递归就主要针对这种场景。【Tips】如何理解递归?画递归展开的细节图(本质是对一棵树进行DFS);借助二叉树的相关题目;
2024-09-24 09:56:30
1223
1
原创 【算法】BFS系列之 拓扑排序
【补】图的基本概念(1)顶点集合V = {x|x属于某个数据对象集}是有穷非空集合;E = {(x,y)|x,y属于V}或者E = {|x,y属于V && Path(x, y)}是顶点间关系的有穷集合,也叫做边的集合。(x, y)表示x到y的一条双向通路,即(x, y)是无方向的;Path(x, y)表示从x到y的一条单向通路,即Path(x, y)是有方向的。顶点和边:图中结点称为顶点,第i个顶点记作vi。
2024-09-22 12:03:08
1164
5
原创 【算法】BFS 系列之 多源 BFS
最短路问题是图论中一种经典的题型,包括单源最短路、多源最短路、边权为 1 的最短路等等。本篇主要讲述的是边权为 1 的多源最短路问题。简单来说,边权为 1 的单源最短路问题即为:求从单个起点到终点的最短路径距离,而边权为 1 的多源最短路问题即为:求从多个起点到终点的最短路径距离。对于多源的最短路问题,我们将多个相邻的起点看作是一个整体,进而简化成一个起点,将多源转化成单源并利用 BFS 来处理,具体的方式是,在用队列进行 BFS 时,将所有起点入队,然后一层一层向外扩展。。
2024-09-20 11:17:06
1155
1
原创 【算法】BFS 系列之边权为 1 的最短路问题
最短路问题是图论中一种经典的题型,包括单源最短路、多源最短路、边权为 1 的最短路等等。本篇主要讲述的是边权为 1 的最短路问题。有如下一幅无向图,其中的每个点都可以看作是一个地点,两点之间的线可以看作是一条路径,路径上标识的权值(边权)可以看作是路径的长度,所谓最短路问题,就是求一个地点到另一个地点的最短路径长度。而边权为 1 的最短路问题,就是指每条路径上的权值都为 1 或都相同。
2024-09-19 11:55:18
1292
2
原创 【算法】BFS系列之 FloodFill 算法
FloodeFill算法即填充算法,原理就是从一个点开始向四周扩散,向周围可以走到的点填充颜色,直到将可扩散到的点全部填充颜色。BFS (宽搜)算法通常使用队列实现,将起始像素点加入队列中,并不断扩展队列中的像素点,直到队列为空为止。DFS(深搜) 算法通常使用递归实现,在处理当前像素点的相邻像素点时,递归调用 DFS 函数,不断深入直到无法找到相邻像素为止。假设这一块4*4的方格是一块土地,有凸起的地方,也有凹陷的地方(凹陷的地方用负数表示)。此时下大雨发洪水,会把凹陷的地方填满。
2024-09-18 11:47:31
1374
1
原创 【算法】队列与BFS
和栈类似,队列也是一种特殊的线性数据结构,是只允许在一端进行插入数据操作、在另一端进行删除数据操作的特殊线性表,具有先进先出的特性。进行插入操作(入队)的一端称为队尾,进行删除操作(出队)的一端称为队头。队列一般与 BFS(宽度优先搜索)结合出题,而 BFS 主要的题型有树形结构相关(多为二叉树)、图论相关(最短路问题、迷宫问题、拓扑排序等)。
2024-09-16 10:32:15
915
3
原创 【算法】栈与模拟
栈是一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底,栈中的数据元素遵守后进先出的原则。它的插入操作叫做进栈(或进栈/入栈),插入的数据在栈顶;删除操作叫做出栈。出的数据也在栈顶。栈一般与模拟算法结合在一起出题,在题目中野经常充当数据的缓存容器,来帮助模拟入栈和出栈的过程以求得结果。
2024-09-16 10:31:59
889
原创 【算法】哈希表相关
哈希表是一种存储数据的容器,可以快速查找某个元素,其查找的时间复杂度为 O(1),非常合适需要频繁查找某一个元素的场景。直接使用底层为哈希表的 STL 容器。用数组模拟简易的哈希表,例如利用数组统计字符串中字符的频次、整型的数据范围很小时映射某些值等。
2024-09-11 10:12:02
1048
3
原创 【算法】链表相关
链表是一种常见的线性数据结构,是一种在物理结构上非连续、非顺序的存储结构,其中的数据元素的逻辑顺序由其中的指针链接次序实现,指针链接的每一个结构体都是一个节点。链表的结构多种多样,有单向或双向、带头或不带头、循环或非循环之分。无头单向非循环链表(或称单链表)带头双向循环链表(或称双向链表)【Tips】链表的常用技巧一定要画图!引入一个虚拟的头节点,利于处理边界情况、对链表进行各种操作。不要吝啬空间,大胆定义变量去使用,尤其涉及到插入操作的时候。
2024-09-11 10:10:54
766
原创 【算法】分治 · 归并
与快速排序类似,归并排序也将无序数组进行划分,根据数组的中间位置,通过递归的方式依此将数组划分为两个区间,直到每个区间只有一个元素为止,然后在每一层递归对划分后的数组进行排序,最终递归层层返回,将若干个排好序的小区间合并起来,这样就完成了对无序数组的排序。
2024-09-09 16:30:34
1106
2
原创 【项目综合】基于 Boost 库的站内搜索引擎
获取网页内容摘要的功能,作为一个函数,编写在 Searcher.hpp 中。private://供系统进行查找的索引public:public://初始化Searcher模块//...//进行关键字的搜索//1.【分词】:对query按照searcher的要求进行分词//...//2.【触发】:根据分词后的各个词,进行index查找//...//3.【合并排序】:汇总搜索结果,按照相关性(权重weight)进行降序排序//...
2024-09-09 16:29:10
1051
3
原创 【算法】分治 · 三路划分的快排
快速排序算法有很多版本,其中较为常见的有 hoare 法、挖坑法、前后指针法。这些版本已经在往期博客中做过详细的梳理(【算法】八种常见排序算法-优快云博客),本篇则侧重于三路划分版本。三路划分,顾名思义就是把一个顺序数据结构(一般为数组)分成三个部分,在该数据结构中随机选定一个基准值作为 key,然后按元素的值把数组分成小于 key 的部分、等于 key 的部分、大于 key 的部分。此时,这个 key 是已经排好序的了,接下来只需继续对其他区间进行划分,直到整个数组完成排序。
2024-09-04 17:32:09
978
5
原创 【算法】位运算
程序中的所有数在计算机内存中都是以二进制的形式储存的,位运算就是直接对整数在内存中的二进制位进行操作,常见有逻辑与(&)、逻辑或(|)、逻辑异或(^)、按位取反(~)等。【Tips】常见位运算方法总结(1)区分位运算的优先级:别人工区分了,按题目要求能加括号就加括号!(2)基础的与、或、异或(3)位图相关确定 n 的二进制数的第 x 位是 0 还是 1:右移 x 后与 1将 n 的二进制数的第 x 位修改成 1:或上 1 的左移 x。
2024-09-04 10:41:33
1143
5
原创 【算法】模拟
模拟算法是指,根据题目表述进行筛选提取关键要素,按需求书写代码解决实际问题,换句话说其实就是“依葫芦画瓢”,但很考察对数据结构、容器和一些特殊数学方法的掌握程度。模拟算法一般是一些很基础的题目,只要按题目要求来写代码就能解开题目。不过,模拟题也有相对困难的题目,而它们大部分的优化思路都是找规律。
2024-09-02 11:50:53
1106
原创 【算法】前缀和
前缀和是指,从数组的起始位置到某一位置的所有元素的和,主要应用于数组,有一维前缀和、二维前缀和之分,其本质是简易版的动态规划,使用时也会频繁涉及递推公式。【ps】做前缀和类型的题目,切忌死记硬背、生搬硬套,关键在于学会前缀和的思想和推导过程,能在不同的题目中化用。
2024-08-30 19:59:52
849
3
原创 【算法】二分查找
二分查找是一种高效的查找方法,其时间复杂度为 O(logN),主要针对于有序的顺序存储结构(无序有时也行,但是要有二段性),使用时的细节较多,但使用的套路相比其他算法更容易被摸清。34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)
2024-08-29 15:29:58
911
原创 【算法】滑动窗口
滑动窗口是一种常见的算法技巧,其本质由同向双指针构成,是双指针算法的变型,同样也适用于数组或字符串。在一个数组或字符串中,一前一后的同向双指针将数组或字符串进行了划分,被同向双指针包围的区间就像一个“窗口”,通过移动同向双指针就实现了“窗口”的“滑动”。【Tips】滑动窗口的一般解题步骤根据题目要求,定义和初始化同向双指针,以此初始化窗口的起始位置和结束位置;不断移动窗口,让窗口外的元素进窗口;根据题目要求,不断进行判断是否更新解,或是否出窗口;
2024-08-28 17:05:42
1285
原创 【算法】双指针
双指针(或多指针)是一种针对于线性结构的方法,适用于任何包含顺序存储的线性数据结构中,通过分别控制位于序列不同位置的两个指针,在序列中的移动,逐步简化待解决问题,以求解问题或满足特定条件。
2024-08-27 18:46:29
838
原创 【Linux网络】高级 I/O
本篇博客整理了五种 I/O 模型,其中重点展开了 I/O 多路转接和相关编程方式,旨在让读者深入理解网络编程下I/O 的具体方式。
2024-08-15 12:41:35
939
原创 【Linux网络】其他协议和技术:DNS、ICMP、NAT
本篇博客补充了 TCP/IP分层模型中,应用层的 DNS 协议、网络层的 ICMP 协议、网络层的 NAT 技术,旨在让读者更加深入理解网络协议栈的设计和网络编程。
2024-08-07 15:27:29
929
原创 【Linux网络】数据链路层协议:以太网和 ARP
本篇博客整理了 TCP/IP分层模型中数据链路层的 MAC 帧协议和 ARP 协议,旨在让读者更加深入理解网络协议栈的设计和网络编程。
2024-08-06 10:14:24
1059
原创 【Linux网络】网络层协议:IP
本篇博客整理了 TCP/IP 分层模型中网络层的 IP 协议,旨在让读者更加深入理解网络协议栈的设计和网络编程。
2024-08-04 14:39:12
1195
1
原创 【Linux网络】传输层协议:UDP 与 TCP
本篇博客整理了 TCP/IP 分层模型中传输层的 UDP 协议和TCP 协议,旨在让读者更加深入理解网络协议栈的设计和网络编程。
2024-08-01 17:20:36
1135
原创 【Linux网络】应用层协议:HTTP 与 HTTPS
本篇博客整理了 TCP/IP 分层模型中应用层的 HTTP 协议和HTTPS协议,旨在让读者更加深入理解网络协议栈的设计和网络编程。
2024-07-27 16:47:15
1201
原创 【Linux网络】套接字编程
本篇博客整理了 socket 套接字编程的相关内容,包括 socket 网络通信原理、socket 相关的系统调用接口等,分别演示了基于UDP协议、TCP协议的 socket 网络编程,旨在让读者更加深入理解网络通信原理和设计,对网络编程有初步的认识和掌握。
2024-07-21 19:11:29
1329
原创 【Linux网络】网络基础
本篇博客整理了 Linux 网络编程的前置知识,例如网络的发展、协议和协议栈分层、网络通信原理、网络地址等,为后续进入 Linux 网络编程作铺垫。
2024-07-11 18:18:02
809
原创 【Linux系统】多线程
本篇博客继上一篇《线程与线程控制》,又整理了多线程相关的线程安全问题、互斥与锁、同步与条件变量、生产消费模型、线程池等内容,旨在让读者更加深刻地理解线程和初步掌握多线程编程。
2024-06-22 16:24:56
867
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人