算法设计与分析(4)——贪心法

博客内容主要是以 北京大学 屈婉玲老师的 MOOC 视频来写的。视频共是十周的内容,我决定用篇博客完成。

温馨提示:这个课程不仅适用于 算法设计与分析 的学习,也非常适用于 数学建模 的学习,如果是学习 数学建模的基础部分,前两周的内容是非常适合的,如果要进一步学习 建模思想,建议把这十周视频好好看一遍。( •̀ ω •́ )y

我们还是先来看一下这十周视频的思维导图:算法设计与分析(4)——贪心法_第1张图片
在这篇博客中写的是七、八周的内容:贪心法。

第七周

知识点

贪心算法的设计要素:
(1)贪心法适用于组合优化问题。
(2)求解过程是多步判断过程,最终的判断序列对应于问题的最优解。
(3)依据某种 “ 短视的 ” 贪心选择性质判断,性质好坏决定算法的成败。
(4)贪心法必须进行正确性证明。
(5)证明贪心法不正确的技巧:举反例。

贪心法的优势:
算法简单,时间和空间复杂性低。

贪心法的例子:活动选择问题

时间复杂度:O(nlogn)
贪心策略:结束早的优先

算法设计与分析(4)——贪心法_第2张图片 算法设计与分析(4)——贪心法_第3张图片 算法设计与分析(4)——贪心法_第4张图片 算法设计与分析(4)——贪心法_第5张图片 算法设计与分析(4)——贪心法_第6张图片 算法设计与分析(4)——贪心法_第7张图片

贪心法正确性证明

第一数学归纳法、第二数学归纳法

两种归纳法的区别:
归纳基础一样,归纳步骤不同。

证明步骤:
(1)叙述一个有关自然数 n 的命题,该命题断定该贪心策略的执行最终将导致最优解。其中自然数 n 可以代表算法步数或者问题规模。

(2)证明命题对所有的自然数为真。
归纳基础(从最小实例规模开始)
归纳步骤(第一或第二数学归纳法)

活动选择的正确性证明

算法设计与分析(4)——贪心法_第8张图片 算法设计与分析(4)——贪心法_第9张图片 算法设计与分析(4)——贪心法_第10张图片 算法设计与分析(4)——贪心法_第11张图片

最优装载问题

最优装载问题是 0-1 背包的子问题(每件物品重量为1),到现在为止, 0-1 背包还是 NP 难问题,没有多项式时间的解法。但是,最优装载问题存在多项式时间的解法。

贪心策略:轻者优先。

问题:
算法设计与分析(4)——贪心法_第12张图片
建模:
算法设计与分析(4)——贪心法_第13张图片
算法设计:
算法设计与分析(4)——贪心法_第14张图片
证明思路:
算法设计与分析(4)——贪心法_第15张图片
算法设计与分析(4)——贪心法_第16张图片
算法设计与分析(4)——贪心法_第17张图片
算法设计与分析(4)——贪心法_第18张图片

最小延迟调度

贪心策略:按完成时间从早到晚安排任务,没有空闲。
算法设计与分析(4)——贪心法_第19张图片
算法设计与分析(4)——贪心法_第20张图片
算法设计与分析(4)——贪心法_第21张图片
贪心策略:
算法设计与分析(4)——贪心法_第22张图片
伪码:
算法设计与分析(4)——贪心法_第23张图片
正确性证明:交换论证
算法设计与分析(4)——贪心法_第24张图片
算法设计与分析(4)——贪心法_第25张图片
算法设计与分析(4)——贪心法_第26张图片
算法设计与分析(4)——贪心法_第27张图片

得不到最优解的处理方法

贪心策略不一定得到最优解,在这种情况下可以有两种处理方法:
方法一:输入参数分析
考虑输入参数在什么取值范围内使用贪心法可以得到最优解。

方法二:误差分析
估计贪心法——近似算法所得到的解与最优解的误差(对所有的输入实例在最坏情况下误差的上界)

一个参数化分析的例子:找零钱问题。

找零钱问题

算法设计与分析(4)——贪心法_第28张图片 算法设计与分析(4)——贪心法_第29张图片 算法设计与分析(4)——贪心法_第30张图片 算法设计与分析(4)——贪心法_第31张图片 算法设计与分析(4)——贪心法_第32张图片 算法设计与分析(4)——贪心法_第33张图片 算法设计与分析(4)——贪心法_第34张图片 算法设计与分析(4)——贪心法_第35张图片 算法设计与分析(4)——贪心法_第36张图片

第八周

最优前缀码

二元前缀码及其二叉树表示
给定频率下的平均传输位数计算公式
最优前缀码——平均传输位数最少
哈夫曼算法
前缀码的性质
算法设计与分析(4)——贪心法_第37张图片
算法设计与分析(4)——贪心法_第38张图片
算法设计与分析(4)——贪心法_第39张图片
算法设计与分析(4)——贪心法_第40张图片
算法设计与分析(4)——贪心法_第41张图片
算法设计与分析(4)——贪心法_第42张图片
算法设计与分析(4)——贪心法_第43张图片
算法设计与分析(4)——贪心法_第44张图片

哈夫曼算法的正确性证明

哈夫曼算法的正确性证明,需要用到上面前缀码的两个性质。

哈夫曼算法的应用:文件归并
算法设计与分析(4)——贪心法_第45张图片
算法设计与分析(4)——贪心法_第46张图片
算法设计与分析(4)——贪心法_第47张图片
算法设计与分析(4)——贪心法_第48张图片
算法设计与分析(4)——贪心法_第49张图片
算法设计与分析(4)——贪心法_第50张图片
算法设计与分析(4)——贪心法_第51张图片
算法设计与分析(4)——贪心法_第52张图片
算法设计与分析(4)——贪心法_第53张图片

Prim算法

贪心策略:连接 S 与 V-S 的最短边
时间复杂度:O(n^2)

正确性证明:归纳法
算法设计与分析(4)——贪心法_第54张图片
算法设计与分析(4)——贪心法_第55张图片
算法设计与分析(4)——贪心法_第56张图片
算法设计与分析(4)——贪心法_第57张图片

Kruskal算法

贪心策略:在不构成回路条件下选当前最短边
时间复杂度:O(mlogn)

应用:单链聚类

设计思想:
(1)按照长度从小到大对边排序。
(2)依次考察当前最短边e,如果e与T的边不构成回路,则把e加入树T,否则跳过e。直到选择了n-1条边为止。

短接操作:
算法设计与分析(4)——贪心法_第58张图片
正确性证明:
算法设计与分析(4)——贪心法_第59张图片
算法设计与分析(4)——贪心法_第60张图片
算法设计与分析(4)——贪心法_第61张图片
算法设计与分析(4)——贪心法_第62张图片

应用:
数据分组问题
一组数据(照片,文件,生物标本)要把它们按照相关性进行分类。
用相似度函数或 “距离” 来描述个体之间的差距。
如果分成5类,使得每类内部的个体尽可能相近,不同类之间的个体尽可能地 “远离” 。如何划分?

类似于Kruskal算法:
(1)按照边长从小到大对边排序。
(2)依次考察当前最短边e,如果 e 与已经选中的边不构成回路,则把 e 加入集合,否则跳过e。计数图的连通分支个数。
(3)直到保留了 k 个连通分支为止。

单源最短路径问题及算法

算法设计与分析(4)——贪心法_第63张图片 算法设计与分析(4)——贪心法_第64张图片 算法设计与分析(4)——贪心法_第65张图片 算法设计与分析(4)——贪心法_第66张图片

Dijkstra算法

算法设计与分析(4)——贪心法_第67张图片 算法设计与分析(4)——贪心法_第68张图片 算法设计与分析(4)——贪心法_第69张图片 算法设计与分析(4)——贪心法_第70张图片

七八周小结

1.贪心法适用于组合优化问题。
2.求解过程是多步判断过程,最终的判断序列对应于问题的最优解。
3.判断依据某种 “ 短视的 ” 贪心选择性质,性质的好坏决定了算法的正确性。贪心性质的选择往往依赖于直觉或者经验。

贪心法正确性证明方法:
(1)直接计算优化函数,贪心法的解恰好取得最优值。
(2)数学归纳法(对算法步数或者问题规模归纳)
(3)交换论证。

证明贪心策略不对:举反例。

对于某些不能保证对所有的实例都得到最优解的贪心算法(近似算法),可做参数化分析或者误差分析。

贪心法的优势:算法简单,时间和空间复杂性低。

几个著名的贪心算法:
最小生成树的 Prim 算法; 贪心策略:连接 S 与 V-S 的最短边,时间复杂度:O(n^2)
最小生成树的 Kruskal 算法;贪心策略:在不构成回路条件下选当前最短边,时间复杂度:O(mlogn)
单源最短路的 Dijkstra 算法。贪心策略:连接 已加入到集合 S 中的点与 V-S 的最短边,时间复杂度:O(mn)

你可能感兴趣的:(算法,算法,数学建模)