注:本学期刘老师上课内容知识点整理。
贪心算法
贪心不一定正确,需要证明
活动安排问题
算法正确性证明:
贪心算法的基本要素:
贪心选择性质和最优子结构性质
贪心选择性质
对比: 矩阵连乘, 0-1背包 vs 分数背包,活动安排
贪心算法第一基本要素, 与DP主要区别
==自顶向下计算 ==
OSP: 最优策略的子策略也是最优 //动规, 贪心
== 正确性证明一般过程: ==
贪心选择+OSP+数学归纳法
条件: 子问题与原问题类似, 相对独立 //不类似? 则需要另外方法
子问题的最优解和贪心选择联合得整体最优解
一般设计过程:
- 将问题描述为贪心选择和一个待解决子问题的形式
- 贪心选择性质: 证明贪心选择是正确的
- 最优子结构性质:
确保若将子问题的最优解和贪心选择结合, 则能得到原问题的最优解.
活动安排问题
贪心选择: 最早结束的活动
子问题: T1 = { 开始时间晚于f1的活动 }
最优编码问题(Huffman编码)
确定解的结构: 二叉树
好的编码:
大频率编码短
小频率编码长
正则二叉树
相对平衡
贪心选择性质:
存在最优解其频率最小两叶节点深度最大
存在最优解其频率最小两叶节点是兄弟
最优编码问题
贪心选择: 频率最小的两个字母是兄弟. 子问题?
原问题: 6个符号待编码
子问题: 5个符号待编码
输入C[1:n], f[1:n] //字母集C和频率f
1. Q=C //建优先队列Q, O(n)
2. 对 i = 1:n-1 //循环n-1次
3. 分配新节点z
4. 取Q中f最小x作为z的左孩子//O(log n)
5. 取Q中f最小y作为z的右孩子//O(log n)
6. f[z] = f[x] + f[y]
7. 将z插入Q中 //O(log n)
8. 取出Q中节点作为树根 //?
最短路问题
- 全点对最短路(APSP)
DP:
1. D[i,j][0] = w[i,j], 不存在的边值取无穷大
2. 对k=1:n
3. 对i=1:n, 对j=1:n
4. 若D[i,k][k-1]