目录
三个渐进记号
分治策略
①迭代法
②递归树法
③主定理法
分治的应用
堆
堆应用
动态规划
动态规划应用
贪心算法
贪心算法应用
回溯法
回溯法应用
图
图的遍历
BFS
DFS 记录时间戳
拓扑排序
强连通分量
最小生成树
流网络
NP、P
摊还分析
三个渐进记号
f(n)=O(g(n))其实是代表f(n)∈O(g(n))
渐近上界记号O
O(g(n)) = { f(n) : 存在正常量c和n0,使得对所有n ≥ n0,有0 ≤ f(n) ≤ cg(n)}
渐近下界记号 Ω
Ω(g(n)) = { f(n) :存在正常量 c 和 n0,使得对所有 n³ n0 有 0 ≤ cg(n) ≤ f(n) for all n ≥ n0 }
渐近紧确界记号Θ
Θ(g(n)) = { f(n) : 存在正常量c1, c2和n0,使得对所有n ≥ n0,有0 ≤ c1 g(n) ≤ f(n) ≤ c2 g(n)}
分治策略
将一个问题分解为与原问题相似但规模更小的若干子问题,递归地解这些子问题,然后将这些子问题的解结合起来构成原问题的解。这种方法在每层递归上均包括三个步骤:
Divide (分解):将问题划分为若干个子问题
Conquer (求解):递归地解这些子问题;若子问题 Size 足够小,则直接解决之
Combine (组合):将子问题的解结合成原问题的解
①迭代法
②递归树法
每个节点标注的是合并代价,然后把每一行的加起来,要算一下总共有多少层。
③主定理法
主方法可解如下形式的递归式
T(n) = aT(n/b) + f(n)
关键是看 f(n) 和 nlogba 谁比较大。
Case 1 成立,如果 nlogba 较大 ,那么T(n) = Θ(nlogba ).
Case 2 (当 k = 0) 成立,如果 f(n) 和 nlogba 大小相当。T(n) = Θ(f(n)lgn).
一般来说, 当 f(n) 和 nlogba lgkn 大小相当 ,T(n) = Θ(f(n) lgk+1n).
Case 3 成立,如果 f(n) is 较大 è T(n) = Θ(f(n)).
分治的应用
最大子数组
矩阵乘法Strassen
凸包问题
棋盘覆盖问题
二维最近点对问题
堆
二叉树
根深度为0,叶子高度为0.
满二叉树
完全二叉树(右下角可以缺一些)
有两种说法,一种是全满的叫满二叉树,右下角缺一点的叫完全二叉树。另一种是全满的叫完全二叉树,右下角缺一点的叫近似完全二叉树。
堆就是一个完全二叉树。用数组来存堆,下标从1开始。
建堆的效率O(n),堆化的效率O(lgn),推排序的效率O(nlgn)
堆应用
TopK问题
Prime算法
huffman编码
动态规划
动态规划主要用于求解以阶段划分的动态过程的优化问题。
最优子结构,用反证法证。问题的最优解是由其子问题的最优解来构造,则称该问题具有最 优子结构性质。
动态规划要定义符号,找关系,写出递推公式,记得写边界条件。
动态规划有最普通的递归,自顶向下带备忘的,自底向上打表的。
动态规划应用
钢条切割
0-1背包
矩阵链乘
最长公共序列
分段最小二乘
鸡蛋掉落
贪心算法
从问题的某一个初始解出发, 通过一系列的贪心选择 —— 当前状态下的 局部最优 选择,逐步逼近给定的目标 ,尽可能快地求得更好的解。 不一定是最优解。
贪心算法应用
0-1背包
小数背包
找钱问题
活动选择问题
回溯法
再解空间中搜,可以剪枝,减少搜索空间。
回溯法应用
n皇后问题
装载问题
0-1背包
分数背包
地图填色
图
图的遍历
BFS
白色节点表示该节点还未被访问
灰色节点表示它被访问过,但是还没有对它的所有邻居进行访问
黑色节点表示它被访问过,而且已经访问了它的所有邻居
DFS 记录时间戳
拓扑排序
只有有向无环图才可以拓扑排序。
先选没有入度的点,删了它和它的边,再选没有入度的点。
强连通分量
先dfs一次,在转置图上,按照时间戳最大的开始dfs,几次dfs就是几个连通分量。
最小生成树
Kruskal和Prim都是贪心算法。
Krusal用并查集, 总的时间复杂度 : O (| E | lg | E |) 或者 O (| E | lg | V |)
prim
Kruskal稀疏图比较好,Prim稠密图比较好。
Kruskal算法实现简单一点。
流网络
割
割的容量:只算S->T的
割的净流:正反的流量都加起来
同一个图,不同割的净流是一样的。
NP、P
NP类问题是多项式时间内可以被验证的问题。
P类问题是多项式时间内库解决的问题。
如果问题Q满足两个条件:
①Q是NP问题
②任何NP问题都可以归约到Q
则称:Q为NPC问题。
如果问题H满足NPC条件中的第二条,即满足任何NP问题都可以归约到H,但不一定满足第一条,那么称H是NP-hard问题,简称NPH问题。
摊还分析
合计法、聚合方法( aggregate):计算对所有的 n 个操作序列在最坏情况下的总时间为 T(n) 。因此,最坏情况下每个操作的平摊代价为 T(n)/n
核算法、会计法(accounting) :给生活费,给了就不管了。
势能法(potential) :不同题目势的定义是不同的。