数据
数据元素
数据项
数据对象
具有相同性质的数据元素的集合,是数据的子集
数据类型
数据类型是一个值的集合和定义在集合上的一组操作的总称。
原子类型
结构类型
抽象结构类型
算法的设计取决于所选的逻辑结构,而算法的实现依赖于所选的存储结构
逻辑结构
数据元素之间的关系,分为线性结构和非线性结构
线性结构
非线性结构
集合(无关系)、线性结构(一对一)、树形结构(一对多)、图状结构或网状结构(多对多)
存储结构
顺序存储
链式存储、
索引存储
散列存储
数据的运算
运算的定义针对逻辑结构,运算的实现针对逻辑结构
栈
基本概念
栈的数学性质
基本操作
顺序栈
操作
S.top。S.top=-1
进栈
出栈
判空
栈满
栈长
S.top=0时,即top指向栈顶元素的下一位置。则入栈操作变成S.data[S.top++]=x,出栈为x=S.data[–S.top]
区分top指向的是当前栈顶元素还是下一元素
链栈
共享栈
初始指针
栈满
进栈操作
出栈
特点
队列
基本概念
队首出(删除),队尾入队(增加)
判空
判满
循环队列
三种区分队空与队满方法
牺牲一个元素
队满
队空
元素个数
增设表示元素个数
增设tag数据成员
P79页循环队列出入队示意图
链式队列
双端队列
数组
一维数组
多维数组
压缩矩阵
对称矩阵
上下三角矩阵
三对角矩阵
特点
按行优先和按列优先
稀疏矩阵
栈
栈的括号匹配
前中后缀表达式
栈的递归
在于能发将原始问题转换为属性相同但规模交较小的问题。
递归调用过程:
队列
队列的层次遍历
队列在计算机系统中的应用
递归的数据结构,也是一种逻辑结构
定义
术语
祖先,双亲,子孙,孩子,兄弟结点
结点的度,树的度
分支结点,叶子结点
结点的层次,结点的深度,结点的高度,树的高度。
有序树,无序树
路径,路径长度
树的性质
概念
二叉树是有序树
二叉树和度为2度有序树区别
度为2度有序树,结点至少三个,而二叉树可以为空
二叉树的次序是绝对的,不能颠倒
特殊二叉树
满二叉树
完全二叉树
二叉排序树
平衡二叉树
二叉树的性质
二叉树的存储
总结:
操作
三种遍历
先序遍历
后序遍历
中序遍历
时间复杂度,空间复杂度都为O(n)
线索二叉树
二叉树的计算题
空指针的个数
中序+后序推导
中序+前序推导
层序+中序推导
应用
排序二叉树
哈夫曼树
树的存储结构
双亲表示法
利用结点唯一双亲的性质
可以很快得到每个结点的双亲,但是求孩子结点,需要遍历整个结构
区别二叉树的顺序存储和树的顺序存储
孩子表示法
孩子兄弟表示法
二叉链表表示:每个结点分为三部分,结点值,指向结点第一个孩子结点的指针,指向结点下一个兄弟结点的指针。
通过第二个指针可以方便找到结点的所有兄弟结点。
最大优点,方便实现树转换为二叉树的操作,易于查找孩子结点。
缺点是从当前结点查找父结点比较麻烦
树,森林与二叉树的转换
给定一颗树找到可以唯一的一颗二叉树与之对应,物理结构上看,他们的二叉链表上一样的,只是解释不同
- 二叉树转换为树或者森林也是唯一的
树转二叉树的规则
树转二叉树的画法
森林转化为二叉树
森林转为二叉树的画法
二叉树转换为森林的规则
树和森林的遍历
树的两种方式
补充:无法使用中根遍历,因为可能会有多个孩子。也可使用层次遍历
先根遍历
后根遍历
森林的两种遍历方式
先序遍历森林
中序遍历森林
补充总结:
二叉排序树BST
中序遍历可得到递增序列
二叉排序树的非递归查找算法
插入
删除
被删除的三种情况
查找
查找效率取决于树的高度
二分查找和二叉排序树的区别和联系
平衡二叉树AVL
概念
平衡因子
插入
先检查是否会因插入导致失衡
如果导致了失衡,需要进行调整。先找到距离最近的平衡因子绝对值大于1的结点A,再对以A为根的子树,进行调整到平衡。
平衡二叉树的四种调整
LL平衡旋转(右单旋转)
RR平衡旋转(左单旋转)
LR平衡旋转(先左后右双旋转)
RL平衡旋转(先右后左双旋转)
注意⚠️平衡二叉树根据关键字插入。
平衡二叉树的查找
比较次数
深度为h的平衡二叉树的最少结点
递推公式
n个结点平衡二叉树的最大深度
哈夫曼树和哈夫曼编码
带权路径长度(WPL)最小的二叉树称为哈夫曼树
哈夫曼树的构造过程
哈夫曼树的特点
哈夫曼编码
编码
固定长度编码
可变长度编码
不同长度的
前缀编码
哈夫曼树构造哈夫曼编码
哈夫曼编码长度计算
补充
哈夫曼树的推广
图的定义
有向图
无向图
简单图
多重图
完全图
子图
连通、连通图、连通分量
强连通、强连通分量
在有向图中,若从顶点v到顶点w和从顶点w到顶点ν之间都有路径,则称这两个顶点是强连通的
若图中任何一对顶点都是强连通的,则称此图为强连通图。
有向图中的极大强连通子图称为有向图的强连通分量,
注意:强连通图、强连通分量只是针对有向图而言的。一般在无向图中讨论连通性,在有向图中考虑强连通性
生成树、生成森林
顶点的度,入度和出度
边的权和网
稠密图和稀疏图
路径、路径长度和回路
简单路径、简单回路
距离
有向树
常见考点
对于n个顶点的无向图G,
对于n个顶点的有向图G
邻接矩阵法
无向图的邻接矩阵是对称的,可只存储上下三角矩阵
对于无向图,每行或列非0元素的个数是改顶点的度
对于有向图,行个数对应出度,列对应入度
特点:容易检验出两个顶点之间是否有边相连,但是要确定多少边,必须要按行或列检测,时间代价大
设图G的邻接矩阵为A,An的元素An[i][j]等于由顶点i到顶点j的长度为n的路径的数目
邻接表法
特点
十字链表
有向图的一种链式存储结构
特点
图的十字链表表示是不唯一的,但一个十字链表的表示是一个确定的图
邻接多重表
无向图的另一种链式存储结构
区别
四种存储的对比
图的基本操作
广度优先遍历(BFS)
借助辅助队列
复杂度
邻接表存储时
邻接矩阵
分析时只需要分析访问的顶点和邻接点需要的时间
广度优先生成树
深度优先遍历(DFS)
借用栈
类似树的先跟遍历
空间复杂度
时间复杂度
邻接矩阵
邻接表存储时
深度优先遍历邻接表的访问过程,并给出访问序列
图的生成树特点
图的遍历如何来确定图的连通性?有向图?无向图?
求解图的连通性问题,拓扑排序,求解关键路径
最小生成树
求最小生成树的两种方法
Kruskal算法
Pim算法
最小生成树的概念是?
最短路径
单源最短路径
BFS算法(无权图)
Dijkatra算法(带权图,无权图)
执行过程?
复杂度
不适用于求带负权值的图?
基于贪心
每对顶点间的最短路径
Floyd算法(带权图,无权图)
执行过程?
基于动态规划
有向无环图:DAG图
拓扑排序:AOV网
算法步骤?
逆拓扑排序
可以用DFS实现拓扑排序或逆拓扑排序
拓扑排序不可以唯一确定一个图
如果不能构成一个拓扑排序,则存在回路,即含有顶点数目大于1的强连通分量?why ?
三角矩阵是一个有序的拓扑序列(可能不唯一)
关键路径:AOE网
关键路径
求关键路径
可以通过什么判定有向图是否存在回路?
平均查找长度ASL(会计算成功和失败)
静态查找
动态查找
顺序查找
折半查找(仅适用于有序的顺序存储结构)
分块查找
又称索引顺序查找,详细见操作系统中文件系统
如果索引查找和块内查找均采用顺序查找
如果索引查找采用折半查找而块内查找均采用顺序查找
二叉排序树
二叉平衡树
B树
B树的基本特点
高度范围
插入
分裂:
删除
如果k不在终端,需要用k的前驱代替k
k在终端结点(最低层非叶子结点)时
直接删除:兄弟结点≥【m/2】
兄弟够借
兄弟不够借
B树的插入、删除、查找过程
B+树
B+树了解基本概念和性质
性能分析
构造方法
直接定址法
除留取余法
数字分析法
平方取中法
冲突处理
开放定址法
线性探测
平方探测
再散列
伪随机序列法
拉链法
影响冲突的三个因素
查找成功、失败的ASL
注意
在除留取余法,除数的确定一般取小于散列表长的最大质数
装填因子
散列表
Asl依赖于装填因子,不依赖于n和m
散列表的删除不能简单进行删除?
搜索路径会被中断,可以标记删除
插入排序
直接插入排序
折半插入排序
希尔排序
交换排序
冒泡排序
快速排序
选择排序
简单选择排序
堆排序(重点)
归并排序
最好最坏相同
基数排序
外部排序
各种排序算法的比较p346页,很重要。
基于比较的排序,最少的比较次数
选择排序和归并排序的比较次数和初始状态无关
考纲要求:统考大纲只要求掌握字符串模式匹配,需重点掌握KMP匹配算法的原理及next数组的推理过程,手工求next数组可以先计算出部分匹配值表然后再变形,或根据公式来求解。了解 nextval数组的求解方法。
暴力匹配
KMP
优点
前缀和后缀匹配
求解NEXT数组
改进KMP