算法设计与分析
1. Introduction
1.1. Stirling 公式
1.2. 取整函数
2. Algoritnm Basis
2.1. 序列求和
2.2. 迭代法求解递推方程(汉诺塔问题为例)
2.3. 差消法化简递推方程(快排为例)
py
1
def qsort(arr, start, end):
2
if end - start <= 1: return
3
mid = split(arr, start, end)
1
def qsort(arr, start, end):
2
if end - start <= 1: return
3
mid = split(arr, start, end)
2.4. 主定理
-
若 则
-
若 则
-
若 且 则
不能使用主定理的例子
3. Divide and Conquer
3.1. 分治算法改进:减少子问题数量
3.2. 分治算法改进:增加预处理
作用是减少
4. Classic Divide and Conquer
4.1. 一般性质选择问题
5个一组分别排序,每个组的中位数的集合取中位数 ,根据 划分子问题,根据子问题的规模大小与 的大小关系排除部分子问题
4.2. 卷积
4.3. 多项式系数
4.4. 分治法多项式求值
assume that is odd
4.5. FFT
求多项式 和 的乘积 选择个的值(选择的次根),求出和的值,再用求出,最后多项式插值求出
- 对每个计算和的值
- 对每个计算的值
- 定义
- 计算
5. Dynamic Programming
5.1. 矩阵链相乘
另 为 的最小开销
5.2. 投资问题
元投资给 个项目,每个项目的收益为
5.3. 背包问题
种物品,可以拿多个,重量为 ,价值为,背包容量为,求最大价值
也可以写成投资问题那样,每一步都对拿几个进行迭代,但是时间复杂度更差
5.4. 最长公共子序列
给定 和
5.5. 最长上升子序列
给定
令 表示以 结尾的最长上升子序列
(考虑到 是递增的,也可以二分查找优化下)
6. Applications of DP
6.1. 图像压缩
给定 ,对 进行分段,每个分段中每个数字占用的存储空间是 ,求占用空间最小的分段方式
令 表示以 为结尾的数据的最优分段占用
6.2. 最大字段和
给定 ,求 的连续子序列的和的最大值
令 表示以 为结尾的子序列的和的最大值
6.3. RNA二级结构预测
有点像矩阵链相乘,但是的切分更复杂一点,这里需要和配对,再单独考虑不会配对的情况
6.4. 编辑距离
给定 和 ,对 进行插入,删除和替换操作,将变为的最少操作次数
7. Greedy Algoritnm
7.1. 活动选择问题最优性证明
命题:在算法执行到第步时,选择了个活动,最优解包含
- 归纳基础
- 最优解A中包含
- 归纳步骤
-
已知最优解中包含 ,证明最优解包含
另剩下的问题叫做,为
可以证明是的最优解,因为如果存在更优的解,就不是最优解了 因为是的最优解,所以,所以最优解包含
7.2. 最优装载问题
0-1背包问题的特殊情况:价值都是1
证明最优性:去掉箱子1
7.3. 硬币找零问题
即使输入是 的整数倍时,选择 仍然要是最优的
8. Applications of Greedy Algoritnm
8.1. 哈夫曼算法证明
- 最小的两个在一起
- 在一起之后可以等效成一个
8.2. 最小生成树
- Prime 算法
- 初始化,不断选择 和 之间的最短的边,将对应的点加入到
证明: 如果和之间的边是另一个,则和这一个构成环,可以用更小的这一个替代那一个
- Kruskal 算法
- 排序所有边,从小到大选择不构成环的边
证明: 最小的边一定正确,合并两个端点,化归成问题
单链聚类是和Kruskal算法同样的流程,但是剩下个类就停了