数据结构(5分):57~61题
-
大O表示法
-
时间复杂度
-
空间复杂度
-
与给定的空间无关
- 如给定的长度为n的数组
-
只与程序新定义的空间有关
-
-
-
渐进符号
- 当且仅当O(n)=Ω(n)才是Θ(n)
-
递归式时间、空间复杂度
-
递归式主方法
-
线性表
-
线性结构与线性表定义
-
顺序存储
-
顺序表插入
- O(n)
-
顺序表删除
- O(n)
-
顺序表查找
- O(1)
-
-
链式存储
-
单链表
-
插入
-
带头结点
- O(n)
-
不带头结点
- O(n)
-
-
删除
-
带头结点
- O(n)
-
不带头结点
- O(n)
-
-
查找
- 单链表查找及时间复杂度
-
-
循环单链表
-
双链表
-
-
-
栈
-
五大基本操作
- 初始化
- 判空
- 入栈
- 出栈
- 读栈顶
-
顺序存储
-
链式存储
-
-
队列
-
顺序存储
-
顺序队列
- 静态数组,可能会越界
-
循环队列
- rear=(rear+1)%N
-
-
链式存储
-
链式队列
-
双端队列
- 两端都可以入队和出队
-
-
-
串
-
模式匹配
-
朴素模式匹配
-
最好
- O(m)
-
最坏
- O((n-m+1*)m)
-
平均
- O(m+n)
-
-
-
KMP算法
-
串的前缀:包含第一个字符并且不包含最后一个字符的子串
-
串的后缀:包含最后一个字符并且不包含第一个字符的子串
-
next数组
-
第i个字符的next值
- 从1~i-1串中最长相等前后缀长度+1
-
特殊情况
-
next[1]=0
-
next[2]=1
- 第1串只有一个字符,前后缀都为0
- 长度+1=1
-
-
-
i值不回退
-
j=next[j]
-
-
-
数组
-
一维
- LOC:第一个元素的首地址、L:元素大小
- 下标从0开始:ai=LOC+i×L
- 下标从1开始:ai=L0C+(i-1)×L
-
二维
-
LOC:第一个元素的首地址、N:行数、M:列数、L:元素大小
-
按行存储
- 按行优先存储并且下标从0开始:ai,j=LOC+(i×M+j)×L
- 按行优先存储并且下标从1开始:ai,j=L0C+[(i-1)×M+j-1)]×L
-
按列存储
- 按列优先存储并且下标从0开始:ai,j=LOC+(j×N+i)×L
- 按列优先存储并且下标从1开始:ai,j=L0C+[j-1)×N+(i-1)]×L
-
-
-
矩阵
-
对称矩阵
-
只存下三角和主对角线
-
数组下标从1开始
-
矩阵下标从0开始
- i*(1+i)/2+j+1
-
矩阵下标从1开始
- (i-1)*i/2+j
-
-
-
-
三对角矩阵
-
数组下标从1开始
-
矩阵下标从0开始
- 2i+j+1
-
矩阵下标从1开始
- 2i+j-2
-
-
-
稀疏矩阵
-
三元组表
-
十字链表
- 行
- 列
- 值
- 指向同行下一个元素
- 指向同列下一个元素
-
-
-
-
树
-
树形结构与定义
-
基本概念
-
性质
- 性质1:树中的结点总数等于树中所有结点的度数之和加1
- 性质2:度为m的树中第i层上至多有m^(i-1)个结点(i≥1)。
- 性质3:高度为h的m次树至多有(m^h-1)/(m-1)个结点
- 性质4:具有n个结点、度为m的树的最小高度为[logm(n(m-1)+1)]向上取整
-
二叉树
-
定义
-
性质
-
满二叉树
- 每层都满
-
完全二叉树
- 每个结点对应满二叉树
- 最后一层可不满
-
卡特兰数
-
C(n,2n)/(n+1)
- 计算有n个节点的二叉树形态有多少种
-
-
存储
-
顺序存储
- 适合满二叉树、完全二叉树
-
链式存储
-
左右无父
- n-1个有效指针域
- n+1个空指针域
-
左右有父
- n-1孩子指针域
- n-1父指针域
- n+2空指针域
-
-
-
遍历
-
先序遍历
- 根左右
-
中序遍历
- 左根右
-
后序遍历
- 左右根
-
层序遍历
- 按层顺序
-
-
由遍历序列构造二叉树
-
中+先
- 先首是根
-
中+后
- 后尾是根
-
中+层
- 层首是根
-
-
平衡二叉树
- 二叉树中的任意一个结点的左右子树高度之差的绝对值不超过1
-
二叉排序树
-
定义
-
又称(二叉查找树)
-
根结点的关键字
- 大于左子树所有结点的关键字
- 小于右子树所有结点的关键字
- 左右子树也是一颗二叉排序树
-
中序遍历得到的序列是有序序列
-
-
构造
-
-
最优二叉树
-
定义
- 最优二叉树又称为哈夫曼树,它是一类带权路径长度最短的树。路径是从树中一个结点到另一个结点之间的通路,路径上的分支数目称为路径长度。
- 树的路径长度是从树根到每一个叶子之间的路径长度之和。
- 结点的带权路径长度为从该结点到树根之间的路径长度与该结点权值的乘积。
-
构造
-
概念
-
叶子结点n个
- 总结点=2n-1
-
非叶结点n-1个
-
只有度为0和2,无度为1
-
-
构造规则
- 从前往后找两个最小
- 小左大右
- 加入末尾
- 权值相同,从前往后
- 用时再调
-
-
哈夫曼编码
-
定义
- 左0右1
- 前缀不相同
-
压缩比
- (等长编码全码长-哈弗曼编码全码长)/等长编码全码长
-
-
线索二叉树
-
定义
-
ltag
-
有左孩子
-
0
- 指向左孩子
-
-
无左孩子
-
1
- 指向直接前驱
-
-
-
rtag
-
有右孩子
-
0
- 指向右孩子
-
-
无右孩子
-
1
- 指向直接后继
-
-
-
-
-
二叉树类别引入
-
-
-
图
-
结构
- 任意一个结点的前驱和后继没有限制
-
定义
- 图G是由集合V和E构成的二元组,记作G(V,E),其中,V是图中顶点的非空有限集合,E是图中边的有限集合。
-
有向图
-
所有边都有方向
- <vi,vj>
-
-
无向图
-
每条边都是无方向的
- (vi,vj)
-
-
完全图
-
每个顶点和其他顶点都有边
-
无向完全图
- n(n-1)/2
-
有向完全图
- n(n-1)
-
-
-
顶点的度
-
无向
-
度
- D(v)
-
-
有向
-
出度
- ID(v)
-
入度
- OD(v)
-
-
-
路径
-
简单路径
-
除终点和起点可重合外,其余顶点均不重合
- ∞也不行
-
-
-
连通图
-
无向图
-
任意两顶点之间是连通的
-
最少
- n-1
-
最多
- n(n-1)/2
-
-
-
-
强连通图
-
有向图
-
任意两顶点之间来回都是连通的
-
最少
- n
-
最多
- n(n-1)
-
-
-
-
图的存储
-
邻接矩阵
-
无向图
-
对称
- 非零元素个数=2e
-
-
有向图
-
非对称
- i行是顶点i的出度
- j列是顶点j的入度
-
-
-
邻接链表
-
表头结点
-
data
- 存储顶点y的名或其他有关信息。
-
firstarc
- 指示链表中的第一个结点(邻接顶点)。
-
-
表结点
-
adjvex
- 指示与顶点y邻接的顶点的序号。
-
nextarc
- 指示下一条边或弧的结点。
-
Info
- 存储与边或弧有关的信息,如权值等。
-
-
逆邻接表
- 求入度
-
-
-
稠密图
- 邻接矩阵
-
稀疏图
- 邻接链表
-
网
-
边(或弧)带权值的图称为网
- 网的邻接矩阵元素数值是权值
-
-
图的遍历
-
深度优先(DFS)
-
访问当前顶点的某个未被访问的邻接顶点
-
到底了就回溯到上一顶点重复上述过程
-
时间复杂度
-
邻接矩阵
- O(n^2)
-
邻接表
- O(n+e)
-
-
-
广度优先
-
访问当前顶点的所有未被访问的邻接点
-
都访问完了随机选取一个邻接点继续重复上述操作,完了回溯到上层找另一个顶点的下层
-
时间复杂度
-
邻接矩阵
- O(n^2)
-
邻接表
- O(n+e)
-
-
-
-
拓扑排序
-
AOV网
-
在有向图中,若以顶点表示活动,用有向边表示活动之间的优先关系,则称这样的有向图为以顶点表示活动的网(Activity On Vertex network,AOV网)。
- 表示活动优先关系,也可表示制约关系
-
在AOV网中不应出现有向环,若存在,则意味着某项活动必须以自身任务的完成为先决条件,显然这是荒谬的。因此,若要检测一个工程是否可行,首先应检查对应的AOV网是否存在回路。不存在回路的有向图称为有向无环图,或DAG(Directed Acycline Graph)图。
-
检测的方法是对有向图构造其顶点的拓扑有序序列。若图中所有的顶点都在它的拓扑有序序列中,则该AOV网中必定不存在环。
- (1)在AOV网中选择一个入度为0(没有前驱)的顶点且输出它。
- (2)从网中删除该顶点及与该顶点有关的所有弧。
- (3)重复上述两步,直到网中不在在入度为0的顶点为止。
-
在有向无环图G的拓扑序列中,顶点vi在vj在之前的,则:
- 可能存在弧<vi,vj>,一定不存在弧<vj,vi>。可能存在vi到vj的路径,一定不存在vj到vi的路径
-
-
-
-
查找
-
静态查找
-
定义
- (1)查询某个特定的数据元索是否在查找表中。
- (2)检索某个特定的数据元素的各种属性。
-
分类
-
顺序查找
- ASL=(n+1)/2
-
折半查找
-
mid=(l+h)/2
-
l+h为偶数的话向下取整
-
算法里取mid最保险的写法是 l+(h-l)/2。l + h在计算可能得出一个非常大的数,有溢出风险。
- 精辟!
-
-
最多比较次数
- [log2n]向下取整+1
-
折半查找判定树
-
-
分块查找
- 没考过
-
-
-
动态查找
-
定义
- (1)在查找表中插入一个数据元素。
- (2)从查找表中别除一个数据元素。
-
分类
- 二叉排序树
- 平衡二叉树
- B-树
- 哈希表
-
-
平均查找长度ASL
- 比较次数*概率
-
-
哈希函数
-
哈希表
- 哈希表通过计算一个以记录的关键字为自变量的函数(称为哈希函数)来得到该记录的存储地址,所以在哈希表中进行查找操作时,需用同哈希函数计算得到待查记录的存储地址,然后到相应的存储单元去获得有关信息再判定查找是否成功。
- 根据设定的哈希函数Iky)和处理冲突的方法,将一组关键字映射到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中的存储位置,这种表称为哈希表,这一映射过程称为哈希造表或散列,所得的存储位置称为哈希地址或散列地址。
-
构造方法
-
(1)哈希函数应是一个压缩映像函数,它应具有较大的压缩性,以节省存储空间。
(2)哈希函数应具有较好的散列性,虽然冲突是不可避兔的,但应尽量减少。 -
方法
-
直接定址法
-
数字分析法
-
平方取中法
-
折叠法
-
随机数法
-
除留余数法
-
H(key)=key%m
- m为接近n,但不大于n的质数
-
-
-
-
处理冲突
-
开放定址法
-
H(key)=(key+di)%m
-
di为增量序列
-
线性探测再散列
- 1,2,3…
-
二次探测再散列
- 12,-12,2^2…
-
随机探测再散列
- 伪随机数序列
-
-
-
-
链地址法
- 同一哈希地址的链起来
-
-
装填因子
- 表中装入的记录数/哈希表的长度
-
-
堆
-
小顶堆
- ki≤k2i
- ki≤k2i+1
-
大顶堆
- ki≥k2i
- ki≥k2i+1
-
建立
-
先依次放入堆中
-
只关注分支结点
-
从底层开始,逐层筛选
- 倒着更新分支结点
-
像打比赛竞选一样
-
-
-
排序
-
稳定性
- 之前相同的元素排序后先后顺序不变
-
归位
-
进行一次排序后能把某一元素的最终位置确定
-
符合归位的排序算法
- 简单选择排序
- 堆排序
- 冒泡排序
- 快速排序
-
-
-
内部排序
- 内部排序指待排序记录全部存放在内存中进行排序的过程。
-
外部排序
- 外部排序指待排序记录的数量很大,以至于内存不能容纳全部记录,在排序过程中尚需对外存进行访问的排序过程。
-
分类
-
插入
-
直接插入排序
-
打扑克牌时抓一张插一张
-
稳定
-
代码
-
-
希尔排序
-
直接插入排序的改进
-
缩小增量排序
- 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组,即将所有距离为d1倍数序号的记录放在同一个组中,在各组内进行直接插入排序立;然后取第二个增量d2(d2<d1),重复上述分组和排序工作,依此类推,直到所取的增量d1=1,即所有记录放在同一组进行直接插入排序为止。
-
-
代码
-
-
-
统计
-
计数排序
- 较特殊
- 统计频率,再依次输出
- 相当于一个计数器组
-
-
选择
-
简单选择排序
-
每趟排序挑最小的拿出来
-
代码
-
-
堆排序
-
先将所有元素排成大顶堆
-
每次末尾元素与堆顶元素交换,移出堆顶元素,构造成新大顶堆
- 更新新大顶堆要从最靠近末尾元素的分支开始改起
- 因为只有它变动了,其他不变
-
每次都能确定最大元素的最终位置
-
-
-
交换
-
冒泡排序
-
每次按顺序比较相邻两个,逆序则换
-
稳定
-
代码
-
-
快速排序
-
分治思想
-
代码
-
-
-
归并排序
-
分治思想
-
代码
-
-
-
排序算法各属性
-