17.1 线性结构
17.1.1 时间复杂度
17.1.2 渐进符号
17.1.3 递归式的时间空间复杂度
每次递归时间复杂度不变,递归时间复杂度为:递归的次数 * 每次递归的时间复杂度
17.1.4 递归式主方法
17.1.5 线性结构
17.1.5.1 线性表
顺序存储
- 优点:可以随机存取表中元素;
- 缺点:插入和删除操作需要移动元素;
表长为n的线性表中插入一个新元素期望值E为n/2,删除一个元素的期望值为(n - 1)/2,查找一个元素的期望值为(n + 1)/2
插入时间复杂度:最好:O(1) 最坏:O(n) 平均:O(n)
删除时间复杂度:最好:O(1) 最坏:O(n) 平均:O(n)
查找时间复杂度:最好:O(1) 最坏:O(1) 平均:O(1)
链式存储
- 优点:插入和删除操作不需要移动元素;
- 缺点:不能随机存取元素;
插入时间复杂度:最好:O(1) 最坏:O(n) 平均:O(n)
删除时间复杂度:最好:O(1) 最坏:O(n) 平均:O(n)
查找时间复杂度:最好:O(1) 最坏:O(n) 平均:O(n)
循环单链表
双链表
17.1.5.2 栈
17.1.5.3 队列
循环队列对头指针:(Q.rear - Q.len + 1 + M) % M
队尾指针:(Q.front + Q.len - 1 + M) % M
队列长度:(Q.rear - Q.front + M) % M
采用循环队列优点为:入队和出队操作都不需要移动队列的其他元素;
17.1.5.4 串
模式串:
KMP:
17.1.6 数组、矩阵
17.1.6.1 数组
当i=j时,按行存储与按列存储一致;
17.1.6.2 矩阵
稀疏矩阵:压缩存储方式常用三元顺序表或十字链表表示;
17.2 树
树结构是一种非线性结构,树中的每一个数据元素可以有两个或两个以上的直接后继元素,用来描述层次结构关系。
性质1:树中的结点总数等于树中所有结点的度之和加1;
性质2:度为m的树中第i层上至多有mi-1个结点;
性质3:高度为h的m次树至多有(mh - 1) / (m - 1);
性质4:具有n个结点、度为m的树的最小高度为logm(n * (m - 1) + 1)向上取整;
17.2.1 二叉树
17.2.2 满二叉树和完全二叉树
对于满二叉树,判断两个结点在同一层,log2m下取整 = log2n下取整;
卡特兰数:
17.2.3 二叉树的遍历
先序、中序、后序、层次
17.2.4 平衡二叉树
二叉树中任意一个结点的左右孩子高度之差的绝对值不超过1;
完全二叉树一定是平衡二叉树;
17.2.5 二叉排序树
根节点的关键字大于左子树所有结点的关键字,小于右子树所有结点的关键字,同时左右子树也是一颗二叉排序树,中序遍历得到的序列是有序序列;
从左到右排列同层次的结点,其关键字呈现有序排列的特点;
17.2.6 最优二叉树(哈夫曼树)
- 哈夫曼树只有度为0和度为2的结点;
- 哈夫曼树的总结点为2n - 1;
哈弗曼编码压缩比:(字符频率和 * 等长编码 - 每个字符路径长度 * 字符频率的和) / 字符频率和 * 等长编码
17.2.7 线索二叉树(了解)
17.3 图
17.3.1 有向图和无向图
17.3.2 完全图
17.3.3 顶点的度
入度:指向自己的弧线,出度:指向其他顶点的弧线;
顶点的度 = 入度 + 出度;总度数:2e
17.3.4 连通图和强连通图
强连通图最少需要n条边,最多需要n * (n - 1)
17.3.5 邻接矩阵
- 无向图的邻接矩阵是对称的;
- 无向图邻接矩阵vi的度即为第i行不为0的数量;
- 无向图邻接矩阵vi的出度即为第i行不为0的数量;vj的入度即为第j列不为0的数量;
- 有向图的非零元素个数为e,零元素个数为2n - e;
- 无向图的非零元素个数为2e,零元素个数为2n - 2e;
17.3.6 邻接表
17.3.7 稠密图和稀疏图
稠密图(完全图)适合使用邻接矩阵;而稀疏图适合使用邻接表;
17.3.8 网
边带权值的图称为网;
17.3.9 图的遍历
- 深度优先遍历(DFS):时间复杂度,邻接矩阵:O(n2);邻接表:O(n + e)
- 广度优先遍历(BFS):同深度;
17.3.10 拓扑排序
- AOV网:AOV网中不应该出现有向环,其是一个有向无环图;
17.4 查找
静态查找表:顺序查找、折半(二分)查找、分块查找
动态查找表:二叉树查找、平衡二叉树、B-树、哈希表
17.4.1 静态查找
17.4.1.1 顺序查找
查找成功的平均查找长度ASL = (n + 1) / 2
17.4.1.2 折半查找
查找列表必须是顺序存储且有序;
最多比较次数:log2n下取整 + 1次,平均查找长度为:[(n + 1) / n] * log2(n + 1) -1,当n较大时,ASL ≈ log2(n + 1) -1;
17.4.2 动态查找
17.4.2.1 哈希表
m的值一般取接近n但不大于n的质数;
装填因子α:表中装入的记录数 / 哈希表的长度
装填因子越小,发生冲突的可能性就越小,反之装填因子越大,发生冲突的可能性就越大;
构造哈希函数时应尽量使关键字的所有组成部分都能起作用;
17.4.2.2 堆
17.5 排序
17.5.1 直接插入排序
17.5.2 希尔排序
17.5.3 简单选择排序
17.5.4 堆排序
17.5.5 冒泡排序
17.5.6 快速排序
快速排序是一种分治的排序方法;
17.5.7 归并排序
归并排序是一种分治的排序方法;
17.6 其他
- 广度优先搜索图需要借助队列实现;
- 优先队列通常采用堆的数据结构来实现;向优先队列中插入一个元素的时间复杂度为O(lgn);
- 对一棵二叉排序树进行中序遍历,可以得到该二叉树中节点关键字的有序序列;
- 哈夫曼编码属于熵编码;
- 若网较稠密,则普利姆算法比较好,若网较稀疏,则克鲁斯卡尔算法比较好;
- 长度为n的非空字符串,其中的字符各不相同,则其互异的非平凡字串个数为
;