数据结构笔记
文章平均质量分 65
乳酸君在此
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
单链表
线性链表采用一组任意的存储单元存放线性表,这组存储单元可以是连续的,也可以不是连续的。链表结点=数据域+指针域。单链表的每个结点只有一个指针域,所以叫做单链表。头结点:头结点是为了操作方便统一设立的,放在第一元素结点之前。有了头结点对第一元素结点的插入删除操作就跟其他结点的操作统一起来。头指针:若无头结点,头指针指向链表第一元素结点;若有头结点,头指针指向头结点。头指针是链表的必要原创 2014-01-17 22:28:03 · 636 阅读 · 0 评论 -
最短路径
对于网图来说,最短路径是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点是源点,最后一个顶点是终点。迪杰斯特拉算法:解决了从某个源点到其余各顶点的最短路径问题。此算法的时间复杂度是O(NxN)。#define MAXVEX 9#define INFINITY 65535typedef int Patharc[MAXVEX];typedef int S原创 2014-02-10 13:12:37 · 655 阅读 · 0 评论 -
拓扑排序
AOV网:在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称为AOV网。拓扑序列:设G={V, E}是具有n个顶点的有向图,V中的顶点序列v1, v2, ……vn,满足若从顶点vi到vj有一条路径,,则在顶点序列中顶点vi必须在顶点vj之前,则我们称这样顶点序列为一个拓扑序列。拓扑排序:所谓拓扑排序,其实就是对一个有向图构造拓扑序列原创 2014-02-10 15:50:53 · 629 阅读 · 0 评论 -
关键路径
AOE网:在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,用边上的权值表示活动的持续时间,这种有向图的边表示活动的网,我们称之为AOE网。把路径上各个活动所持续的时间之和称为路径长度,从源点到汇点具有最大长度的路径称为关键路径,在关键路径上的活动叫关键活动。关键路径算法:我们需要定义如下几个参数:1、事件的最早发生时间etv:即顶点v的最早发生时间。2、事件的最原创 2014-02-10 17:01:00 · 832 阅读 · 0 评论 -
查找的相关概念
查找表是由同一类型的数据元素(或记录)构成的集合。关键字是数据元素中某个数据项的值,又称为键值,用它可以标识一个数据元素。也可以标识一个记录的某个数据项,我们称为关键码。若此关键字可以唯一地标识一个记录,则称此关键字为主关键字。对于不同的记录,其主关键字均不同。主关键字所在的数据项称为主关键码。对于那些可以识别多个数据元素(或记录)的关键字,我们称为次关键字。它对应的数据项就是次关键码原创 2014-02-11 18:32:46 · 788 阅读 · 0 评论 -
顺序查找
顺序查找又叫线性查找,是最基本的查找技术,它的查找过程是:从表中第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录;如果直到最后一个(或第一个)记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查找不成功。顺序查找的算法实现:时间复杂度为O(n)int Sequential_Search(int *a, in原创 2014-02-11 18:42:12 · 618 阅读 · 0 评论 -
线性索引查找
索引就是把一个关键字与它对应的记录相关联的过程。一个索引由若干个索引项构成,每个索引项至少应包含关键字和其对应的记录在存储器中的位置等信息。索引技术是组织大型数据库以及磁盘文件的一种重要技术。索引按照结构可以分为线性索引、树形索引和多级索引。线性索引就是把索引项集合组织为线性结构,也称为索引表。这里介绍三种线性索引:稠密索引、分块索引、倒排索引稠密索引:稠密索引是指在线性索引中原创 2014-02-12 16:28:40 · 741 阅读 · 0 评论 -
有序表查找
折半查找:折半查找技术,又称为二分查找。它的前提是线性表中的记录必须是关键码有序(通常从小到大排序),线性表必须采用顺序存储。折半查找的基本思想是:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所有查找区域无原创 2014-02-11 18:58:31 · 842 阅读 · 0 评论 -
二叉排序树
二叉排序树:又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树。1、若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值。2、若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值。3、它的左、右子树也分别为二叉排序树。为什么需要二叉排序树?构造一棵二叉排序树的目的,其实并不是为了排序,而是为了提高查找和插入删除关键字的速度。二叉排序树原创 2014-02-27 22:14:37 · 584 阅读 · 0 评论 -
散列表(哈希表)
散列技术:散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对于一个存储位置f(key)。查找时,根据这个确定的对应关系找到给定值key的映射f(key),若查找集合中存在这个记录,则必定在f(key)的位置上。通过查找关键字不需要比较就可以获得需要的记录的存储位置。散列函数:这里我们把这种对应关系f称为散列函数,又称为哈希函数。散列表(哈希表):采用原创 2014-02-27 11:04:14 · 1136 阅读 · 0 评论 -
平衡二叉树
为什么需要平衡二叉树?不平衡的二叉排序树的查找效率是非常低的,不平衡的最坏情况就是斜树,查找的时间复杂度是O(n),等同于顺序查找。因此我们在构建时就让这棵二叉排序树是平衡二叉树,此时的查找时间复杂度是O(logn),插入和删除也为O(logn),这显然是一种比较理想的动态查找表算法。平衡二叉树:是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1。它是一种高度平衡的二叉原创 2014-02-27 19:21:42 · 885 阅读 · 0 评论 -
简单选择排序
简单选择排序算法:就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和i(1void SelectSort(SqList *L){ int i, j, min; for (i = 1; i length; i++) { min = i; for (j = i + 1; j length; j++) if (L->r[min] > L->r[j])原创 2014-02-18 15:47:52 · 601 阅读 · 0 评论 -
冒泡排序
冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。最简单的排序实现:void BubbleSort0(SqList *L){ int i, j; for (i = 1; i length; i++) for (j = i + 1; j length; j++) if (L->r[i] > L->r[j]) sw原创 2014-02-18 15:31:55 · 567 阅读 · 0 评论 -
直接插入排序
直接插入排序的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的,纪录数增1的有序表。void InsertSort(SqList *L){ int i, j; for (i = 2; i length; i++) if (L->r[i] r[i-1]) { L->r[0] = L->r[i]; for (j = i - 1; L->r[j] > L->原创 2014-02-18 18:20:40 · 524 阅读 · 0 评论 -
希尔排序
希尔排序是插入排序的一种,是针对直接插入排序算法的改进,该方法又称为缩小增量排序。希尔排序的基本思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个小组。所有距离为d1的倍数的记录放在同一组中。先在各组内进行直接插入排序;然后,取第二个增量d2需要注意的是,增量排序的最后一个增量值必须等于1才行。另外由于记录是跳跃式移动,希尔排序并不是一种稳定的排序算法。void原创 2014-02-19 14:15:45 · 660 阅读 · 0 评论 -
堆排序
堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或者等于其左右孩子结点的值,称为小顶堆。堆数组“:把大顶堆或小顶堆用层序遍历存入数组。堆排序就是利用对(假设利用大顶堆)进行排序的方法。它的基本思想是,将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根结点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就原创 2014-02-19 16:07:27 · 521 阅读 · 0 评论 -
快速排序
快速排序的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。快速排序算法的时间复杂度为O(nlogn)。由于关键字的比较和交换是跳跃进行的,因此,快速排序是一种不稳定的排序方法。void QuickSort(SqList *L){ QSort(L, 1, L->length);原创 2014-02-19 21:11:30 · 807 阅读 · 0 评论 -
归并排序
归并排序的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到int(n/2)个长度为2或1的有序子序列;再两两归并,……,如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序。void MergeSort(SqList *L){ MSort(L->r, L->r, 1, L->length);}void MSo原创 2014-02-19 18:02:04 · 663 阅读 · 0 评论 -
最小生成树
最小生成树:我们把构造连通网的最小代价生成树称为最小生成树。普里姆算法:假设N = {V, E}是连通网,TE是N上最小生成树中边的集合。算法从U={u0}(u0∈V),TE={}开始。重复执行下述操作:在所有u∈U,v∈V-U的边(u, v)∈E中找代价最小的边(u0, v0)并入集合TE,同时v0并入U,直至U=V为止。此时TE中必有n-1条边,则T={V, TE}为N的最小生原创 2014-02-09 21:22:02 · 601 阅读 · 0 评论 -
图的遍历
深度优先遍历深度优先遍历,也有称为深度优先搜索,简称为DFS。它从图中某个顶点v出发,访问此顶点,然后从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问了。若图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所以顶点都被访问到为止。对于n个顶点e条边的图来说,邻接矩阵的时间是复杂度是O(NxN),邻接表的时间复杂度是O(n+原创 2014-02-07 19:45:56 · 727 阅读 · 0 评论 -
循环链表
循环链表:将单链表中终端节点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表。循环链表往往设立指向终端结点的尾指针,而不是头指针。循环链表和单链表的主要差异在于循环的判断条件上,单链表是判断p->next是否为空,循环链表是p->next不等于头结点,则循环未结束。把循环链表A和循环链表B合并:p = rearA->next原创 2014-01-19 18:58:33 · 636 阅读 · 0 评论 -
静态链表
静态链表:用数组描述的链表叫做静态链表。数组元素 = 数据域 + 游标域描述静态链表的数组除了存储静态链表,还存储了一条备用链表。备用链表是存储未被使用的数组元素。数组的第一个元素和最后一个元素作为特殊元素处理。第一个元素的cur存放备用链表的第一个结点的下标。最后一个元素的cur存放静态链表的第一个结点的下标。备用链表和静态链表的最后一个元素的cur均为0。数组元原创 2014-01-18 22:31:31 · 643 阅读 · 0 评论 -
顺序线性表
线性表有两种物理结构:顺序存储结构和链式存储结构。顺序存储结构是指用一段连续的存储单元依次存储线性表的数据元素。可采用固定数组或动态分配一段连续的存储单元作为顺序存储结构。下面以C语言的一维数组来实现顺序线性表。插入删除操作的最好情况是在最后位置进行操作,因为无需移动任何元素,时间复杂度是O(1),最坏情况是在第一个位置进行操作,因为要移动所以元素,时间复杂度是原创 2014-01-14 18:04:30 · 632 阅读 · 0 评论 -
双向链表
双向链表是在单链表的每个结点当中,再设置一个指向其前驱结点的指针域。双向链表中的结点有两个指针域,一个指向直接后继,一个指向直接前驱。双向链表的结点存储结构typedef struct DulNode{ ElemType data; struct DulNode *prior; struct DulNode *next;} DulNode, *Dul原创 2014-01-19 19:12:53 · 665 阅读 · 0 评论 -
队列
队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。队列可按存储结构分为顺序队列和链队列。我们把头尾相接的顺序存储结构称为循环队列。font指针指向队头元素,rear指向队尾元素的下一个位置。队列长度:(rear - font + MAXSIZE) % MAXSIZE原创 2014-01-30 18:26:08 · 554 阅读 · 0 评论 -
栈
栈是限定仅在表尾进行插入和删除操作的线性表。允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈。栈又称为后进先出的线性表,简称LIFO结构。栈的插入操作,叫做进栈,也称压栈,入栈。栈的删除操作,叫做出栈,也称弹栈。最先进栈的元素是不是只能是最后出栈?答案是不一定!栈的顺序存储结构数组下标为0的一端作为栈底,定义top变量来指示栈顶元素在数组中原创 2014-01-30 20:06:38 · 641 阅读 · 0 评论 -
栈的应用
栈的应用1--递归把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称做递归函数。写递归最怕的就是陷入永不结束的无穷递归中,所以,每个递归定义必须至少有一个条件,满足时递归不再进行,即不再引用自身而是返回值退出。迭代和递归的区别是:迭代使用的是循环结构,递归使用的是选择结构。递归能是程序的结构更清晰,更简洁,更容易让人容易理解,从而减少读懂代码的时间。但是大量的递归调用会建原创 2014-01-30 22:53:17 · 574 阅读 · 0 评论 -
树的存储结构
1、双亲表示法以一组连续空间存储树的结点,同时在每个结点中,附设一个指示器指示其双亲结点在数组中的位置。其中data是数据域,存储结点的数据信息。parent是指针域,存储该结点的双亲在数组中的下标。# define MAX_TREE_SIZE 100typedef int TElemType;typedef struct PTNode{ TElemType data; int原创 2014-02-02 15:33:18 · 614 阅读 · 0 评论 -
串
串是由零个或多个字符组成的有限序列,又称为字符串。串中的字符数目称为串的长度。零个字符的串称为空串,它的长度为零。空格串,是只包含空格的串。空格串是有内容有长度的,而且可以不止是一个空格。子串与主串,串中任意个数的连续字符组成的子序列称为该串的子串,相应地,包含子串的串称为主串。子串在主串中的位置就是子串的第一个字符在主串中的序号。串的比较是通过组成串的字符之间的编码来进行原创 2014-02-01 21:40:03 · 694 阅读 · 0 评论 -
树的相关概念
树:树是n(n >= 0)个结点的有限集。n=0时称为空树。在任意一棵非空树中:(1)有且只有一个特别的称为根的结点;(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2, T3,......,Tm,其中每一个集合本身又是一棵树,并且成为根的子树。结点:1、树的结点包含一个数据元素以及若干指向其子树的分支。2、结点的度:结点拥有的子树数称为结点的度。原创 2014-02-02 00:05:59 · 548 阅读 · 0 评论 -
二叉树的相关概念
二叉树:二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的,分别称为根结点的左子树和右子树的二叉树组成。二叉树的特点:1、每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。注意,不是只有两棵子树,而是最多有。没有子树或者有有一颗子树都是可以的。2、左子树和右子树是有顺序的,次序不能任意颠倒。即使树中某结点只有一棵子原创 2014-02-02 16:51:00 · 726 阅读 · 0 评论 -
二叉树的存储、遍历、建立
二叉树的存储:1、顺序存储:对于一般的二叉树,添加一些空结点,使之成为完全二叉树的形式。按照完全二叉树2、二叉链表:原创 2014-02-04 14:17:10 · 998 阅读 · 0 评论 -
线索二叉树
线索二叉树:对于一个有n个结点的二叉链表,每个结点有指向左右孩子的两个指针域,所以一共是2n个指针域。而n个结点的二叉树一共有n-1条分支线,也就是说存在n+1个空指针域。我们可以考虑利用那些空地址,存放指向结点在某种遍历次序下的前驱和后继结点的地址。我们把这种指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索链表,相应的二叉树就称为线索二叉树。我们对二叉树以某种次序遍历使其原创 2014-02-04 18:12:03 · 895 阅读 · 0 评论 -
树、森林和二叉树的转换
1、树转换为二叉树(1)加线。在所有兄弟结点之间加一条连线。(2)去线。对树中每个结点,只保留它与第一个孩子结点的连线,删除它与其他孩子结点之间的连线。(3)层次调整。以树的根结点为轴心,将整棵树顺时针旋转一定的角度,使之结构层次分明。注意第一个孩子是二叉树的左孩子,兄弟转换过来的孩子是结点的右孩子。2、森林转换为二叉树森林是由若干棵树组成的,可以理解为,森林中的每一棵原创 2014-02-04 19:02:09 · 867 阅读 · 0 评论 -
赫夫曼树
从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称做路径长度。树的路径长度就是从树根到每一个结点的路径长度之和。结点的带权路径长度为从该结点到树根之间的路径长度与结点上权的乘积。树的带权路径长度为树中所以叶子结点的带权路径长度之和。带权路径长度WPL最小的二叉树称做赫夫曼树,也称最优二叉树。构造赫夫曼树:(1)根据给定的n个权值{w1,原创 2014-02-04 19:32:53 · 939 阅读 · 0 评论 -
图的相关概念
图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。(1)线性表中我们把数据元素叫做元素,树种把数据元素叫做结点,在图中数据元素,我们则称之为顶点。(2)线性表中可以没有数据元素,称为空表。树中可以没有结点,叫做空树。在图结构中,不允许没有顶点。(3)线性表中,相邻的数据元素之间具有线性关系。树结构中,相原创 2014-02-05 14:20:43 · 866 阅读 · 0 评论 -
图的五种存储结构
图是由顶点和边或弧两部分来组成,所以分两个结构来分别存储。1、邻接矩阵图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。无向图的边数组是一个对称矩阵。有了这个矩阵,我们就可以知道无向图的信息:(1)要判断任意两个顶点是否有边无边,只需要查找arc[i][j]或arc[j][i]是否为1即可。(2)要知道某原创 2014-02-07 16:44:53 · 2997 阅读 · 0 评论 -
排序的相关概念
排序:假设含有n个记录的序列为{r1, r2, ……, rn},其相应的关键字分别为{k1, k2, ……, kn},需确定1,2,……, n的一种排列p1, p2……, pn,使其相应的关键字满足kp1多个关键字排序最终都可以转化为单个关键字的排序。下面讨论的是单个关键字的排序。排序的稳定性:假设ki=kj(1内排序与外排序:内排序是在排序整个过程中,待排序的所有记录全部被放置在原创 2014-02-18 14:14:25 · 611 阅读 · 0 评论
分享