概念
渐进分析
O记号:渐进上界
给定一个函数g(n),O(g(n)) = {f(n):存在正常数c和n0,使得对所有的n ≥ n0,有0 ≤ f(n) ≤ cg(n)}
Ω记号:渐进下界
给定一个函数g(n),Ω(g(n)) = {f(n):存在正常数c和n0,使得对所有的n ≥ n0,有0 ≤ cg(n) ≤ f(n)}
Θ记号:渐进紧致界
渐进紧致界就是算法运行时间的渐进上界和渐进下界。
给定一个函数g(n),Θ(g(n)) = {f(n):存在正常数c1,c2和n0,使得对所有的n ≥ n0,有0 ≤ c1g(n) ≤ f(n) ≤ c2g(n)}
广义表
一种线性存储结构,广义表中存储的单个元素称为“原子”,广义表可以包含其他广义表,可以当做结构体去理解。
图(网)
无向图:连接顶点的边没有方向
有向图:连接顶点的边有方向
完全图:所有顶点互相连接的无向图
AOV网(Activity On Vertex Network)
顶点—表示活动,是一个有向无回路的图。
顶点:表示活动。
边:表示活动间的优先关系的有向图称为-顶点表示活动的网
求拓扑序列就是AOV
AOE网(Activity On Edge)
边—表示活动,是一个带权的有向无环图。
边:表示活动
顶点:表示事件
权:表示活动持续时间
求关键路径就是AOE
用来估算工程的完成时间
邻接矩阵
https://blog.csdn.net/diviner_s/article/details/106978910
熵编码
香农(Shannon)编码、哈夫曼(Huffman)编码,指数哥伦布编码(Exp-Golomb)和算术编码(arithmetic coding)。
二叉树
概念
度: 结点拥有的子树数目称为结点的度。
结点层次: 从根开始定义起,根为第一层,根的孩子为第二层,以此类推。
树的深度: 树中结点的最大层次数称为树的深度或高度。
关键码序列:
若任意节点的左子树不空,则左子树上所有结点的 值均小于它的根结点的值。
若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值。
二叉树遍历
①前序遍历的方式是:首先访问根节点,然后访问左子树,最后访问右子树。
②中序遍历的方式是:首先访问左子树,接着访问根结点,最后访问右子树。
③后序遍历的方式是:首先访问左子树,接着访问右子树,最后访问根结点。
④层序遍历的方式是:按层从上到下,每层按一定顺序(从左到右、从右到左)对树的节点进行遍历。
二叉树的分类
详细说明移步传送门
- 满二叉树
每一层的节点数均达到最大值。 - 完全二叉树
一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。 - 最优二叉树
哈夫曼树。 - 平衡二叉树
一棵空树,或左子树和右子树的深度差的绝对值不超过1,并且左子树和右子树都是一棵平衡二叉树。 - 有序二叉树(二叉搜索树、二叉查找树、二叉排序树)
左子树上的数值小于树根上的值,树根的值小于右子树的值。
哈夫曼树
概念
- 路径:一个节点到另一个节点之间的通路。
- 节点的权:给每一个节点赋予一个数值,被称为节点的权。
- 节点的带权路径长度 = 从根节点到该节点的路径长度 x 该节点的权
- 树的带权路径长度 = 所有叶子节点的带权路径长度之和
特点
当用n个节点构建一个树时,带权路径长度最小的树就是哈弗曼树。
构成方法
①在 n 个权值中选出两个最小的权值,对应的两个结点组成一个新的二叉树,且新二叉树的根结点的权值为左右孩子权值的和;
②在原有的 n 个权值中删除那两个最小的权值,同时将新的权值加入到 n–2 个权值的行列中,以此类推;
③重复 1 和 2 ,直到所以的结点构建成了一棵二叉树为止,这棵树就是哈夫曼树。
M阶B-树
一棵m阶B-树(就是B树)(balanced tree of order m)是一棵平衡的m路搜索树。它或者是空树,或者是满足下列性质的树:
- 根节点至少有2个子节点
- 每个非根节点(分支节点)至少有┌m/2┐个子节点(向上取整)
- 关键字个数 j ,有 -1≤ j≤ m-1
- 除根结点以外的所有结点(不包括叶子结点)的度数正好是关键字总数加1,故内部子树个数 k 满足:┌m/2┐ <= k <= m ;
- 所有叶子节点都在同一层
排序算法
排序算法 | 稳定性 | 时间复杂度 (通常情况) | 时间复杂度 (极端情况) |
---|---|---|---|
快速排序 | 不稳定 | O(nlogn) | 最坏:O(n²) |
插入排序 | 稳定 | O(n²) | 最好:O(n) |
归并排序 | 稳定 | O(nlogn) | O(nlogn) |
选择排序 | 不稳定 | O(n²) | O(n²) |
希尔排序 | 不稳定 | O(n^1.3) | O(n²) |
堆排序 | 不稳定 | O(nlogn) | O(nlogn) |
快速排序
①选定一个元素(一般取第一个或中间的元素)作为基准值。
②遍历数组中所有元素,小于基准值的放左边,大于基准值的放右边。
③将基准值左右两组元素看做子数组,执行①②,直到子数组仅有1个元素时结束递归。
插入排序
就好像理手中的扑克牌,将刚抓到的排按顺序插到它应在的位置。
插入排序从数组的第二个元素开始,和前一个元素(这里记作x)比较:
如果小于x,则将x向后移,再与前一个元素比较,如此反复直到小于x。
如果大于等于x,则停止比较,将该元素插入到当前位置。
归并排序
将数组递归地平均分成2份,直到数组元素个数不足2个。
比较子数组中元素的大小,按顺序存放到result数组中。
(result数组是新申请的空间,用于存放排序后的数组)
与快速排序的区别是:归并排序不需要根据基准值划分子数组,而是直接将数组元素平均分成2份。
选择排序
遍历整个数组,找出最小的元素,将该元素和数组第一个元素互换位置。
继续遍历数组中乱序的部分,找出最小的元素,将该元素和乱序部分的第一个元素互换位置。
希尔排序
插入排序算法改进版,将数组指定步长然后排序,详细请见传送门。
堆排序
大顶堆:
完全二叉树中,每个节点的值都大于其子节点的值,用于升序排列。
小顶堆:
完全二叉树中,每个节点的值都小于或等于其子节点的值,用于降序排列。