计算机数据结构

一、绪论

数据结构的基本概念

基本概念与术语

数据:信息的载体,描述客观事物属性的数,字符及所有能输入到计算机程序识别和处理的符号的集合 

数据元素:数据的基本单位

数据对象:具有相同性质的数据元素的集合

数据类型:一个值的集合和定义在此集合上的一组操作的总称

数据结构:相互之间存在一种或多种特定关系的数据元素的集合(逻辑结构+存储结构+数据的运算)

数据结构三要素

1.数据的逻辑结构:数据元素间的逻辑关系

2.数据的存储结构:数据结构在计算机中的表示

1)顺序结构 2)链式存储 3)索引存储 4)散列存储

3.数据的运算

施加在数据上的运算包括运算的定义和实现,运算的定义是针对逻辑结构,指出运算的功能,运算的实现是针对存储结构的,指出运算的具体操作步骤

算法和算法的评价

算法的基本概念

算法五大特性:有穷性,确定性,可行性,输入,输出

算法要达到的目标:正确性,可读性,健壮性,高效率和低存储

算法效率的度量

时间复杂度,空间复杂度

二、线性表

线性表的定义和基本操作

线性表的定义

相同数据类型的n个数据元素的有限序列,除第一个元素外,每个元素有且仅有一个直接前驱,除最后一个元素外,每个元素仅且仅有一个直接后继

线性表是一种逻辑结构,表示元素间一对一的相邻关系,顺序表和链表是指存储结构

线性表的顺序表示

顺序表的定义

线性表的顺序存储,逻辑结构与物理结构顺序相同,随机访问

顺序表上的基本操作的实现

1)插入:平均移动结点次数 eq?%5Cfrac%7Bn%7D%7B2%7D

2)删除:平均结点移动次数 eq?%5Cfrac%7Bn-1%7D%7B2%7D

3)查找:平均比较次数 eq?%5Cfrac%7Bn+1%7D%7B2%7D

线性表的链式表示

单链表的定义

单链表的基本操作实现

1)头插法

2)尾插法

3)按序查找,按值查找

4)插入节点,删除节点

双链表

循环链表

静态链表

借助数组来描述线性表的链式存储结构,指针是结点的相对地址(数组下标)

顺序表和链表的比较

三、栈、队列和数组

链栈的优点便于多个栈共享存储空间和提高其效率,不存在栈满上溢情况

1)元素顺序入栈,第一个出栈元素前的所有元素逆序(相对顺序)出栈

2)拓展:对于任何元素在其之后出栈的元素必定逆序(相对顺序)

3)元素顺序入栈,不允许连续n次退栈,则不会出现连续的n个元素的逆序序列

4)n个不同的元素入栈,出栈序列个数为eq?%5Cfrac%7B1%7D%7Bn+1%7DC%5En_%7B2n%7D

2009 元素abcdefg顺序入栈,元素出栈后进入队列,元素的出队顺序是bdcfeag,栈的容量至少是

依据性质2得到 ba,dca,ca,fea,ea,a,g,可知容量为3


2010 元素abcdef顺序入栈,允许进退栈交替,不允许出现连续三次退栈操作

A. decbfa      B. cbdaef      C. bcaefd      eq?D.%20%5C%2Ca%5Cunderline%7Bfed%7Dcb

根据性质3,可得


2011 元素abcde顺序入栈,以元素d为开头的序列有几种

根据性质1可知eq?d%5C%2Cc%5C%2Cb%5C%2Ca顺序确定,e有4个插入位置

队列

队列的顺序存储结构

循环队列

队空条件:Q.front=Q.rear

队满条件:(Q.rear+1)%MaxSize==Q.front

队列长度:(Q.rear+MaxSize-Q.front)%MaxSize

双端队列

输出受限:只允许一端输出

输入受限:只允许一端输入

数组和特殊矩阵

特殊矩阵的压缩存储

1.对称矩阵

2.三角矩阵

3.三对角矩阵

稀疏矩阵

三元组(行标,列标,值)

四、串

串的模式匹配算法-KMP

next数组的值位 1)2)序列相同的最大长度

1)从数组第一位出发的到某位置的序列

2)从某位置出发的序列到该位置的序列

五、树与二叉树

树的基本概念

树的定义

树是n个结点的有序集,n=0为空树,树中结点的最大度数称为树的度

森林,m棵互不相交的树的集合,只要给m棵独立的树加上一个结点,森林就变成了树

树的性质

1)树中结点数等于所有结点度数之和加1(结点数=边数+1)

2)度为m的树中的i层上至多有eq?m%5E%7Bi-1%7D个结点

3)高速为h的m叉树至多有eq?%5Cfrac%7Bm%5Eh-1%7D%7Bm-1%7D个结点

4)具有n个结点的m叉树的最小高度为eq?%5Cleft%20%5Clceil%20%5Clog%20_m%28n%28m-1%29+1%29%20%5Cright%20%5Crceil

二叉树的概念

二叉树的定义及其特性

特殊的二叉树

1)满二叉树:高度h且含eq?2%5Eh-1个结点的二叉树

2)完全二叉树:若有度为1的结点,该结点只有左孩子无右孩子,按层序编号大于某序号后,其后所有都为叶结点,2%20%5Cright%20%5Crfloor,则结点为分支节点,否则为叶结点(叶结点数为2%20%5Cright%20%5Crceil)

二叉树的性质

1)非空二叉树的叶结点等于度为2的结点数加1,eq?n_0%3Dn_2+1

根据结点数=边数+1:eq?n_0+n_1+n_2%3D2n_2+n_1+1

2)具有n个结点的完全二叉树的高度为eq?%5Cleft%20%5Clceil%20%5Clog%20_2%28n+1%29%20%5Cright%20%5Crceileq?%5Cleft%20%5Clfloor%20%5Clog%20_2n%5Cright%20%5Crfloor+1

3)空指针的个数为n+1(一个节点两个指针2n个,边有n-1条)

4)偶数个结点的二叉树,不存在偶数个度为1的结点

二叉树的遍历和线索化二叉树

线索二叉树

ltag=0指示结点的左孩子,ltag=1指示结点的前驱

rtag=0指示结点的右孩子,rtag=1指示结点的后继

1)先序线索化二叉树

2)中序线索化二叉树

3)后序线索化二叉树:不能有效解决后继

树、森林

树的存储结构

1.双亲表示法:每个节点指针指向其根结点

2.孩子表示法:所有孩子结点用单链表链接起来形成的线性结构

3.孩子兄弟表示法:二叉树表示法

树、森林与二叉树的转换

树转换为二叉树:左孩子右兄弟

森林转换为二叉树:先将每棵树转换为二叉树,将森林的后一棵树作为前一棵树的右子树

二叉树转换为树或森林是唯一的

根据左孩子右兄弟原则可知,森林转化的二叉树,只要是有孩子的结点均无右子树

树和森林的遍历

森林二叉树
先根遍历先序遍历先序遍历
后根遍历中序遍历中序遍历

树与二叉树的应用

哈夫曼树和哈夫曼编码(变长编码)

1)常规的哈夫曼树只有度为0和度为2的结点,故叶结点数=非叶结点数+1

2)定长编码数据元素均在二叉树同一层次

哈夫曼树的构造

1)每次从集合中选择两个权值最小的求和放入集合,直到集合里剩下一个数据(结点)

2)频率越大的数据元素,编码越短

哈夫曼编码

并查集

六、图

图的基本概念

图的定义

1.有向图

2.无向图

3.简单图,多重图

简单图

1)不存在重复边

2)不存在顶点到自身的边

4.完全图:有n(n-1)/2边

5.子图

6.连通、连通图和连通分量

连通图:图中任意两个顶点都是连通的

连通分量:无向图中的极大连通子图

7.强连通图、强连通分量

强连通图:在有向图中,任意两顶点之间都有路径

强连通分量:在有向图中,极大强连通子图

8.顶点的入度与出度

无向图的全部顶点的度的和等于边数的2倍

9.路径、路径长度和回路

非连通的情况下,由n-1个顶点构成一个完全图,此时在加入一个顶点则变成非连通图

有向图强连通情况下边最少的情况:至少需要n条边,构成一个环路

10.简单路径、简单回路

在路径序列中,顶点不重复出现的路径为简单路径,除第一个顶点和最后一个顶点外,其余顶点不重复出现的回路称为简单回路

11.有向树

一个顶点的入度为0、其余顶点的入度为1的有向图,称为有向树

无向图的生成树是无向图的极小连通分量

图的存储及基本操作

邻接矩阵法

二维矩阵

1)无向图的邻接矩阵一定是一个对称矩阵

2)邻接矩阵的第i行(或j列)非零元素(或非∞元素)的个数为顶点的度

3)对于有向图,第i行非零元素(或非∞元素)的个数是顶点i的出度,第j列(非∞元素)为顶点j的出度

4)设图的邻接矩阵为A,eq?A%5En%5Bi%5D%5Bj%5D等于由顶点i到顶点j的长度为n的路径数目

邻接表法

拉链法:将与顶点直接相连的顶点拉成一条链

1)若为无向图所需存储空间为O(V+2E),若为有向图所需存储空间为O(V+E)

2)在有向图中,一个给定顶点的出度只需要计算其邻接表的节点个数,出度的计算则需要遍历整张表

十字链表

两条链

1)边的始点为自己的链(链结点在自己的链上)

2)边的终点为自己的链(链结点在其他链上)

邻接多重表

无向图的十字链表

图的遍历

广度优先搜索(BFS)

深度优先遍历(DFS)

对连通图的调用DFS才能产生深度优先树

图的遍历与图的连通分析

图的应用

最小生成树

边的权值之和最小的生成树(包含所有顶点)

1.Prim算法

2.Kruskal算法

最短路径

Dijkstra+Floyd

有向无环图

有向无环图的生成

1)以算术符号为分界,判断算术符两端是否有相同子式,有则去掉一个

eq?%28%28a+b%29*%28%5Cunderline%7Bb%7D*%28%5Cunderline%7Bc+d%7D%29%29+%28c+d%29*e%29*%28%5Cunderline%7B%28c+d%29*e%7D%29

可以去掉9个字符

拓扑排序

关键路径

AOE网的两个性质

关键路径:从源点到汇点的路径中,具有最大路径长度的路径称为关键路径,关键路径上的活动称为关键活动

活动时间余量:最迟开始时间与最早开始时间的差值

七、查找

顺序查找与折半查找

顺序查找

1.一般线性表顺序查找

ASL成功=eq?%5Cfrac%7Bn+1%7D%7B2%7D,ASL不成功=n+1

2.有序表顺序查找

ASL成功=eq?%5Cfrac%7Bn+1%7D%7B2%7D

ASL不成功=eq?%5Cfrac%7B1+2+...+n+n%7D%7Bn+1%7D%3D%5Cfrac%7Bn%7D%7B2%7D+%5Cfrac%7Bn%7D%7Bn+1%7D

折半查找

eq?ASL%5Capprox%20%5Cfrac%7B1%7D%7Bn%7D%281%5Ctimes1+2%5Ctimes2+...+h%5Ctimes%202%5E%7Bh-1%7D%20%29%3D%5Clog%20_2%28n+1%29-1

元素个数为n时,树高eq?h%3D%5Cleft%20%5Clceil%20%5Clog%20_2%28n+1%29%20%5Cright%20%5Crceil

n个结点,设折半查找树,树高h,最底层有m个结点

ASL成功=(1*1+2*2+3*4...+h*m)/n

ASL不成功=n

折半查找的判定树

1)结点数为偶数

所有树的左右子树情况相同(左比右多,则所有子树均如此,反之亦然)

2)节点数为奇数:左右子树结点数相同

3)关于根节点对称的必定不是折半查找判定树

4)折半查找序列构成二叉排序树

分块查找

长度为n的查找表,分成b块,每块s个

eq?ASL%3D%5Cfrac%7Bb+1%7D%7B2%7D+%5Cfrac%7Bs+1%7D%7B2%7D

树形查找

二叉排序树(BST)

二叉排序树的删除

1)叶结点直接删除

2)有一个棵左子树或者右子树,让该节点的子树成为该结点的父节点的子树

3)有两棵子树:让右子树的最左结点或左子树的最右结点替代该节点

平衡二叉树

平衡因子:左右子树高度差

平衡二叉树的旋转

结点数为n的最少的平衡二叉树

eq?n_1%3D1%2Cn_2%3D2%2Cn_h%3Dn_%7Bh-1%7D+n_%7Bn-2%7D+1

红黑树

1)根节点为黑色,叶结点(虚构的,末端)都是黑色

2)不存在两个相邻的红结点

3)从根到任何叶结点的路径黑高相同

4)根到叶结点最短路径是全由黑节点组成的

5)根到叶结点的最长路径不大于最短路径的两倍

6)根的黑高至少h/2,故总结点数2%7D-1

红黑树的插入

1)插入结点的叔结点为黑,则将结点的父节点变黑,并将爷结点变红做为父节点的孩子节点

2)插入结点的叔结点为红,将父节点与叔结点变黑,爷结点变红

红黑树的删除

1)待删结点没有孩子为红色直接删

2)待删结点为黑色

①待删结点的兄弟为红色,则让兄弟结点做根节点,原来的根节点变红

兄弟结点有两颗子树,则去掉一颗作为原来的根结点子树

兄弟结点有一棵子树,直接接上原来的根节点

②待删结点的兄弟为黑色

B树和B+树

B树及其基本操作

对于m阶B树

1)除根外每个结点至少要有2%20%5Cright%20%5Crceil棵子树,即至少2%20%5Cright%20%5Crceil-1个关键字(根至少两棵)

2)所有叶结点都出现在同一层次上,不携带信息

B树的高度

对任意一棵包含n个关键字,高度为h,阶数为m的B树

eq?h%5Cgeq%20%5Clog%20_m%28n+1%292%5D+1

B树的插入

B树的删除

B+树的基本概念

m阶B+树

1)非根叶结点至少两棵子树,其他分支节点至少有2%20%5Cright%20%5Crceil棵子树

2)结点的子树个数与关键字相等

3)信息全在叶结点上,非叶节点仅起索引作用

散列表

散列函数的构造方法

处理冲突的方法

1)开放定址法

散列查找及性能分析

八、排序

基于比较的排序,至少需要eq?%5Cleft%20%5Clceil%20%5Clog%20_2n%21%20%5Cright%20%5Crceil次关键字的两两比较

外部排序

多路平衡归并与败者树

在k个元素中,选择关键字最小的记录需要比较k-1次,每趟归并n个元素需要做(n-1)(k-1)次比较

r个归并段进行k路归并,需要归并的趟数为eq?%5Cleft%20%5Clceil%20%5Clog%20_kr%20%5Cright%20%5Crceil

总共比较次数为%5Cleft%20%5Clceil%20%5Clog%20_2k%5Cright%20%5Crceil

败者树

在k个元素中两两比较,选出败者所需比较次数eq?%5Cleft%20%5Clceil%20%5Clog%20_2k%20%5Cright%20%5Crceil次,每趟归并n个元素需要eq?%28n-1%29%5Cleft%20%5Clceil%20%5Clog%20_2k%20%5Cright%20%5Crceil次比较,r个归并段总共比较次数eq?%28n-1%29%5Cleft%20%5Clceil%20%5Clog%20_2r%20%5Cright%20%5Crceil

置换-选择排序(生成初始归并段)

 

最佳归并树

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值