- 博客(33)
- 收藏
- 关注
原创 染色法判定二分图
本文介绍了如何判断无向图是否为二分图,并提供了高效的实现方法。二分图是指顶点可被分为两个互不相交的子集,且每条边连接不同子集的顶点。关键性质是二分图中不存在奇数长度的环。文章详细解释了染色法的原理:通过DFS或BFS给顶点交替染色(颜色1和2),若相邻顶点颜色相同则存在冲突,说明不是二分图。给出C++代码实现,使用邻接表存储图,时间复杂度为O(n+m)。示例测试验证了算法的正确性,适用于大规模数据(n,m≤10^5)。这种方法在任务分配、社交网络分析等场景有广泛应用。
2025-11-19 08:48:04
1212
原创 Kruskal算法求最小生成树
本文详细介绍了Kruskal算法求解最小生成树问题的方法。该算法通过贪心策略,按边权排序后逐步选择边并使用并查集检测环,确保生成树的权重和最小。文章包含算法原理、C++代码实现及详细注释,通过示例演示了算法过程,并分析了时间复杂度和边界条件。Kruskal算法特别适合稀疏图,时间复杂度为O(mlogm),是网络优化等场景下的高效解决方案。理解该算法有助于解决类似连通性优化问题。
2025-11-19 08:38:02
1064
原创 Prim算法求最小生成树
本文详细讲解了Prim算法求解最小生成树问题。最小生成树(MST)是图论中的重要概念,用于解决网络设计等优化问题。文章首先比较了Prim和Kruskal算法的适用场景:Prim适合稠密图(O(n²)),Kruskal适合稀疏图(O(m log m))。核心思想是通过贪心策略逐步扩展已选点集S,每次添加距离S最近的点并更新距离。代码实现采用邻接矩阵存储,处理重边并判断连通性,时间复杂度O(n²)。文章还提供了堆优化建议(降至O(m log n))和边界测试技巧,强调理解集合扩展、距离更新和连通性判定三个关键点
2025-11-18 10:22:46
1148
原创 Floyd求最短路
Floyd算法是一种高效解决多源最短路径问题的动态规划算法。本文详解了该算法的原理与实现,特别适用于存在负权边但无负权回路的有向图场景。通过三重循环逐步扩展中转点,算法能在O(n³)时间内计算出所有顶点间的最短路径。文章提供了完整的C++实现代码,包含初始化、重边处理、动态更新等关键步骤,并通过示例演示算法执行过程。Floyd算法虽然时间复杂度较高,但代码简洁,能直接获取全局最优解,是处理中小规模图最短路径问题的理想选择。
2025-11-18 10:04:47
1314
原创 spfa算法:求最短路 & 判断负环
SPFA算法是一种高效处理带负权边的最短路径算法,通过队列优化Bellman-Ford算法,避免无效计算。其核心思想是动态更新:仅当节点距离被缩短时才入队处理,显著提升效率。算法流程包括初始化距离数组、队列管理待处理节点、松弛操作等关键步骤,平均时间复杂度为O(m)。与Dijkstra算法不同,SPFA能处理负权边,但需注意负权回路的检测。代码实现采用邻接表存储,配合状态标记数组避免重复入队。该算法适用于网络路由、物流规划等场景,是解决带负权边最短路问题的优选方案。
2025-11-16 09:13:55
1373
原创 有边数限制的最短路:Bellman-Ford 算法
本文解析了有边数限制的最短路问题及其解决方案。针对快递员在复杂路网中最多经过k条边的场景,介绍了Bellman-Ford算法的核心思想:通过k次迭代构建分层最短路径,使用状态备份防止更新串联,并能处理负权边。文章详细解释了算法实现的关键细节,包括备份的必要性、INF/2判断条件以及负权回路的天然规避,提供了完整的C++代码实现,并给出调试技巧和变式思考。该算法时间复杂度为O(k×m),适合题目限制范围,是解决这类特殊最短路问题的有效方法。
2025-11-15 09:04:05
742
原创 Dijkstra求最短路 II
本文详细介绍了堆优化Dijkstra算法在求解稀疏图最短路径问题中的应用。针对包含150,000个节点和边的物流网络问题,文章对比了传统算法与堆优化版本的关键差异,重点阐述了邻接表存储结构和优先队列的动态更新策略。通过代码实现解析,展示了如何使用C++实现该算法,包括数据结构设计、邻接表构建和核心算法流程。复杂度分析表明,堆优化将时间复杂度从O(n²)降至O((n+m)logn),极大提升了处理大规模稀疏图的效率。文章最后提出了关于负权边和进一步学习方向的思考题,鼓励读者实践应用该算法解决实际问题。
2025-11-15 08:55:01
1218
原创 Dijkstra求最短路 I
本文介绍了Dijkstra算法求解单源最短路径问题。该算法适用于边权为正的稠密图,采用贪心策略:从起点开始,逐步扩展未访问点,每次选择当前距离最小的点并更新其邻居的距离。文章详细解析了算法思想、邻接矩阵存储方式、时间复杂度分析(O(n²)),并提供了完整的C++实现代码,包括初始化、距离更新和不可达处理。通过城市配送的生动示例,直观展示了算法执行过程,最后指出该算法在网络路由、机器人规划等领域的广泛应用价值。
2025-11-14 08:53:32
822
原创 有向图的拓扑序列
本文详细介绍了有向无环图(DAG)的拓扑排序算法。算法通过维护节点入度数组,先将所有入度为0的节点入队,然后依次处理队列中的节点,更新邻接节点入度,最终生成拓扑序列或检测环的存在。文章提供了C++实现代码,采用邻接表存储图结构,时间复杂度为O(n+m)。拓扑排序适用于任务调度、课程安排等场景,算法能有效检测图中环是否存在。
2025-11-14 08:40:02
469
原创 树与图的广度优先遍历:图中点的层次
本文介绍了如何使用广度优先搜索(BFS)在有向图中寻找最短路径。当图中所有边的长度均为1时,BFS能够有效地通过逐层探索找到起点到终点的最短距离。文章详细解释了BFS的原理及其优势,并提供了一个完整的C++代码实现。代码使用邻接表存储图结构,通过队列实现BFS遍历,记录每个节点的最短距离。文中还通过具体示例演示了算法执行过程,强调了BFS在处理单位边权图时的效率和可靠性。该方法时间复杂度为O(m),适合处理大规模数据,是解决此类最短路径问题的理想选择。
2025-11-13 09:22:13
755
原创 树与图的深度优先遍历:树的重心
本文介绍了树的重心概念及其查找算法。树的重心指移除后能使剩余连通块最大节点数最小的节点,类似于积木塔中最关键的平衡点。通过深度优先搜索(DFS)遍历树结构,计算每个节点的子树大小及移除后的最大连通块,最终确定重心。算法时间复杂度O(n),空间复杂度O(n),适用于树结构平衡分析、网络关键节点识别等场景。文章包含算法思路、伪代码、C++实现及复杂度分析,展示了DFS在树结构分析中的高效应用。
2025-11-13 09:12:31
795
原创 BFS广度优先搜索:走迷宫 & 八数码
迷宫与八数码问题的最短路径解法 迷宫最短路径问题 采用BFS算法解决n×m迷宫的最短路径问题,核心要点: 使用队列实现逐层遍历,首次访问即最短路径 方向向量实现四方向移动检测 距离数组d[N][N]兼作访问标记 时间复杂度O(nm),空间复杂度O(nm) 八数码问题解法 同样基于BFS算法: 将3×3拼图状态编码为字符串 通过交换x与相邻数字生成新状态 使用队列和哈希表记录访问状态及步数 检查逆序数可预先判断可解性 确保找到最少交换次数或无解(-1) 两问题均体现了BFS在无权图最短路径问题中的高效性。
2025-11-12 09:32:50
1097
原创 DFS深度优先遍历:排列数字 & n-皇后问题
本文介绍了两种经典问题的DFS回溯解法:全排列问题和n-皇后问题。对于全排列问题,采用递归DFS逐位填充数字,通过标记数组避免重复选择,并在回溯时恢复状态。时间复杂度为O(n×n!),空间复杂度O(n)。n-皇后问题则通过逐行或逐格放置皇后,利用三个辅助数组检测列和对角线冲突,确保合法解。两种方法均体现了DFS回溯的核心思想:递归探索、路径记录、状态标记和回溯恢复。这些算法在枚举类问题中具有广泛应用价值。
2025-11-11 09:03:37
1168
原创 模拟散列表 & 字符串哈希
本文介绍了两种高效数据结构实现方法:散列表和字符串哈希。 散列表部分详细讲解了拉链法和开放寻址法两种冲突处理策略。拉链法通过链表存储冲突元素,实现简单;开放寻址法则通过线性探测查找空位,查询速度更快。两种方法均采用质数大小的哈希数组,并提供了完整的C++实现代码,包括插入和查询操作。 字符串哈希部分阐述了基于P进制数的快速子串比较技术。通过预处理前缀哈希和幂数组,可以在O(1)时间内计算任意子串哈希值,极大提升字符串比较效率。文中给出了数学推导和代码实现,并分析了时间复杂度和典型应用场景。
2025-11-10 09:34:42
1088
原创 堆排序 & 模拟堆
本文介绍了堆排序算法及其应用,特别适合高效提取数列中前m小的数。堆是一种完全二叉树,分为小根堆和大根堆,核心操作包括down和up函数实现堆调整。构建堆的时间复杂度为O(n),提取前m小数的复杂度为O(m log n)。代码实现展示了堆排序的完整流程,并分析了其优缺点。此外,文章还探讨了支持按插入顺序删除与修改的"模拟堆"操作,通过引入ph[]和hp[]辅助数组建立双向映射关系,详细解释了堆交换heap_swap和下沉操作down的实现原理,为处理复杂堆操作提供了有效解决方案。
2025-11-09 09:20:21
981
原创 并查集:连通块中点的数量 & 食物链
本文介绍了两种基于并查集的高效算法应用。第一部分实现了图的连通块操作,支持动态添边及查询连通性和连通块大小,通过父节点数组和大小数组维护,结合路径压缩优化性能。第二部分解决动物王国食物链问题,引入距离数组和模3运算来判定动物间捕食关系,巧妙处理环形食物链中的真假语句判断。两种应用均体现了并查集在处理动态关系问题上的优势,通过优化操作实现近乎常数时间复杂度。
2025-11-08 09:27:54
1295
原创 并查集之合并集合
并查集是一种高效处理集合合并与查询的数据结构,通过树结构表示集合,利用路径压缩优化性能。核心操作包括合并集合(Union)和查询元素所属集合(Find)。典型应用是判断图中节点的连通性。本文详细介绍了并查集的实现原理、路径压缩优化技巧及其时间复杂度分析,并通过C++代码演示了具体应用,最后给出示例说明其运作过程。这种数据结构在图论和连通性问题中具有重要作用。
2025-11-07 09:20:58
1121
原创 Trie树:最大抑或对
本文详解了最大异或对问题:给定N个整数,找出两个数异或后的最大值。直接暴力解法时间复杂度O(N²),难以处理大规模数据。文章提出使用Trie树优化,将数字按二进制位从高位到低位存储,在查询时优先选择相反位以最大化异或值。算法时间复杂度优化为O(NlogC),其中C为数字位数(如31位)。给出了清晰的C++实现,包括Trie构建、查询过程和复杂度分析。该方法巧妙结合贪心策略和数据结构,高效解决大规模异或问题。
2025-11-07 08:54:00
1473
原创 Trie:字符串统计
Trie树是一种树形数据结构,用于高效存储字符串集合。每个节点代表一个字符,从根节点到叶节点的路径表示一个完整字符串。节点通过儿子指针(son数组)连接,共享公共前缀,减少重复存储。例如,存储"a"和"aab"时,"a"前缀被共享。查询时,从根节点向下遍历,如果路径存在且结束标记(cnt数组)非零,则字符串存在。关键优势前缀共享:避免重复存储公共前缀,节省空间。高效查询:查询时间与字符串长度成正比,不受集合大小影响。如图,红色星号表示存在到它为止的字符串,图中存的字符串有。
2025-11-06 09:07:55
784
原创 KMP字符串匹配
本文介绍了KMP算法在字符串匹配中的应用。给定主串S和模式串P,KMP算法通过预处理构建next数组(记录模式串各位置的最长公共前后缀长度),在匹配过程中利用该数组避免不必要的回溯,将时间复杂度从朴素算法的O(m×n)优化到O(m+n)。文章详细阐述了next数组的构建原理和匹配过程,并提供了C++实现代码,演示了如何处理输入输出。通过示例展示了算法的实际应用,说明了KMP算法相比朴素匹配的高效性,特别适合模式串重复出现的场景。
2025-11-06 08:47:09
861
原创 单调栈 & 单调队列之滑动窗口
本文介绍了两种高效的单调数据结构算法:单调栈和单调队列。 单调栈算法用于解决寻找序列中每个元素左侧第一个较小值的问题。通过维护严格递增的栈结构,确保每个元素最多被处理一次,实现了O(N)的时间复杂度。算法核心在于淘汰无效元素,保留可能成为后续答案的候选值。 单调队列算法则应用于滑动窗口的最值问题。通过维护单调递增或递减的双端队列,高效跟踪窗口内的极值。该算法利用队列存储下标,确保窗口边界检查的准确性,同时通过单调性维护优化了查找过程。
2025-11-05 09:56:42
858
原创 数组实现:栈 & 队列
本文介绍了栈和队列两种基础数据结构的数组实现方法。栈采用先进后出(FILO)原则,使用数组stk[N]和栈顶指针tt实现push、pop等操作;队列遵循先进先出(FIFO)原则,通过数组q[N]及队头hh、队尾tt指针完成基本操作。两种结构均实现O(1)时间复杂度的核心操作,并提供了判空和查询功能。文中给出了完整的C++代码实现,并简要说明了边界处理和应用场景,包括表达式求值、递归模拟等。这些实现方式适合算法竞赛和基础数据结构学习,源自AcWing算法基础课内容。
2025-11-04 08:34:25
474
原创 数组实现:单链表 & 双链表
这篇文章介绍了静态单链表和双链表的实现与应用。静态链表利用数组模拟链表结构,通过预分配固定空间避免动态内存分配开销。单链表实现了头插法、指定位置插入和删除等基本操作;双链表则支持双向遍历,实现了边界节点初始化、节点插入与删除等功能。文章详细展示了两种链表的代码实现,包括数据结构定义、核心操作逻辑和具体应用场景,并分析了静态链表在性能上的优势。这些实现方式特别适合算法竞赛和内存受限环境下的高效链表操作需求。
2025-11-03 08:55:27
415
原创 区间和 & 区间合并
摘要:本文介绍了两种处理区间问题的算法技术。第一部分讲述离散化方法,用于处理大范围稀疏数据的区间求和问题,通过坐标映射到紧凑索引,结合二分查找和前缀和实现高效查询。第二部分介绍贪心算法解决区间合并问题,通过排序和逐步合并有交集的区间来简化问题。文章提供了完整的算法思路、实现步骤和代码示例,适用于处理大规模稀疏数据或需要合并重叠区间的情况。(149字)
2025-11-02 09:01:12
1151
原创 判断子序列 & 二进制位操作 & 二进制中1的个数 & unique函数的实现
通过右移和按位与运算,可以高效地提取二进制数的任意一位。这种方法不仅简单,而且计算速度快,适合在各种编程环境中使用。
2025-11-01 08:48:02
926
原创 双指针算法:输出句中单词 & 最长连续不重复子序列 & 数组元素的目标和
本文介绍了三种基于双指针算法的经典应用: 单词分割:使用双指针高效分割输入字符串中的单词,时间复杂度O(n); 最长不重复子序列:通过维护计数数组和双指针,线性时间找到最长连续不重复子序列; 有序数组目标和:利用数组有序性,通过相向双指针快速找到满足A[i]+B[j]=x的数对。 这些算法都充分利用了双指针的协同移动特性,将暴力解法的时间复杂度从O(n²)优化到O(n),是处理字符串和数组问题的有效技巧。每种方法都配有详细的代码实现、算法分析和示例解释。
2025-10-31 08:52:42
1536
原创 差分 & 差分矩阵
摘要: 差分技术是处理数组/矩阵区间更新的高效方法。一维差分通过构造差分数组b,使得原数组a是b的前缀和。对区间[l,r]+c只需O(1)修改b[l]和b[r+1],最后通过前缀和还原结果,将O(mn)暴力更新优化为O(n+m)。二维差分矩阵类似,通过四角修改法在O(1)时间内完成子矩阵更新,最终通过二维前缀和恢复结果,将O(qnm)优化为O(nm+q)。该技术适用于静态数据结构多次区间修改场景,在算法竞赛和工程应用中具有显著性能优势。
2025-10-30 09:37:29
1290
原创 前缀和 & 子矩阵的和
本文介绍了一维和二维前缀和算法及其应用。一维前缀和通过预处理构造前缀和数组,将区间查询优化至O(1)时间,总复杂度从O(n*m)降至O(n+m)。二维前缀和扩展了该思想,使用容斥原理计算子矩阵和,递推公式为s[i][j] = s[i-1][j] + s[i][j-1] - s[i-1][j-1] + a[i][j],查询时通过s[x2][y2] - s[x2][y1-1] - s[x1-1][y2] + s[x1-1][y1-1]计算。两者均需注意边界处理,适用于高频查询静态数据的场景,并可扩展至多维、乘积
2025-10-29 09:00:33
1200
原创 高精度乘法 & 高精度除法
高精度乘法又叫大整数乘法。在编程中,处理大整数乘法时经常会遇到超出基本数据类型范围的情况。例如,一个位数在106的正整数与一个不到10000的正整数相乘,结果可能超出long long的存储范围。这时可以通过数组模拟手算乘法的方式来解决。
2025-10-28 08:54:58
881
原创 高精度加法,高精度减法
高精度加法又称大整数加法,大整数加法是指处理超过普通数据类型存储范围的整数相加问题。例如,当两个数的位数超过 10^6 时,无法直接用long long存储,需要使用数组模拟手算加法。
2025-10-27 08:52:11
494
原创 二分法求X第一次,最后一次出现的位置 & 求解X的三次方根
本文介绍了二分查找算法的两种应用场景:在有序数组中查找目标值X的首次和末次出现位置,以及求数值X的平方根和立方根。对于有序数组查找,重点讲解了整数二分法的边界处理技巧和两种mid计算方式,防止死循环问题。对于数值计算,说明了小数二分法的实现方法,包括处理负数情况和确定初始区间范围的技巧。文章通过具体代码示例展示了如何实现这些算法,并强调了关键细节处理的重要性。
2025-10-26 09:40:53
1257
原创 快速排序,第K小的数
其核心思想是:选择一个枢轴元素 X,将数组分割为两部分,使得左侧所有元素均小于等于 X,右侧所有元素均大于等于 X。时间复杂度在平均情况下为O(n log n)。每次分割需要遍历所有元素,时间复杂度为O(n),因此总时间为O(n log n)。例如,给定数组[5, 2, 9, 3, 7],排序后为[2, 3, 5, 7, 9],那么第1小的数是2,第2小的数是3,以此类推。Hoare分区中,枢轴的最终位置不固定,需要包含边界点,效率较高。调整数组,使得左半段<=x,右半段>=x,x不一定在左右分界点上。
2025-10-24 09:58:13
484
空空如也
逻辑地址转为物理地址实验
2024-12-08
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅