这一节将介绍贪心算法,它的基本思想是:
贪心算法产生优化解的条件是贪心选择性和优化子结构:
优化子结构:
一般的一个贪心算法是否正确,需要证明优化子结构和贪心选择性,接下来将从几个例子中来体会这种思想!
例1: 活动选择问题
思考 :该问题的优化子结构是?
该问题的优化子结构是:
贪心选择性:
算法的伪代码如下:
算法的复杂度分析:
例2: 哈夫曼编码树
编码树是什么?
编码树的代价是:
思考 :该问题的优化子结构是什么?贪心选择性是什么?
贪心选择性:
优化子结构:
算法的伪代码如下:
算法复杂度分析:
例3:最小生成树
生成树和最小生成树的概念:
例如,对于下方的一个加权无向图,其几种可能的生成树如下(其中红色的生成树是该图最小生成树):
思考 :贪心选择性是什么?最优子结构是什么?
(每次选择最小的边。。。。------> Kruskal算法)
贪心选择性:
优化子结构:
其中
,
是“收缩”操作,
写出算法的伪代码如下,这里使用到了并查集:
算法复杂度分析:
同样的思想,也有另外一种实现方式(Prim算法):
算法复杂度分析:
参考资料:
【1】哈工大骆吉洲《算法分析与设计》PPT