p'数据结构
57-65 9分 数据结构+算法
时间复杂度
加法规则
多项相加,保留高阶项,系数化为1(最高阶太大了,其余的可以忽略不计),系数化为1。
乘法规则
多项相乘,都保留,并将系数化为1
时间复杂度实例
空间复杂度
O(1) O(n) O($n^2$)
渐进符号
渐进上界的括号内要大于等于等式左边的计算结果。
渐进下界的括号内要小于等于等式左边的计算结果。
渐进紧致界 想要正确 就得渐进上限相等&&渐进下限相等。
递归 时时间、空间复杂度
对于每次递归过程中时间复杂度不变的情况:递归时间复杂度 = 递归的次数*每次递归的时间复杂度。
每趟递归中的时间复杂度和n有关。
顺序表
链表
单链表
双链表
循环链表
串
矩阵
对称矩阵
二维对称矩阵压缩一维对应公式为:
arr[0...m,0...n]
arr[i,j] = $(1+i)i/2+j$
arr[1...m,1...n]
arr[i,j] = $(1+(i-1))(i-1)/2+(j-1)$
对角矩阵
问题:对角的0不需要存储公式:前面的i列+当前元素前面的行数
下标0: $i*3-1+j-i+2$ = $2i+j+1$
下标:2(i-1)+(j-1)+1
稀疏矩阵
容量大,但可用元素很少。
三元表
十字链表
树
概念
孩子,父亲,兄弟
节点度:节点的子树个数。
树的度:所有节点度的最大值
叶子节点:
内部节点:度不为0
节点的层:
树的高度:最大层数。
性质
- 节点的个数=所有度数和加1。
- 度为m的树中第i层至多有$m^(i-1)$个节点。 i从1开始
3.度为m的树中最多有$m^h-1/m-1$个节点
等比数列求和 公比q = $a2/a1 = m1/m0 = m$
等比数列求和公式推导
$1(1-m^h)/1-m = 1-m^h/1-m = m^h-1/m-1$
公式为$m^h-1/m-1$
4.具有n个节点度为m的树,最低的高度为:$「h=logm^(n(m-1)+1)⌉$
$n = m^h-1/m-1$
=> $n(m-1) = m^h-1$
=>$n(m-1)+1=m^h$
=>$h=logm^{n(m-1)+1}$
二叉树
性质
-
对于任何二叉树,叶子节点的个数 = 度为2节点的个数+1
$n_0+n_1+n_2+1 = n$
$n_00 + n_11+n_2*2 = n$
$n_0+n_1+n_2+1 = n_00 + n_11+n_2*2$
$=>n_0+n_1+n_2+1 = n_1+n_2*2 $
$=>n_0+1 = n_2 $
$=>n_0 = n_2-1 $
-
二叉树的第i(i>=1)层上至多有$2^(i-1)$个节点
-
高度为h的二叉树最多有 $2^h-1/2-1 = $ $2^h-1$、
-
具有n个结点的完全二叉树的高度为[logzn]+1或[log2(n + 1)]
卡特兰树
公式 = $c^n_{2n}/n+1$
$c^m_n = n!/m!*(m-1)!$
二叉树存储
顺序存储
- i=1 当前节点为根节点,无双亲若 若i>1,则该结点的双亲结点为i/2 下取整。
- 2i <= n 2i 为i的左孩子,否则无左孩子。
- 2i + 1<= n 2i+1 为i的右孩子,否则无右孩子。
链式存储
平衡二叉树
二叉树中任意节点的左右子树相差绝对值小于等于1
二叉排序树
二叉排序树(二叉查找树)
根结点的关键字大于左子树所有结点的关键字,
小于右子树所有结点的关键字,
左右子树也是一颗二叉排序树,
中序遍历得到的序列是有序序列,
最优二叉树(哈夫曼树)
带权路径最短的树(权值大离根节点近):
- 树的路径长度:从根节点到叶子节点的路径长度和。
- 节点的带权路径长度:权值*节点的路径长度
- 树的带权路径长度和:树中所有叶子节点带权路径长度和
性质:
- 最优二叉树不唯一但WPL(树的带权路径长度和)是唯一的
- 只有度为0和度为2的节点
- 总节点个数为:
$节点的总个数 = n_0+n_2$
$n_0 = n_2+1$ => $n_2 = n_0-1$
=> $总个数 = n_0+ n_0-1 = 2n_0-1$
哈夫曼编码
- 构造二叉树
- 左0右1编码
压缩比
等长编码
需要表示六个不同的字符的编码
$ 2^x = 6 => x = 3$
(40+10+20+16+14)*3 = 300
哈夫曼编码
编码长度不相同
$401+3(11+20+16+14) = 220$
等长编码:(40+10+20+16+14)*3 = 300
哈夫曼编码:$401+3(11+20+16+14) = 220$
压缩比:等长编码-哈夫曼编码 / 等长编码 = (300 - 220 )/ 300 = 0.27
图
分类
有向图
顶点集合$<V_i,V_j>$
无向图
顶点集合$(V_i,V_j)$
完全图
任意两个顶点之间都有边
有向完全图
无向完全图
度
和顶点v相关联的边
有向图:
无向图:度=出度+入度
总度数 = 2 * 边
路径
路径:一个顶点到另一个顶点的边
回路:路径大于1 且 起点和终点相同。
简单路径:除起点和终点相同,其余路径均不相同。
连通图
任意两个顶点之间都有路径
连通图:
最少:n-1
最多(完全图):n(n-1)/2
强连通图
最少:n
最多(完全图):n(n-1)
存储结构
邻接矩阵
有向图一个顶点一个1
无向图一个顶点两个1
邻接表
为每个顶点创建一个单链表
无向图表节点 = 2 * 边
有向图表节点 = 边
稠密图和稀疏图
稠密图:边多 ->使用邻接矩阵存储
稀疏图:边少->使用邻接表存储
网
边上带权值
遍历
深度优先遍历(递归 ) 广度优先遍历(队列)
采用邻接矩阵存储的时间复杂度:$O(n^2)$(n 节点个数)。
采用邻接表存储的时间复杂度:$无向图=O(n+e)$遍历所有节点的时间复杂度+所有边的时间复杂度。