数据结构
文章平均质量分 88
融合多本数据结构书籍精华的干货总结,每一种结构均配有完整C语言代码实现,方便学习或巩固复习数据机构基础。
Time-space
这个作者很懒,什么都没留下…
展开
-
【笔记】归并排序
归并排序:是又一类不同的排序方法。“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。无论是顺序存储结构还是链表存储结构,都可在O(m+n)O(m+n)的时间量级上实现。 基本算法思想:假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n2][\frac{n}{2}]个长度为2或1的有序子序列,再两两归并……如此重复,直至得到一个原创 2017-11-12 00:16:09 · 366 阅读 · 0 评论 -
【笔记】基数排序
基数排序是一种借助多关键字排序的思想对单逻辑关键字进行排序的方法。 一般情况下,假设有n个记录的序列R1,R2,…,Rn{R_1,R_2,…,R_n}且每个记录RiR_i中含有d个关键字(K0i,K1i,…,Kd−1i)(K^0_i,K^1_i,…,K^{d-1}_i),则称序列对关键字有序是指:对于序列中的任意两个记录RiR_i和Rj(1≤ij≤n)R_j(1\leq i都满足下列有序关系原创 2017-11-17 01:10:04 · 471 阅读 · 0 评论 -
【笔记】静态查找算法
顺序表的查找有序顺序表的查找顺序查找折半查找索引顺序表的查找静态查找应用实例 关键字与主关键字:数据元素中某个数据项的值。如果该关键字可以将所有的数据元素区别开来,也即可以唯一标识一个数据元素,则该关键字称为主关键字,否则称为次关键字。特别地,如果数据元素只有一个数据项,则数据元素的值即是关键字。 查找表:是由同种类型的数据元素构成的集合。查找表中的数据元素是完全原创 2017-11-17 21:19:00 · 565 阅读 · 0 评论 -
【笔记】二叉排序树
二叉排序树的定义二叉排序树的查找二叉排序树的删除二叉排序树应用举例 二叉排序树也称为二叉查找树。二叉排序树的查找是一种常用的动态查找方法。1.二叉排序树的定义 二叉排序树或者是一棵空二叉树,或者二叉树具有下列性质: 如果二叉树的左子树不为空,则左子树上的每一个结点的值均小于其对应根结点的值。 如果二叉树的右子树不为空,则右子树上的每一个结点的值均原创 2017-11-19 01:31:31 · 690 阅读 · 0 评论 -
【笔记】平衡二叉树
若二叉排序树的深度为n,在最坏的情况下平均查找长度为n,为了减少二叉排序树的查找次数,需要对二叉排序树进行平衡化处理,平衡化处理后得到的二叉树称为平衡二叉树。1.平衡二叉树的定义 平衡二叉树又称为AVL树,它或者是一棵空树,或者左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。原创 2017-11-20 23:33:16 · 1290 阅读 · 0 评论 -
【笔记】B-树和B+树
B-树的定义B-树的查找B-树的插入操作B-树的删除操作B+树原创 2017-11-21 23:22:19 · 3736 阅读 · 0 评论 -
【笔记】哈希表
查找算法的高取决于比较的次数。如果不经过比较就能确定要查找的元素的位置,那么查找效率就会大大提高,这就需要建立一种数据元素的关键字与数据元素存放地址之间的对应关系,通过数据元素的关键字直接确定其存放的位置,即哈希表,又称散列表。原创 2017-11-25 01:34:08 · 477 阅读 · 0 评论 -
【笔记】图的基础知识
图是一种比线性表、树更为复杂的数据结构。图是一种非线性的数据结构,图中的数据元素之间的关系是多对多的关系。1.图的定义 图是由数据元素集合V与边的集合E构成的。在图中,数据元素通常称为顶点。其中,顶点集合V不能为空,边表示顶点之间的关系。原创 2017-11-29 17:27:54 · 622 阅读 · 1 评论 -
【笔记】图的存储结构
邻接矩阵法邻接表法十字链表法邻接多重链表法原创 2017-11-29 23:29:11 · 592 阅读 · 0 评论 -
【笔记】图的遍历
图的深度优先搜索的概念图的深度优先搜索的实现图的广度优先搜索的概念图的广度优先搜索的实现图的遍历算法源码原创 2017-12-01 00:03:38 · 1416 阅读 · 0 评论 -
【笔记】图的连通性
无向图的连通分量最小生成树的概念普里姆算法克鲁斯卡尔算法应用示例1.无向图的连通分量 在对无向图进行遍历时,对于连通图,仅需从图的任何一个顶点出发进行深度优先搜索遍历或广度优先搜索遍历就可访问到图中的所有顶点;对于非连通图,则需从多个顶点出发进行搜索,而且每一次从一个新的起始点出发进行搜索过程中得到的顶点访问序列恰为其各个连通分量中的顶点集。 如下图所示,图G3原创 2017-12-01 01:31:46 · 3032 阅读 · 0 评论 -
【笔记】AOV网与拓扑排序
无环路有向图AOV网拓扑排序AOV网的拓扑排序算法实现原创 2017-12-01 13:07:58 · 6660 阅读 · 1 评论 -
【笔记】AOE网与关键路径
AOE网关键路径求关键路径的算法实现原创 2017-12-02 01:06:32 · 47335 阅读 · 7 评论 -
【笔记】单源点最短路径
单源点最短路径迪杰斯特拉算法迪杰斯特拉算法实现应用实例1.单源点最短路径 单源点最短路径问题:给定图G=(V,E),每条边(i,j)上都标有非负实数C[i][j]作为它的权;在图中指定一个顶点v作为源点,求从v到其他每个顶点的最短路径长度。单源最短路问题的进一步推广是求每对顶点之间的最短路径。2.迪杰斯特拉算法 基本思想:将V分成两个集合S和V-S。其中S是最短路径已经确定的顶点集合原创 2018-01-01 19:31:34 · 1072 阅读 · 0 评论 -
【笔记】每一对顶点间的最短路径
每一对顶点间的最短路径弗洛伊德算法弗洛伊德算法的实现1.每一对顶点间的最短路径 如果要计算每一对顶点之间的最短路径,需每次以一个顶点为出发点,将迪杰斯特拉算法重复执行n次,就可以得到每一对顶点的最短路径,总的时间复杂度为O(n3)O(n^3)。如果采用弗洛伊德算法,虽然时间复杂度也是O(n3)O(n^3),但是形式更简单。2.弗洛伊德算法 基本算法思想原创 2018-01-13 23:14:59 · 2420 阅读 · 0 评论 -
【练习】图的出度计算
题目:有一个邻接表存储的图G,分别设计实现如下要求的算法: (1)求出图G中每个顶点的出度; (2)求出图G中出度最大的一个顶点,输出该顶点的编号; (3)计算图G中出度为零的顶点数; (4)判断图G中是否存在边i,j>。 分析:从图的表头结点出发,一次访问边表结点,并进行计数,就可得到相应每个顶点的出度。问题4可令p=G.vertex.firstarc,然后一次遍历p指向链表中的每原创 2018-01-16 01:30:09 · 3935 阅读 · 0 评论 -
【笔记】线段树
一、线段树的基本概念二、线段树的基本操作1.建立线段树 与区间有关的操作,比如统计线段的长度、记录一个区间内子线段的分布、统计落在区间内的数据频率等,并在线段或数据的插入、删除和修改中维护这些特征值。线段树具有良好的树形二分结构,能够高效地完成这些操作。一、线段树的基本概念 一颗二叉树,即为T(a,b),参数a,b表示该节点表示区间[a,b]。区间长度b-a...原创 2018-03-07 17:13:11 · 208 阅读 · 0 评论 -
【笔记】堆及其实现
有一种特殊形式的完全二叉树——堆,它有两种基本形式:最大堆和最小堆。 最大堆:如果一颗完全二叉树的任意一个非终结结点的元素都不小于其左儿子结点和右儿子结点的元素,则称此完全二叉树为最大堆。 最小堆:如果一颗完全二叉树的任意一个非终结结点的元素都不大于其左儿子结点和右儿子结点的元素,则称此完全二叉树为最小堆。 最大堆的根结点中的元素在整个堆中是最大的;而最小堆的根结点中的元素在整个堆中是最小的。原创 2017-10-29 19:33:41 · 386 阅读 · 0 评论 -
【笔记】内部排序算法
一排序的基本概念二插入排序直接插入排序折半插入排序2-路插入排序表插入排序希尔排序三交换排序冒泡排序快速排序四选择排序简单选择排序树形选择排序堆排序五归并排序六基数排序桶排序七词典排序八各种内部排序算法的比较原创 2017-11-03 00:18:04 · 546 阅读 · 0 评论 -
【笔记】直接插入排序
插入排序的算法思想:将待排序元素分为已排序子集和未排序子集,一次从未排序子集中的一个元素插入已排序子集中,使已排序自己仍然有序;重复执行以上过程,指导所有元素都有序为止。直接插入排序是一种最简单的插入排序算法。原创 2017-11-03 11:37:20 · 575 阅读 · 0 评论 -
【笔记】折半插入排序
折半插入排序:算法是直接插入排序的改进。它的主要改进在于在已经有序的集合中使用折半查找法确定待排序元素的插入位置, 找到要插入的位置后,将待排序元素插入相应的位置。原创 2017-11-03 11:40:10 · 4233 阅读 · 0 评论 -
【笔记】2-路插入排序
插入排序:将待排序元素分为已排序子集和未排序子集,一次从未排序子集中的一个元素插入已排序子集中,使已排序自己仍然有序;重复执行以上过程,指导所有元素都有序为止。 2-路插入排序是在折半插入排序的基础上再改进,其目的是减少排序过程中移动记录的次数,但为此需要n个记录的辅助空间。 基本算法思想:另设一个与L.r同类型的数组d,首先将L.r[1]赋值给d[1],并将d[1]看成是在排好原创 2017-11-03 11:52:58 · 705 阅读 · 0 评论 -
【笔记】表插入排序
插入排序:将待排序元素分为已排序子集和未排序子集,一次从未排序子集中的一个元素插入已排序子集中,使已排序自己仍然有序;重复执行以上过程,指导所有元素都有序为止。 #define SIZE 100 /* 静态链表容量 */ typedef int KeyType; /* 定义关键字类型为整型 */ typedef struct { KeyType key; /* 关键字项 */原创 2017-11-03 11:59:02 · 1689 阅读 · 0 评论 -
【笔记】希尔排序
插入排序:将待排序元素分为已排序子集和未排序子集,一次从未排序子集中的一个元素插入已排序子集中,使已排序自己仍然有序;重复执行以上过程,指导所有元素都有序为止。 希尔排序又称为缩小增量排序,它也是一种属插入排序类的方法,但在事件效率上较前述集中排序方法都有较大的改进。 从对直接插入排序的分析得知,其算法时间复杂度为O(n2)O(n^2),但是若待排记录序列为“正序”时,其时间复杂度可提原创 2017-11-03 12:06:33 · 500 阅读 · 0 评论 -
【笔记】冒泡排序
基本算法思想:首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序(L.r[1].key>L.r[2].key),则将两个记录交换之,然后比较第二个记录和第三个记录的关键字。依此类推,直至第n-1个记录和第n个记录的关键字进行过比较为止。上述过程称为第一趟冒泡过程,其结果使得关键字最大的记录被安置到最后一个记录的位置上。原创 2017-11-05 15:56:21 · 383 阅读 · 0 评论 -
【笔记】快速排序
快速排序是对冒泡排序的一种改进。基本算法思想:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。原创 2017-11-05 16:18:08 · 416 阅读 · 0 评论 -
【笔记】简单选择排序
基本算法思想:假设待排序的元素序列有n个, 在第一趟排序过程中,从n个元素序列中选择最喜爱哦的元素,并将其放在元素序列的最前面即第一个位置。在第二趟排序过程中,从剩余的n-1个元素中选择最小的元素,将其放在第二个位置。依此类推,指导没有待比较的元素,简单选择排序算法结束。原创 2017-11-05 19:29:33 · 512 阅读 · 0 评论 -
【笔记】树形选择排序
树形选择排序:又称为锦标赛排序,是一种按照锦标赛的思想进行选择排序的方法。基本算法思想:首先对n个记录的关键字进行两两比较,然后在其中[n2\frac {n}{2}]个较小者之间再进行两两比较,如此重复,直至选出最小关键字的记录为止。这个过程可用一棵有n个叶子结点的完全二叉树表示。原创 2017-11-05 19:51:54 · 1613 阅读 · 1 评论 -
【笔记】堆排序
堆排序只需要记录一个记录大小的辅助空间,每个待排序的记录仅占有一个存储空间。 基本算法思想:使记录序列按关键字非递减有序排列,则在堆排序的算法中先建立一个最大堆,即先选得一个关键字为最大的记录并与序列中最后一个记录交换,然后对序列中前n-1记录进行筛选,重新将它调整为一个最大堆,如此分那副直至排序结束。原创 2017-11-11 23:59:09 · 892 阅读 · 0 评论 -
【笔记】抽象数据型及算法复杂性
数据结构的研究对象抽象数据型算法及其复杂性时间复杂性分析的基本方法原创 2017-10-05 11:27:07 · 543 阅读 · 0 评论 -
【笔记】遍历二叉树的应用
二叉树的计数求叶子节点的最大最小枝长判断两颗二叉树是否相似交换二叉树的左右子树求根节点到r结点之间的路径1.二叉树的计数 二叉树的计数也可以通过遍历二叉树来实现,关于二叉树计数的算法有求二叉树叶子节点的个数、非叶子节点的个数。计算二叉树叶子结点个数 求二叉树的叶子节点的个数递归定义如下。leaf(T)=⎧⎩⎨⎪⎪0,1,leaf(T−>lchild原创 2017-10-29 09:25:54 · 965 阅读 · 0 评论 -
【笔记】线性表及其应用
一线性表的概念线性表的类型定义线性表的顺序表示线性表的链式表示顺序存储结构与链式存储结构对比二线性表的实现线性表的顺序表示实现线性表的链式表示实现三线性表的应用制作简易通讯录学生成绩管理系统原创 2017-10-06 23:29:16 · 2590 阅读 · 0 评论 -
【笔记】栈及其应用
一栈的定义二栈的表示和实现顺序栈的实现栈的链式表示与实现三栈的应用算术表达式求值一、栈的定义 栈是限定仅在表尾进行插入或删除操作的线性表。对栈来说,表尾端具有其特殊含义,称为栈顶,相应地,表头端称为栈底。不含元素的空表称为空栈。栈又称为后进先出的线性表(简称LIFO结构)。二、栈的表示和实现 栈的基本操作只有两个: 入栈(Push):即将数据保存到栈顶。进行该操作前,先修改栈原创 2017-10-09 00:29:50 · 541 阅读 · 0 评论 -
【笔记】链式队列
一链式队列的表示链式队列链式循环队列二链式队列的实现一、链式队列的表示1.链式队列 用链表表示的队列,简称为链队列。链式队列在插入和删除过程中不需要移动大量的元素,只需要改变指针的位置即可。 一个链式队列显然需要两个分别指示队头和队尾的指针(分别称为头指针和尾指针)才能唯一确定。空的链队列的判决条件为头指针和尾指针均指向头结点。 2.链式循环队列原创 2018-01-30 20:55:13 · 756 阅读 · 0 评论 -
【笔记】顺序队列
一队列的定义二队列的顺序存储表示顺序队列顺序循环队列三队列的顺序存储实现顺序队列的实现顺序循环队列的实现顺序循环队列的应用一、队列的定义 和栈相反,队列说一种先进先出(缩写为FIFO)的线性表。它只允许在表的一端进行插入,在另一端除元素。在队列中,允许插入的一端叫队尾,允许删除的一端则成为队头。 还有一种限定性的数据结构说双端队列。双端队列是限定插原创 2017-10-10 13:31:21 · 1675 阅读 · 0 评论 -
【笔记】树
一树的概念树的定义树的相关术语树的表示二二叉树二叉树的概念二叉树的性质二叉树的存储二叉树的实现二叉树的遍历线索二叉树三二叉树的应用堆及其实现遍历二叉树的应用四树森林与二叉树的关系原创 2017-10-12 23:04:29 · 415 阅读 · 0 评论 -
【笔记】线索二叉树
线索二叉树的概念线索化二叉树遍历线索二叉树在中序线索二叉树中查找结点的直接前驱在中序线索二叉树中查找结点的直接后继中序遍历线索二叉树在后续线索二叉树中查找后继结点线索二叉树应用示例 采用二叉链表作为二叉树的存储结构,只能找到结点的左、右孩子结点,而不能直接找到该结点的直接前驱和后继结点信息,这种信息只能在对二叉树的遍历过程中才能找到,显然这不是最直接、最简便的方法。为原创 2017-10-29 11:09:31 · 818 阅读 · 0 评论 -
【笔记】树的表示与实现
树的抽象数据型树的表示树的数组表示树的邻接表表示树的左右链表示法树的实现原创 2017-10-29 22:31:55 · 1160 阅读 · 0 评论 -
【笔记】树、森林与二叉树的转换与应用
树和森林转换为二叉树二叉树转换为树和森林森林的遍历树与二叉树的应用由两种遍历序列确定二叉树树的广义表形式表示原创 2017-10-30 01:05:51 · 1442 阅读 · 0 评论 -
【笔记】哈夫曼树
哈夫曼树的概念哈夫曼树的构造算法哈夫曼编码哈夫曼编码算法的实现原创 2017-11-01 00:34:54 · 10010 阅读 · 0 评论