![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
不戴眼镜的眼镜男
这个作者很懒,什么都没留下…
展开
-
1.1数据结构的基本概念
数据结构的基本概念1.数据:数据是信息的载体,是描述客观事物属性的数、字符以及所有能够输入到计算机中并被计算程序识别和处理的符号的集合。2.数据元素:数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。一个数据元素可以由若干个数据项组成,数据项是构成数据元素的不可分割的最小单位。例如,学生记录就是一个数据元素,它由学号、姓名、性别等数据组成。3.数据类型:数据类型是一个值的集合和定义在...原创 2019-08-13 21:21:09 · 434 阅读 · 0 评论 -
1.2算法和算法复杂度
算法和算法复杂度1.算法:对问题求解步骤的描述,通过有限序列的指令来实现。五大特征:1.有穷性:有限步之后结束 不会出现无线循环。2.确定性:不存在二义性,算法的每个步骤被精确定义。3.可行性:比如受限于计算机的计算能力,有些算法虽然理论上可行,但实际上无法完成。4.输入:能被计算机处理的各种类型数据,如数字,音频,图像等等。5.输入:一至多个程序输出结果。2算法复杂度:时...原创 2019-08-13 00:20:27 · 538 阅读 · 0 评论 -
2.1线性表
2.1线性表note:线性表是一种逻辑结构,表示元素之间的一对一相邻关系。顺序表和链表是线性表的顺序存储和链式存储。定义:线性表定义:具有相同数据结构类型的n(n>=0)个数据元素的有限序列,其中n为表长。n=0为空表。L=(a1,a2,a3,a4,…,an) a1唯一的第一个元素:表头元素。an唯一的最后一个元素:表尾元素。逻辑特性:除表头元素外,每个元素有且仅有一个直接前...原创 2019-08-14 22:35:03 · 141 阅读 · 0 评论 -
2.2线性表的顺序表示
线性表的顺序表示2.2.1定义线性表的顺序表示又叫顺序表。它用一组地址连续的内存单元依次存储线性表的数据元素,从而使逻辑上相邻的两个元素在物理位置也相邻。特点:表中元素的逻辑顺序和物理顺序相同。优点:@最主要的特点是随机访问(首地址,元素序号—>指定元素O(10)。@存储密度高,每个结点只存储数据元素。缺点:@特点导致插入和删除操作需要移动大量的元素。@最存储空间要求高,会...原创 2019-08-14 22:39:08 · 153 阅读 · 0 评论 -
2.3线性表的链式表示
2.3线性表的链式表示定义:线性表的链式存储又称为单链表,它是指通过一簇任意的单元来存储线性表的数据元素。为了建立数据元素之间的线性关系,对每个链表结点,除了存放元素自身的信息之外,还需要存放一个指向其后继的指针。单链表中节点的描述:typedef struct LNode()//定义单链表节点类型 { ElemType data;//数据域 struct LNode *next;...原创 2019-08-16 21:29:10 · 181 阅读 · 0 评论 -
2.4顺序表和链表的比较以及实际中用法的选择
2.4顺序表和链表的比较1.存取方式:顺序表可以顺序存取,也可以随机存取,链表只能从表头顺序存取元素。2.逻辑结构和物理结构:采用顺序存储时,逻辑上相邻的元素,其对应的物理存储位置也相邻。而采用链式存储时,逻辑上相邻的元素,其物理存储位置则不一定相邻,其对应的的逻辑关系是通过指针链接来表示的。3.查找、插入和删除操作:对于按值查找时,顺序表无序时,两者的时间复杂苏均为O(1):顺序表有...原创 2019-08-16 21:34:28 · 433 阅读 · 0 评论 -
3.1栈
3栈定义:(Stack)只允许在一端进行插入或者删除的线性表。栈顶(Top):栈中允许插入和删除的那一端。栈底(Bottom):固定,不允许进行插入和删除的那一端。特点:@栈是受限的线性表,所以自然具有线性关系。@栈中元素后进去必然先出来,即后进先出LIFO(Last In First Out )栈的顺序结构:栈是线性表的特例,那站的顺序存储也是线性表顺序存储的简化。栈的顺序存储...原创 2019-08-17 22:08:06 · 156 阅读 · 0 评论 -
3.2队列
3.2队列定义:只允许在一端进行插入,而在另一端进行删除的线性表。队头(Front):允许删除的一端,又称为队首。队尾(Rear):允许插入的一端。特点:先进先出的元素必然先离开队列,即先进先出(First In First Out )简称FIFO。顺序队列:由来:又是组实现队列,可以将队首放在数组的下标为0的位置。这样入队操作复杂度为O(1),但是出队操作复杂度为O(n)。这样我们...原创 2019-08-18 22:03:40 · 210 阅读 · 0 评论 -
3.3栈的应用
3.3栈的应用1.括号匹配:问题介绍:假设有两种括号,一种圆的(),一种方的【】,嵌套的顺序是任意的。算法思想:若是左括号,入栈;若是右括号,出栈一个左括号判断是否与之匹配;检验到字符串尾,还要检查栈是否为空。只有栈空,整个字符串才是括号匹配的。bool Check(char *str){ stack s; InitSatack(s); int len = strlen(str);...原创 2019-08-19 21:40:27 · 179 阅读 · 0 评论 -
3.4特殊矩阵和压缩矩阵
3.4特殊矩阵和压缩矩阵类比数组:一维数组:二维数组,采用映射的方法:按行优先和按列优先行优先:列优先:矩阵的压缩存储矩阵的压缩存储:指多个值相同的元素只分配一个存储空间,队零元素不分配存储空间。特殊矩阵:指具有许多相同矩阵元素或零元素,并且这些相同矩阵元素或者零元素的分布具有一定规律的矩阵。(对称矩阵、上(下)三角矩阵、对角矩阵)对称矩阵 :若一个n阶方阵A[1…n][1...原创 2019-08-20 22:22:44 · 748 阅读 · 2 评论 -
4.1树的基本概念
4.1树的基本概念定义:树是N(N>=0)个结点的有限集合,N=0时,称为空树,这是一种特殊情况。在任意一颗非空树中应满足:1)有且仅有一个特定的称为根的结点。2)当N>1时,其余结点可分为m(m>0)个无互不相交的有限集合T1,T2,…,Tm,其中每一个集合本身又是一棵树,并且称其为根结点的子树。结构:一对多的树型结构。基本概念:树的特性:@树中的结点树数等于...原创 2019-08-21 21:30:43 · 198 阅读 · 0 评论 -
4.2树的存储结构
4.2树的存储结构顺序存储结构:双亲表示法:用一组连续的存储空间存储树的结点,同时在每个结点中,用一个变量存储该结点的双亲结点在数组中的位置。(孩子少的时候)结构:typedef char ElemType;typedef struct TNode{ ElemType data; //结点数据 int parent; //该结点双亲在数组中的下标}TNode; ...原创 2019-08-21 21:33:09 · 340 阅读 · 0 评论 -
4.3二叉树
4.3二叉树基础概念:二叉树n个结点的有限集合:1.或者为空二叉树,即n=0。2.或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一颗二叉树。特性:1.每个结点最多有两颗子树。2.左右子树有顺序。五种基本型态:1.空树。2.只有一个根结点。3.根结点只有左子树。4.根结点只有右子树。5.根结点既有左子树又有右子树。特殊二叉树:1.斜...原创 2019-08-22 11:45:38 · 226 阅读 · 0 评论 -
4.4二叉树的存储结构
4.4二叉树的存储结构顺序存储定义:用一组地址连续的存储单元依次自上而下,自左至右存储完全二叉树上的结点元素。这种存储浪费存储空间所以考虑链式。链式存储:二叉树每个结点最多两个孩子,所以设计二叉树的结点结构时堪虑两个指针指向该结点的两个孩子。二叉链表:typedef struct BiTNode{ ElemType data; //数据域 struct BiTNode *l...原创 2019-08-22 11:47:03 · 275 阅读 · 0 评论 -
4.5二叉树的遍历
4.5二叉树的遍历定义:二叉树的遍历是指按某种次序依次访问树中的每个结点,是得每个结点均被访问一次。(递归)1.先序遍历操作过程:@为空,什么也不做;(递归边界)@否则,访问根结点;@先序遍历左子树;@先序遍历右子树。遍历序列:A B D G C E Fvoid PreOrder(BiTree T){ if(T!=NULL){ printf("%c"T->data...原创 2019-08-23 19:10:59 · 112 阅读 · 0 评论 -
4.6线索化二叉树
4.6线索化二叉树(不用栈实现二叉树的非递归遍历)中序遍历队二叉树线索化的递归算法:void InTread(p->lchild,pre){ //中序遍历队二叉树线索化的递归算法 if(p){ if(p->lchild==NULL){ p->lchild=pre; p->ltag=1; ...原创 2019-08-23 19:12:16 · 223 阅读 · 0 评论 -
4.7哈夫曼树和哈夫曼编码
4.7哈夫曼树和哈夫曼编码概念:权:树中结点相关的数据路径长度:从树中某个结点到另外一个结点之间的分支数目(经过的边数)带权路径的长度:从树的根结点到任意结点的路径长度(经过的边数)与该结点上权值的乘积称为该结点的带权路径长度。树中所有叶结点的带权路径长度之和称为该树的带权路径长度哈夫曼树:含有N个带权叶子结点的二叉树,其中带权路径长度(WPL)最小的二叉树,也称为最优二叉树。算...原创 2019-08-23 23:59:45 · 303 阅读 · 0 评论 -
4.8二叉树与森林
4.8二叉树与森林树与二叉树如何将一颗树转换为二叉树?树的孩子兄弟法与二叉链表表示法都是用到两个指针,多以可以把孩子兄弟表示法理解成二叉链表。孩子兄弟表示法:孩子兄弟表示法理解成二叉链表。树转化成二叉树的手动模拟方法:1)将同一结点的各个孩子用线串联起2)将每个结点的子树分支,从左到右,除了第一个以外全部删除。二叉树转化成树的手动模拟方法:1)将二叉树从上到下分层,并调...原创 2019-08-24 21:44:54 · 358 阅读 · 0 评论 -
排序
原创 2019-10-24 11:58:29 · 142 阅读 · 0 评论 -
5.1图的基本概念
5.1图的基本概念图G:由顶点集V和边集E组成,记为G =(V,E)特点:图不可为空,一个图中就算是一条边都没有,也就是边集为空,但是顶点集一定不为空。图的分类:@有向图中弧是顶点的有序对的意思是 <A,B> 和< B,A>不同@有向图有序对是尖括号,无向图是圆括号简单图:1)不存在顶点到自身的边2)同一条边不重复出现多重图:若图G中某两个结点之间...原创 2019-08-25 14:23:17 · 1126 阅读 · 1 评论 -
5.2图的存储结构
5.2图的存储结构图的存储结构相比线性表和树显得更复杂:1)图中的顶点没有次序之分2)图中边和顶点的数量任意邻接矩阵:无向图:顶点:用数组存。 边或者弧:用二维数组来存储(二维数组也叫邻接矩阵)优点:1)判定两个顶点是否有边2)求某个顶点的度3)找到某个顶点的所有邻接点4)无向图的邻接矩阵是一个对称矩阵,因此可以只存储上半部分矩阵有向图:优点:1)顶点的入度是顶点...原创 2019-08-26 15:38:13 · 242 阅读 · 0 评论 -
5.3.1图的遍历
5.3.1图的遍历定义:从图中某以顶点出发访遍图中其余顶点,且是每个顶点仅被访问一次,这个过程就叫做图的遍历。图中顶点没有特殊性,可能存在沿着某条路径搜索后回到原起点,所以必须设置一个访问数组,记录遍历过程访问过的顶点。广度优先遍历(BFS:Breadth-First-Search)也叫广度优先搜索:类似于树的层序遍历:算法代码:#define MaxSize 100;bool v...原创 2019-08-26 22:47:03 · 152 阅读 · 1 评论 -
5.4.1图的应用(最小生成树)
5.4.1图的应用(最小生成树)连通图的生成树:极小的连通子图。包含图中全部的顶点,但只有足以构成一棵树的n-1条边。最小生成树:总权值最小的的生成树。最小生成树的求解算法:普利姆算法算法思想:需要两个数组: lowcost[n] , adjvex (n是图中的顶点数)1)从图中找第一个起始顶点V0,作为生成树的第一个顶点,然后从这个顶点到其他所有边中挑选一条权值最小的边。然后与...原创 2019-08-27 21:02:56 · 188 阅读 · 0 评论 -
5.4.2图的应用(最短路径)
5.4.2图的应用(最短路径)迪杰斯特拉:用集合S来记录以求得最短路径得顶点,可以用一个数组来是s[]来实现,初始化为0,当s[vi]=1时表示vi加入S中,初始化把源点v0放入S中。此外,在构造过程中还设置了两个辅助数组:dist[]:记录了从源点到顶点i之间的最短路径长度,dist[]初值为arcs[v0][i]。path[]:记录path[i]表示从源头到顶点i之间得最短路径得前...原创 2019-08-27 22:37:28 · 506 阅读 · 0 评论 -
5.4.4图的应用(关键路径)
5.4.4图的应用(关键路径)AOE(Activity On Edge):在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,用边上的权值表示活动的持续时间,这种有向图的边表示活动的网称为AOE网。notes:关键活动最早和最迟发生时间相同。关键路径的源点和终点肯定是关键活动。...原创 2019-08-28 16:52:00 · 357 阅读 · 1 评论 -
6.1查找的基本概念
6.1查找的基本概念查找:在数据集合中寻找满足某种条件的数据元素得过程称为查找。查找表:用于查找得数据集合成称为查找表静态查找表:如果一个查找表只涉及操作查询元素是否在查找表和查询某个数据元素得属性(不涉及修改)例子:顺序查找,折半查找动态查找表:涉及修改例子:二叉排序树,二叉平衡树关键字:数据元素中某个可以唯一标识该元素得数据项(查找时比较的对象)记录:数据元素往往包含了除了关键...原创 2019-08-29 22:01:58 · 221 阅读 · 0 评论 -
6.2顺序查找 折半查找 分块查找
6.2.1顺序查找主要用于线性表中进行查找。从查找表的一端开始,顺序扫描查找表,依次将扫描到的关键字和待查找的值Key进行比较。如果相等,则查找成功。如果扫描结束仍然没有发现相等的数据元素,则查找失败。int Search1(int a[],int n,int key){ for(int i=1;i<=n;i++){ //注意从1开始 if(a[i]==key) ...原创 2019-08-29 22:03:50 · 1017 阅读 · 0 评论 -
6.3二叉排序树
6.3二叉排序树定义:二叉排序树(Binary Search Tree也叫二叉搜索树)或者是空树或者是具有以下性质的二叉树;(左小右大)1)若左子树不空,则左子树上的所有结点的值均小于它的根结点的值。2)若右子树不空,则右子树上的所有结点的值均大于它的根结点的值。3)它的左右子树也是一颗二叉排序树。对二叉排序树进行中序遍历可以得到一个递增的有序序列。二叉排序树的目的,不是为了排序,...原创 2019-08-30 16:26:19 · 867 阅读 · 0 评论 -
6.4平衡二叉树(AVL树)
6.3平衡二叉树(AVL树)二叉排序树的形状住要时高度不一样的时候性能差距很大,为了避免二叉排序树由于高度增长过快导致性能降低,所以我们需要对二叉排序树做出一定的限制。平衡二叉树:是特殊的二叉排序树,特殊的地方在于左右子树的高度差绝对值不超过一,而且左右子树又是一颗平衡二叉树。(每个结点的平衡因子只能为1,0,-1)平衡因子:定义结点左子树和右子树的高度差为该结点的平衡因子。平衡二叉树的...原创 2019-08-30 14:50:50 · 639 阅读 · 0 评论 -
6.5B树和B+树
6.5B树和B+树2-3树:多路查找树,2和3的意思就是2-3树包含两种结点。1)2结点包含一个元素和两个孩子(或者没有孩子)。@左小右大@要不两个孩子,要不没有2)3结点包含一大一小元素,三个孩子(或者没有孩子)。@左小小于最小元素,右大大于最大元素,中间在大于最小小于最大。@要不三个孩子,要不没有孩子。3)2-3树叶子结点都在同一层次。2-3-4和2-3树类似/。B树:...原创 2019-08-31 12:57:31 · 245 阅读 · 1 评论 -
6.6散列表
6.6散列表定义:根据给定的关键字来计算出关键字在表中的地址的数据结构。也就是说,散列表建立了关键字和存储地址之间的一种直接映射关系。散列函数:一个把查找表中的关键字映射成该关键字对应地址的函数,记为Hash(key)=Addr。冲突:散列函数可能会把两个或者两个以上的不同关键字映射到同一地址,这种情况为“冲突”,这些发生碰撞的不同关键字称为同义词。构造散列函数的Tips:1)散列函数...原创 2019-08-31 16:54:47 · 314 阅读 · 1 评论 -
6.7KMP算法
6.7KMP算法kpm用途:用于解决字符串模式匹配问题(求一个字符串(模式串)在另外一个字符串(主串)中的位置)。字符串模式匹配问题暴力解法:int Index(SString S,SString T){ //SString是存储字符串的结构,实际是一个字符数组,数组的第一个位置存储的是这个字符串的长度 int i=1,j=1; //主串和模式串下标指示器 while(i...原创 2019-09-01 12:53:12 · 361 阅读 · 0 评论 -
7.1排序的基本知识
7.1排序的基本知识排序定义:排序就是将原本无序的序列重新排列成有序的序列。排序的稳定性:待排序表中的两个元素Ri和Rj,其对应的关键字keyj=keyi ,且在排序前Ri在Rj前面,如果使用某一算法排序,Ri仍然在Rj的前面,则称这个排序算法是稳定的,否则称排序算法是不稳定的。note:稳定性和排序的性能是没有关系。直接插入排序:首先以一个元素为有序的序列,然后将后面的元素依次插入...原创 2019-09-01 17:29:54 · 255 阅读 · 0 评论 -
7.2插入类排序:
7.2插入类排序:定义:就是在一个有序的序列中,插入一个新的关键字,直到所有的关键字都插入形成一个有序序列。直接插入排序就是一种插入类排序。插入类排序还包括折半排序,希尔排序。折半插入排序:将比较和移动两个操作分离出来,也就是想利用折半找到插入位置,然后一次性移动元素,再插入该元素。void InsertSort(ElemType A[],int n){ int i,j,lo...原创 2019-09-01 17:32:19 · 212 阅读 · 0 评论 -
7.3交换类排序
7.3交换类排序定义:根据序列中两个元素关键字的比较结果来交换他俩在序列中的位置。有冒泡排序和快速排序两种。冒泡排序:算法流程:void BubbleSort(ElemType A[],int n){ for(int i=0;i<n-1;i++){ bool flag =false; //tips当整个序列都有序时,标志位不发生改变,这是已经排好了 ...原创 2019-09-02 22:48:13 · 181 阅读 · 0 评论 -
7.4选择类排序
7.4选择类排序算法思想:每一趟(例如第i趟)在后面n-i+2(i=1,2,3,…,n-1)个待排序的元素中选取关键字最小的元素,作为有序子序列的第i个元素,直到第n-1趟做完,待排序的元素只剩一个,就不用再选了。包括简单排序和堆排序。简单排序:void SelctSort(ElemType A[],int n){ for(int i=0;i<n-1;i++){ //依次从后...原创 2019-09-03 16:29:57 · 183 阅读 · 0 评论 -
7.5归并排序
7.5归并排序假定待排序表含有n个记录,则可以看成n个有序的子表,每个子表长度为1,然后两两归并,得到[n/2]个长度为2或者1的有序表;再两两归并,……如此重复,直到合并成一个长度为n的有序表为止,这种排序方法称为2-路归并排序。/*归并函数*/ELemtype *B=(ElemType*)malloc((n+1)sizeof(ElemType)); //辅助数组(动态存储)void ...原创 2019-09-05 17:17:36 · 148 阅读 · 0 评论 -
7.6基数排序
7.6基数排序基数排序(也叫桶排序)是一种特别的排序方法,它不是基于比较进行排序的,而是采用多关键字排序思想(基于关键字各位的大小进行排序的),借助“分配”和“收集”两种操作对逻辑关键字进行排序。基数排序又分为最高位优先(MSD)排序和最低为优先(LSD)排序。LSD:性能分析:MSD:...原创 2019-09-05 17:20:22 · 189 阅读 · 0 评论 -
7.7外部排序
7.7外部排序原来学过的所有排序算法,都是建立再计算机内存中进行。由于内存的大小限制,前面的所学的排序的算法都是针对数据量不也是特别大的情况,。所有的这些排序都属于内部排序。但是有很多时候,需要对大文件进行排序,因为文件中记录很多、信息量庞大,无法将整个文件拷贝进内存中进行排序、因为文件中的记录很多、信息量庞大,无法将整个文件拷贝进内存中进行排序。解决办法:需要将待排序的记录存储在外存上,...原创 2019-09-06 20:18:50 · 361 阅读 · 0 评论 -
斐波那契数列两种算法及复杂度
斐波那契数列算法问题及时间复杂度描述 斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1...原创 2019-08-15 16:55:17 · 3079 阅读 · 1 评论