一、绪论
数据结构的基本概念
基本概念与术语
数据:信息的载体,描述客观事物属性的数,字符及所有能输入到计算机程序识别和处理的符号的集合
数据元素:数据的基本单位
数据对象:具有相同性质的数据元素的集合
数据类型:一个值的集合和定义在此集合上的一组操作的总称
数据结构:相互之间存在一种或多种特定关系的数据元素的集合(逻辑结构+存储结构+数据的运算)
数据结构三要素
1.数据的逻辑结构:数据元素间的逻辑关系
2.数据的存储结构:数据结构在计算机中的表示
1)顺序结构 2)链式存储 3)索引存储 4)散列存储
3.数据的运算
施加在数据上的运算包括运算的定义和实现,运算的定义是针对逻辑结构,指出运算的功能,运算的实现是针对存储结构的,指出运算的具体操作步骤
算法和算法的评价
算法的基本概念
算法五大特性:有穷性,确定性,可行性,输入,输出
算法要达到的目标:正确性,可读性,健壮性,高效率和低存储
算法效率的度量
时间复杂度,空间复杂度
二、线性表
线性表的定义和基本操作
线性表的定义
相同数据类型的n个数据元素的有限序列,除第一个元素外,每个元素有且仅有一个直接前驱,除最后一个元素外,每个元素仅且仅有一个直接后继
线性表是一种逻辑结构,表示元素间一对一的相邻关系,顺序表和链表是指存储结构
线性表的顺序表示
顺序表的定义
线性表的顺序存储,逻辑结构与物理结构顺序相同,随机访问
顺序表上的基本操作的实现
1)插入:平均移动结点次数
2)删除:平均结点移动次数
3)查找:平均比较次数
线性表的链式表示
单链表的定义
单链表的基本操作实现
1)头插法
2)尾插法
3)按序查找,按值查找
4)插入节点,删除节点
双链表
循环链表
静态链表
借助数组来描述线性表的链式存储结构,指针是结点的相对地址(数组下标)
顺序表和链表的比较
三、栈、队列和数组
栈
链栈的优点便于多个栈共享存储空间和提高其效率,不存在栈满上溢情况
1)元素顺序入栈,第一个出栈元素前的所有元素逆序(相对顺序)出栈
2)拓展:对于任何元素在其之后出栈的元素必定逆序(相对顺序)
3)元素顺序入栈,不允许连续n次退栈,则不会出现连续的n个元素的逆序序列
4)n个不同的元素入栈,出栈序列个数为
2009 元素abcdefg顺序入栈,元素出栈后进入队列,元素的出队顺序是bdcfeag,栈的容量至少是
依据性质2得到 ba,dca,ca,fea,ea,a,g,可知容量为3
2010 元素abcdef顺序入栈,允许进退栈交替,不允许出现连续三次退栈操作
A. decbfa B. cbdaef C. bcaefd
根据性质3,可得
2011 元素abcde顺序入栈,以元素d为开头的序列有几种
根据性质1可知
顺序确定,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层上至多有个结点
3)高速为h的m叉树至多有个结点
4)具有n个结点的m叉树的最小高度为
二叉树的概念
二叉树的定义及其特性
特殊的二叉树
1)满二叉树:高度h且含个结点的二叉树
2)完全二叉树:若有度为1的结点,该结点只有左孩子无右孩子,按层序编号大于某序号后,其后所有都为叶结点,,则结点为分支节点,否则为叶结点(叶结点数为
)
二叉树的性质
1)非空二叉树的叶结点等于度为2的结点数加1,
根据结点数=边数+1:
2)具有n个结点的完全二叉树的高度为或
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,等于由顶点i到顶点j的长度为n的路径数目
邻接表法
拉链法:将与顶点直接相连的顶点拉成一条链
1)若为无向图所需存储空间为O(V+2E),若为有向图所需存储空间为O(V+E)
2)在有向图中,一个给定顶点的出度只需要计算其邻接表的节点个数,出度的计算则需要遍历整张表
十字链表
两条链
1)边的始点为自己的链(链结点在自己的链上)
2)边的终点为自己的链(链结点在其他链上)
邻接多重表
无向图的十字链表
图的遍历
广度优先搜索(BFS)
深度优先遍历(DFS)
对连通图的调用DFS才能产生深度优先树
图的遍历与图的连通分析
图的应用
最小生成树
边的权值之和最小的生成树(包含所有顶点)
1.Prim算法
2.Kruskal算法
最短路径
Dijkstra+Floyd
有向无环图
有向无环图的生成
1)以算术符号为分界,判断算术符两端是否有相同子式,有则去掉一个
可以去掉9个字符
拓扑排序
关键路径
AOE网的两个性质
关键路径:从源点到汇点的路径中,具有最大路径长度的路径称为关键路径,关键路径上的活动称为关键活动
活动时间余量:最迟开始时间与最早开始时间的差值
七、查找
顺序查找与折半查找
顺序查找
1.一般线性表顺序查找
ASL成功=,ASL不成功=n+1
2.有序表顺序查找
ASL成功=
ASL不成功=
折半查找
元素个数为n时,树高
n个结点,设折半查找树,树高h,最底层有m个结点
ASL成功=(1*1+2*2+3*4...+h*m)/n
ASL不成功=
折半查找的判定树
1)结点数为偶数
所有树的左右子树情况相同(左比右多,则所有子树均如此,反之亦然)
2)节点数为奇数:左右子树结点数相同
3)关于根节点对称的必定不是折半查找判定树
4)折半查找序列构成二叉排序树
分块查找
长度为n的查找表,分成b块,每块s个
树形查找
二叉排序树(BST)
二叉排序树的删除
1)叶结点直接删除
2)有一个棵左子树或者右子树,让该节点的子树成为该结点的父节点的子树
3)有两棵子树:让右子树的最左结点或左子树的最右结点替代该节点
平衡二叉树
平衡因子:左右子树高度差
平衡二叉树的旋转
结点数为n的最少的平衡二叉树
红黑树
1)根节点为黑色,叶结点(虚构的,末端)都是黑色
2)不存在两个相邻的红结点
3)从根到任何叶结点的路径黑高相同
4)根到叶结点最短路径是全由黑节点组成的
5)根到叶结点的最长路径不大于最短路径的两倍
6)根的黑高至少h/2,故总结点数
红黑树的插入
1)插入结点的叔结点为黑,则将结点的父节点变黑,并将爷结点变红做为父节点的孩子节点
2)插入结点的叔结点为红,将父节点与叔结点变黑,爷结点变红
红黑树的删除
1)待删结点没有孩子为红色直接删
2)待删结点为黑色
①待删结点的兄弟为红色,则让兄弟结点做根节点,原来的根节点变红
兄弟结点有两颗子树,则去掉一颗作为原来的根结点子树
兄弟结点有一棵子树,直接接上原来的根节点
②待删结点的兄弟为黑色
③
④
B树和B+树
B树及其基本操作
对于m阶B树
1)除根外每个结点至少要有棵子树,即至少
个关键字(根至少两棵)
2)所有叶结点都出现在同一层次上,不携带信息
B树的高度
对任意一棵包含n个关键字,高度为h,阶数为m的B树
,
B树的插入
B树的删除
B+树的基本概念
m阶B+树
1)非根叶结点至少两棵子树,其他分支节点至少有棵子树
2)结点的子树个数与关键字相等
3)信息全在叶结点上,非叶节点仅起索引作用
散列表
散列函数的构造方法
处理冲突的方法
1)开放定址法
散列查找及性能分析
八、排序
基于比较的排序,至少需要次关键字的两两比较
外部排序
多路平衡归并与败者树
在k个元素中,选择关键字最小的记录需要比较k-1次,每趟归并n个元素需要做(n-1)(k-1)次比较
r个归并段进行k路归并,需要归并的趟数为趟
总共比较次数为
败者树
在k个元素中两两比较,选出败者所需比较次数次,每趟归并n个元素需要
次比较,r个归并段总共比较次数
置换-选择排序(生成初始归并段)
最佳归并树