数据结构与算法
文章平均质量分 94
连理o
负优化砖家
展开
-
并查集
参考《算法笔记》目录并查集的定义井查集的基本操作初始化查找合并路径压缩并查集的定义并查集是一种维护集合的数据结构,支持合并: 合并两个集合查找: 判断两个元素是否在一个集合并查集用一个数组实现:fahter[i] 表示元素 iii 的父亲结点, 而父亲结点本身也是这个集合内的元素 (1≤i≤N1\leq i\leq N1≤i≤N)。以这种父系关系来表示元素所属的集合。另外,如果 father[i] = i, 则说明元素 iii 是该集合的根结点,但对同一个集合来说只存在一个根结.原创 2021-05-02 23:09:29 · 111 阅读 · 1 评论 -
A* 算法 (A-star)
参考:A* Pathfinding for Beginners 及其 翻译目录The Search AreaStarting the SearchPath ScoringContinuing the SearchSummary of the A* MethodNotes on ImplementationFurther ReadingThe Search AreaLet’s assume that we have someone who wants to get from point A(gre原创 2020-11-08 14:17:39 · 436 阅读 · 0 评论 -
算法设计与分析 (一):算法的基本概念、函数的渐近的界
本文为 MOOC 算法设计与分析 的学习笔记目录算法设计的例子投资问题问题建模设计算法算法效率分析货郎问题 与 NP-hard 问题算法及其时间复杂度时间复杂度 定义算法的两种时间复杂度函数的渐近的界算法设计的例子投资问题mmm 元钱,投资 nnn 个项目. 效益函数 fi(x)f_i (x)fi(x),表示第 iii 个项目投 xxx 元的效益,i=1,2,…,ni =1, 2, …, ni=1,2,…,n. 求如何分配每个项目的钱数使得总效益最大?实例:5 万元,投资给 4 个项目,效益函数原创 2020-11-29 17:19:31 · 428 阅读 · 0 评论 -
线性结构 (一):线性表
作为数据结构的课程笔记,以便查阅。如有出错的地方,还请多多指正!注:C++忘得太厉害了。。算法先用C实现,等之后复习了再改成C++目录特点顺序表链式存储结构单链表遍历链表插入/删除元素动态建立单链表循环链表(circular linked list)双向链表(double linked list)静态链表(static linked list)一元多项式的表示及相加特点有限、序列、同构(元素同构,且不能出现缺项)在数据元素的非空有限集中存在唯一的一个被称作“第一个”的数据元素存在唯一的一原创 2020-08-08 12:59:16 · 227 阅读 · 1 评论 -
线性结构 (二):栈和队列
作为数据结构的课程笔记,以便查阅。如有出错的地方,还请多多指正!注:C++忘得太厉害了。。算法先用C实现,等之后复习了再改成C++目录栈(stack)栈的逻辑结构栈的存储结构顺序栈链栈应用函数的嵌套调用递归的实现回文游戏多进制转换表达式求值中缀表达式求值:操作数栈和运算符栈后缀表达式求值:只需要操作数栈将中缀表达式转换成后缀表达式迷宫问题队列(Queue)队列的逻辑结构队列的存储结构链队列顺序队列栈(stack)栈的逻辑结构限定仅在表尾进行插入或删除操作的线性表,表尾—栈顶,表头—栈底,不原创 2020-08-06 20:18:21 · 220 阅读 · 1 评论 -
数组与广义表(一):数组、矩阵的压缩存储
作为数据结构的课程笔记,以便查阅。如有出错的地方,还请多多指正!注:C++忘得太厉害了。。算法先用C实现,等之后复习了再改成C++目录数组数组的顺序存储结构矩阵的压缩存储对称矩阵三角矩阵对角矩阵稀疏矩阵定义稀疏矩阵的顺序压缩存储三元组表伪地址表示法稀疏矩阵转置——基于三元组表按M的列序转置快速转置稀疏矩阵的链式压缩存储:十字链表数组数组可以看作是一种特殊的线性表,即线性表数据元素本身又是一个线性表,每个元素都有一个直接后继数组结构固定,数组行列数不可变数据元素同构数组的顺序存储结构数原创 2020-08-03 10:38:51 · 1210 阅读 · 2 评论 -
树(一):基本概念、二叉树
作为数据结构的课程笔记,以便查阅。如有出错的地方,还请多多指正!注:C++忘得太厉害了。。算法先用C实现,等之后复习了再改成C++目录基本概念二叉树 Binary Tree二叉树的定义二叉树的性质二叉树的存储结构顺序存储结构二叉链表三叉链表双亲数组线索二叉树定义遍历线索链表建立线索链表(二叉树的线索化)遍历二叉树先序遍历中序遍历后序遍历层次遍历遍历二叉树的应用表达式树统计二叉树中叶子结点个数求二叉树深度复制二叉树建立二叉树的存储结构按先序遍历序列建立二叉树的二叉链表按层序遍历序列建立二叉树的二叉链表原创 2020-08-01 14:06:32 · 212 阅读 · 1 评论 -
树(二):树和森林
作为数据结构的课程笔记,以便查阅。如有出错的地方,还请多多指正!注:C++忘得太厉害了。。算法先用C实现,等之后复习了再改成C++目录树和森林树的存储结构双亲表示法孩子表示法多重链表孩子链表双亲孩子表示法孩子兄弟表示法(二叉树表示法、二叉链表表示法、长子兄弟表示法)森林与二叉树的相互转换森林转换成二叉树二叉树转换成森林树的遍历求树的深度森林的遍历树和森林树的存储结构双亲表示法结点结构;//结点结构typedef struct PTNode{ TElemType data;原创 2020-08-01 14:31:46 · 185 阅读 · 0 评论 -
树(三):哈夫曼树、哈夫曼编码
作为数据结构的课程笔记,以便查阅。如有出错的地方,还请多多指正!注:C++忘得太厉害了。。算法先用C实现,等之后复习了再改成C++目录基本概念定义构造Huffman树应用最佳判定树Huffman编码基本概念路径:从树中一个结点到另一个结点之间的分支构成这两个结点间的~路径长度:路径上的分支数树的路径长度:从树根到每一个结点的路径长度之和树的带权路径长度(wplwplwpl:Weighted Path Length):树中所有带权结点的路径长度之和WPL=∑k=1nwklkWPL=\su原创 2020-08-01 16:53:11 · 262 阅读 · 0 评论 -
图(一):基本概念、图的存储结构
作为数据结构的课程笔记,以便查阅。如有出错的地方,还请多多指正!注:C++忘得太厉害了。。算法先用C实现,等之后复习了再改成C++目录基本概念图的存储结构邻接矩阵邻接表逆邻接表十字链表基本概念图(Graph):G={V,E}G=\{V,E\}G={V,E},V(G)V(G)V(G)为顶点(Vertex)的非空有限集,E(G)E(G)E(G)为边(v,w)(v,w)(v,w) / 弧<v,w><v,w><v,w>的有限集合有向图(Digraph)无向图(U原创 2020-07-28 08:54:15 · 124 阅读 · 0 评论 -
图(二):图的遍历、最小生成树
作为数据结构的课程笔记,以便查阅。如有出错的地方,还请多多指正!注:C++忘得太厉害了。。算法先用C实现,等之后复习了再改成C++目录图的遍历 Traversing Graph深度优先搜索 DFS(Depth First Search)递归实现算法评价T(n)广度优先搜索 BFS(Broadth First Search)算法实现图的遍历算法应用求两个顶点间的一条简单路径求无权图中两个顶点间的最短路径生成树深度优先生成树、广度优先生成树生成森林最小生成树 Minimum Cost Spaning T原创 2020-07-28 19:58:50 · 609 阅读 · 0 评论 -
图(三):拓扑排序、关键路径
作为数据结构的课程笔记,以便查阅。如有出错的地方,还请多多指正!注:C++忘得太厉害了。。算法先用C实现,等之后复习了再改成C++目录拓扑排序 Topological Sort拓扑排序的方法算法实现关键路径 Critical Path问题提出基本概念问题分析算法实现有向无环图 / DAG图(directed acycline graph)拓扑排序 Topological Sort问题提出:学生选修课程问题学生应按怎样的顺序学习这些课程,才能无矛盾、顺利地完成学业?AOV网——用顶点原创 2020-07-31 17:48:13 · 554 阅读 · 1 评论 -
图(四):最短路径 (Dijkastra, Bellman-Ford, SPFA, Floyd)
作为数据结构的课程笔记,以便查阅。如有出错的地方,还请多多指正!注:C++忘得太厉害了。。算法先用C实现,等之后复习了再改成C++目录Dijkastra算法描述算法有效性证明算法实现邻接矩阵邻接表Floyd算法描述算法有效性证明算法实现DijkastraDijkastra用来解决单源点的最短路径问题:给定带权有向图GGG和源点vvv,求从vvv到GGG中其余各顶点的最短路径算法描述按路径长度非递减次序产生最短路径(贪心算法)把顶点的集合VVV分成两组:(1)SSS:{已求出最短路原创 2020-07-31 20:32:41 · 441 阅读 · 0 评论 -
查找 (一):静态查找表 (顺序查找、折半查找、分块查找)
作为数据结构的课程笔记,以便查阅。如有出错的地方,还请多多指正!注:C++忘得太厉害了。。算法先用C实现,等之后复习了再改成C++目录基本概念顺序查找 Sequential Search查找过程算法实现性能分析ASL总结折半查找 Binary Search查找过程算法实现性能分析判定树ASL总结*补充:证明在每个元素的搜索概率相等时,二分查找效率最高分块查找 / 索引顺序查找查找过程算法实现性能分析ASL查找方法比较基本概念查找表(Search Table):由同一类型的数据元素(或记录)构成原创 2020-07-26 15:02:51 · 713 阅读 · 0 评论 -
查找 (二):动态查找表 (二叉排序树、平衡二叉树、B-树、B+树、散列查找)
作为数据结构的课程笔记,以便查阅。如有出错的地方,还请多多指正!注:C++忘得太厉害了。。算法先用C实现,等之后复习了再改成C++目录二叉排序树 Binary Sort Tree定义查找过程查找最大、最小值插入元素删除元素性能分析平衡二叉树 Balanced Binary Tree (AVL树)定义平衡二叉树的插入RR型不平衡(破坏者在被破坏者的右子树的右子树上)LL型不平衡(破坏者在被破坏者的左子树的左子树上)LR型不平衡RL型不平衡*代码实现性能分析二叉排序树 Binary Sort Tree原创 2020-07-27 08:17:06 · 4430 阅读 · 1 评论 -
内部排序 (一):各种内部排序方法的比较
作为数据结构的课程笔记,以便查阅。如有出错的地方,还请多多指正!目录各种内部排序方法的比较地址排序(基于关键字比较的)内部排序在最坏情况下的最快速度各种内部排序方法的比较nnn较小/基本有序:可采用简单排序方法(直接插入、简单选择、冒泡排序)nnn较大:可采用快排、堆排。若要求稳定性,则采用归并排序从平均时间性能上看,快排最佳,但快排在最坏情况下的时间性能不如堆排和归并排序nnn较大时,归并排序比堆排序用时少,但所需的辅助存储量多基数排序适用于nnn很大,关键字个数较少的原创 2020-07-25 12:20:16 · 3245 阅读 · 0 评论 -
内部排序 (二):插入排序 (直接插入排序、折半插入排序、希尔排序)
作为数据结构的课程笔记,以便查阅。如有出错的地方,还请多多指正!注:C++忘得太厉害了。。算法先用C实现,等之后复习了再改成C++目录基本概念直接插入排序 Straight Insertion Sort排序过程算法实现算法评价T(n)S(n)是否稳定折半插入排序 Binary Insertion Sort排序过程算法实现算法评价T(n)S(n)是否稳定希尔排序 Shell Sort排序过程算法实现算法评价T(n)S(n)是否稳定基本概念内部排序:待排序记录存放在内存外部排序:待排序记录数原创 2020-07-22 21:29:05 · 292 阅读 · 0 评论 -
内部排序 (三):交换排序 Exchange Sorting (冒泡排序、快速排序)
作为数据结构的课程笔记,以便查阅。如有出错的地方,还请多多指正!注:C++忘得太厉害了。。算法先用C实现,等之后复习了再改成C++目录冒泡排序 Bubble Sort排序过程算法实现算法评价T(n)S(n)是否稳定快速排序 Quick Sort排序过程算法实现算法评价T(n)*补充:快排平均时间复杂度计算S(n)是否稳定总结冒泡排序 Bubble Sort排序过程思路:比较1st与2nd记录的关键字,若逆序则交换;然后比较2nd与3rd记录的关键字;……直至比较n-1th与nth记录为止。原创 2020-07-23 11:44:06 · 279 阅读 · 0 评论 -
内部排序 (四):选择排序 Selection Sorting (简单选择排序、堆排序)
作为数据结构的课程笔记,以便查阅。如有出错的地方,还请多多指正!注:C++忘得太厉害了。。算法先用C实现,等之后复习了再改成C++目录简单选择排序 Simple Selection Sort排序过程算法实现算法评价T(n)S(n)是否稳定堆排序 Heap Sort堆概念排序过程调整堆:筛选初建堆算法实现算法评价T(n)S(n)是否稳定总结简单选择排序 Simple Selection Sort排序过程思路:首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换原创 2020-07-23 16:01:43 · 193 阅读 · 1 评论 -
内部排序 (五):2-路归并排序 (2-way Merge Sort)
作为数据结构的课程笔记,以便查阅。如有出错的地方,还请多多指正!注:C++忘得太厉害了。。算法先用C实现,等之后复习了再改成C++目录2-路归并排序 2-way Merge Sort排序过程思路将两个有序子序列归并成一个有序子序列递归实现非递归实现算法实现算法评价T(n)S(n)是否稳定总结归并:将两个或两个以上的有序表组合成一个新的有序表通过归并两个或两个以上的记录有序子序列,逐步增加记录有序序列的长度2-路归并排序 2-way Merge Sort排序过程思路设初始序列含有nn原创 2020-07-23 19:10:50 · 516 阅读 · 0 评论 -
内部排序 (六):基数排序 (Radix Sort)
作为数据结构的课程笔记,以便查阅。如有出错的地方,还请多多指正!注:C++忘得太厉害了。。算法先用C实现,等之后复习了再改成C++目录多关键字排序 Multi-key Sort最高位优先法(MSD-Most Significant Digit first)最低位优先法(LSD-Least Significant Digit first)链式基数排序 Linked Radix Sort排序过程思路算法实现算法评价T(n)S(n)是否稳定多关键字排序 Multi-key Sort基数排序是一种借助原创 2020-07-23 22:48:17 · 1183 阅读 · 0 评论 -
外部排序 (多路平衡归并、置换选择排序、最佳归并树)
参考:http://data.biancheng.net/view/76.html、CSDN未完待续目录外部排序多路平衡归并排序算法(多路归并排序、胜者树、败者树)胜者树败者树败者树的效率置换选择排序算法最佳归并树外部排序当待排序的文件比内存的可使用容量还大时,文件无法一次性放到内存中进行排序,需要借助于外部存储器;对于外部排序算法来说,影响整体排序效率的因素主要取决于读写外存的次数外部排序算法由两个阶段构成:按照内存大小,将大文件分成若干子文件(子文件应小于内存的可使用容量),然后将各.原创 2021-01-15 15:58:22 · 1533 阅读 · 0 评论