- 博客(142)
- 资源 (2)
- 收藏
- 关注
原创 从布尔函数的真值表构造二元决策图
二叉树的规模和复杂度随布尔变量的数目成指数级递增,会占用大量的内存空间,如上所述,采用二元决策图的布尔函数表示形式可以节省大量不必要的内存空间,使高效表示和存储布尔函数真值表成为可能。布尔函数的数字检索树是一棵满二叉树,二叉树的层数是布尔函数自变量数目加一,从上至下编号为i(从1开始)的层对应布尔函数的变量。为1时从右分支向下搜索,当抵达树的最低层时,最低层节点的布尔值就是布尔函数的求值结果..二叉树上每一个节点的左分叉表示0,右分叉表示1,如果节点代表布尔变量。为0时从左分支向下搜索,当。
2026-01-13 01:03:14
98
原创 空间数据结构K-D树
k-d树是二叉搜索树在k维空间中的扩展,其定义如下:一棵k-d树要么是空树,要么是一棵满足如下性质的二叉树:(1)每一个节点的数据域为k元有序组(N0,N1,N2,—,Nk-1)(2)每一层i上的每一个节点(数据域为(N0,N1,—,Nk-1))的左子树中每一个节点的数据域(N’0,N’1,—,N’k-1)满足N’ (i-1 mod k)<N (i-1 mod k),右子树中每一个节点的数据域(N’0,N’1,—,N’k-1)满足N’ (i-1 mod k) >N (i-1 mod k),二叉搜索树
2026-01-06 17:45:37
316
原创 tarjan LCA算法和基于+-RMQ和欧拉序列的LCA算法
基于±RMQ和欧拉序列的LCA算法的思路是构建树的欧拉序列,树上两个节点的LCA就是欧拉序列对应区间内深度最小的节点,且欧拉序列上相邻两项的深度值的差要么为1,要么为-1,所以LCA的查询可以用±RMQ做到.以下代码简单起见没有使用±RMQ ±RMQ实现见。tarjan LCA算法讲解见。strToTree.h内容。
2025-11-06 23:11:55
274
原创 有向无环图的拓扑排序
需要提及的是,在使用队列生成拓扑排序时,之所以当剩下的顶点入度均不为0时图中存在有向圈,是因为从剩下顶点中的任意一个出发,沿顶点的入边走到下一个和已经过的顶点都不同的下一个顶点的过程是不可能永远进行下去的(因为剩下的顶点数目是有限的),因而必然在某一步通过入边抵达的下一个顶点就是之前经过的顶点,从该顶点出发沿经过顶点的顺序的逆序前进,最终就回到了出发顶点,这就是一个有向圈。dfs求拓扑排序的算法思路是把有向无环图的顶点按dfs完成时间从大到小依次排列,所得的序列即为拓扑有序序列。
2025-11-05 16:45:21
170
原创 三路划分的快速排序算法的一种更复杂的娱乐实现
以下算法实现较为复杂,没什么参考价值,纯属娱乐。实践中还是应当使用以荷兰国旗问题解决思路为指导思想的划分算法,源代码在互联网上很容易找到。该算法就是将待排序序列划分为左中右三部分,左部分小于枢轴,中部分大于枢轴,右部分小于枢轴。再对左部分和右部分递归调用算法,这样避免了相等的数值在快速排序中引入的比较开销。娱乐代码如下(C++编写)
2025-10-17 05:58:54
326
原创 轻松一刻:另一种效率较低的最短路径娱乐算法
以下代码是自己对数据结构算法一知半解且只会运用C语言时写的,没有太大的参考价值,在这里展示纯属娱乐,实践中还是应当选用dijkstra算法这样的著名算法。
2025-10-17 05:57:29
282
原创 动态规划和分治求最大连续和
分治算法把序列分成左右两半,递归求解最大连续和,合并结果得到序列最大连续和。动态规划根据已求出之前序列最大连续和确定当前序列最大连续和,从左至右递推。代码很容易理解,一看就懂,这里就不多说了。
2025-10-17 05:06:40
215
原创 一个简易PC计算器的实现
该项目基于Boost库和Qt框架实现了一个简易计算器,采用递归下降分析法解析运算表达式。该计算器能处理基本的数学运算,代码已开源在GitHub上。欢迎开发者Star和Fork参与改进。项目地址:https://github.com/naturerun/A-simple-computer-calculator/tree/master
2025-07-15 23:14:25
176
原创 EdmondsKarp算法求最大流
EdmondsKarp算法是Ford-Fulkerson算法的特例,区别在于Ford-Fulkerson算法没有给出残存网络中增广路径的寻找方法,而EdmondsKarp算法使用广度优先搜索寻找增广路径。找到增广路径后沿其递增流,得到更大的流,重复下去直到残存网络不存在增广路径为止。具体见算法导论(第三版):26.2节。算法实现如下(C++)
2025-07-04 23:04:27
222
原创 在内存中简单模拟外部排序的归并过程
摘要:本文介绍了一个基于败者树实现的内存模拟外部排序的C++程序。与真实外部排序不同,该程序所有数据始终在内存中,仅模拟单趟归并过程。程序使用败者树结构进行多路归并排序,通过调整函数维护败者树,逐步输出排序结果。示例代码展示了四路归并对四个有序序列的合并过程。该实现适用于教学演示或小规模数据排序场景。
2025-07-02 20:50:21
189
原创 生成初始归并段算法实现
摘要:本文介绍了一种用于外部排序的初始归并段生成算法,旨在减少归并段数量,降低归并趟数和磁盘I/O操作。该算法基于败者树结构实现,参考文献为殷人昆《数据结构:用面向对象的方法和C++语言描述》(第二版)10.3.3节。文章提供了完整的C++实现代码,包括adjust函数处理败者树调整。算法通过维护segment_index跟踪归并段边界,利用infinity标记处理输入结束情况,最终输出多个有序归并段。
2025-06-30 01:26:51
244
原创 常用几大排序算法的实现
本文研究了六种经典排序算法的C++实现,包括锦标赛排序、自底向上归并排序、基数排序、希尔排序、快速排序和堆排序。针对每种算法提供了详细代码实现:锦标赛排序通过树形结构比较选出最小值;归并排序采用自底向上分治策略;基数排序按位分配收集;其他算法也各有优化。文章省略了冒泡、插入等简单排序算法,重点展示高效排序方案,为需要定制排序算法的用户提供参考。代码结构清晰,包含完整模板实现,可直接应用于各类数据类型。
2025-06-30 01:15:05
173
原创 直线划分平面区域算法的实现
摘要: 本文提出了一种基于增量法的平面直线划分算法,用于生成双向邻接边表数据结构。算法通过逐步添加直线,确定每条直线与现有区域的交点情况(顶点射入/射出或边射入/射出),并对穿过的多边形区域进行分割更新。双向邻接边表采用数组存储,记录每个多边形区域的顶点坐标及其相邻顶点信息。文章详细描述了直线与线段相交的四种情形处理逻辑,并提供了部分C++实现代码,包括有理数计算、交点求解等核心功能。作者指出该算法实现复杂度高,可能存在未检测到的边界情况,需要进一步完善测试验证工作。
2025-06-27 03:36:29
503
原创 后缀树构造算法的C++实现
这段代码实现了一个后缀树的构建算法,但由于缺乏注释和作者对细节的遗忘,难以完全理解其工作机制。代码定义了ExplicitNode结构体来表示节点,包含分支指针和字符串存储等成员。主要的constructSuffixTree函数通过迭代处理输入字符串,动态构建后缀树结构,处理了叶子节点的扩展和分支节点的分裂等操作。不过由于代码逻辑复杂且无注释,具体实现细节难以追踪,存在bug时也难以调试。建议添加详细注释或重构代码以提高可读性。
2025-06-17 00:22:17
192
原创 后缀数组的DC3算法的C++实现
摘要:DC3算法是一种线性时间构建后缀数组的有效方法。本文提供了该算法的C++实现代码,包含基数排序、字符比较和位置判断等核心操作。算法首先处理输入字符串的排名信息,通过3字符组合进行排序和分组,最终生成后缀数组。实现中考虑了边界情况如零值处理和不同长度字符串的适应。代码作者指出可能存在未发现的bug,建议参考Mark Allen Weiss的《数据结构与算法分析》获取完整理论说明。
2025-06-05 01:50:37
785
原创 Dijkstra单源最短路径算法
具体c++代码如下(注意代码中使用了数组path追踪顶点的前驱顶点,这样算法执行完毕后可构造出最短路径)指示某目标顶点是否求出最短路径的数组。,要求最短路径的各目标顶点为。,将所有元素初始化为false。(若存在)执行松弛操作。定义最短路径长度数组。,将所有元素初始化为。
2025-04-18 15:31:25
831
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅