1、基本概念
贪心算法是一种求解组合优化问题的算法设计技术,其求解过程由一系列决策构成,每一步决策仅依赖于局部优化的性质。
与动态规划算法不同,贪心算法在做决策时候不必考虑所有子问题的选择结果。
贪心算法适用的条件
问题的求解可以由一系列的决策步骤构成,每步决策依赖于某种局部最优的贪心策略。正确的贪心策略要保证每一步基于局部优化性质的选择最终导致全局的最优解。
如何不具有上述性质,贪心法对某些实例只能得到近似解。
主要设计步骤:
1.将问题的求解看作是一系列的决策
2.确定每一步决策所依据的局部优化性质
3.证明每一步基于局部优化性质的选择最终导致全局最优解
2、贪心法正确性证明方法
方法一:数学归纳法
主要步骤如下:
(1)叙述一个论证算法正确性的与自然数相关的命题P(n),这里的n可以代表算法步数或者实例规模。例如:
对于任何正整数n,贪心法的前n步选择将导致最优解
对于任何正整数n,贪心法对于规模为n的任何实例都得到最优解
(2) 使用第一或者第二数学归纳法证明上述命题P(n)
第一数学归纳法
证:
P(1)为真
若P(n)为真,则P(n+1)为真
第二数学归纳法:
证:
P(1)为真
若对所有k<n,有P(k)为真,则P(n)为真
方法二:交换论证法
主要步骤如下
(1)分析一般最优解与贪心法的解的区别,然后定义一种转化规则,使得从任意一个最优解出发,经过不断对解的某些成分的排列次序进行交换或者用其他元素替换,将这个解最终能够转变成贪心法的解。
(2)证明在上述转换中解的优化函数值不会变坏。
(2)证明上述转换在有限步结束。
3、典型的贪心法
- 区间调度
- 区间划分
- 最小延迟调度
- 最优前缀问题(哈夫曼编码)
- 最小生成树问题(Prim算法(O(n^2)) Kruskal算法(O(mlogm)))
- 单源最短路径(Dijkstra算法(O(n^2)))
- …
4、注意事项
使用贪心法一定要证明其正确性!
想到贪心法不难,难在证明!