贪心算法:贪心选择性和最优子结构

  • Post author:
  • Post category:其他


每一个贪心算法之下,几乎总有一个更加繁琐的动态规划算法。

——CLRS

如果问题的最优解包含

两个

(或更多)子问题的最优解,且子问题多有重叠,我们考虑使用动态规划算法。

而如果问题经过贪心选择后,只剩下

一个

子问题,且具有优化子结构,那么可以使用贪心算法。


贪心选择性

:每一步贪心选出来的一定是原问题的最优解的一部分


最优子结构

:每一步贪心选完后会留下子问题,子问题的最优解和贪心选出来的解可以凑成原问题的最优解

例子:


1)活动选择问题


每次贪心地选择结束时间最早的活动,这样经过选择后,只剩下一个具有优化子结构的子问题,即在剩下的时间内选出最多的活动。


贪心选择性

:每次贪心地选择结束时间最早的活动,选出来的活动一定是原问题最优解的活动集合之一;


最优子结构

:每次贪心选出一个活动后,只剩下一个具有优化子结构的子问题,且这个子问题的最优解 加上 贪心选出来的那个活动 就是原问题的最优解活动集合。


2)哈夫曼编码 HUFFMAN



贪心选择性

:每次贪心选频率最低的两个,那频率最低的两个的编码一定是原问题的最优解的一部分;


最优子结构

:每次贪心选走的两个后,剩下的最优编码和贪心选走的那两个的最优编码一起可以合成原问题的最优编码。

不可以使用贪心算法的例子:

01背包问题:证明举反例,可以使用动态规划。

其中 生成哈夫曼树 和 最小生成树kruskal算法 都用到了

缩小

(而不是简单删去)。