算法 *-* 贪心算法Greedy

贪心 vs 动态规划

联系

  • 都是一种推导算法
  • 都是分解成子问题来求解,都需要具有最优子结构

区别

如果把所有的子问题看成一棵树的话:

  • 贪心:贪心从根出发,每次向下寻找(原文:遍历)最优子树即可。通常这个“最优”都是基于当前情况下显而易见的“最优”,仅需看本节点的情况,不需要知道该节点的所有子树情况,于是构不成一颗完成的树。贪心得到的并不一定是最优解,贪心只能得到一个比较好的解
  • 动态规划:动态规划是自底向上,从叶子向根,构造子问题的解。对每一个子树的根,都要求出其下面每一个叶子的值,并且最终选择其中的最优值作为自身的值,得到答案。最后得到一棵完整的树。动态规划本质是穷举法,可以保证结果是最佳的,复杂度高

重要例子

如果现在要找开 15元钱,有11元的,5元的和1元的,则:

  • 根据动态规划法的解题思想,得到最优解为3张5元面额的, 总共3张
  • 根据贪心算法的解题思想,得到的近似最优解为1张11元面额的(先从最优的情况,最能达到目的的选择做起),加上4张1元面额的,总共5张

我们发现,贪心得到的并不是最优解,只是一个比较好的解,但贪心算法是最容易想到的,也是最符合人性的思路。

因此,大部分国家的货币设计,会让“贪心算法”的解就是最优解。

什么时候用贪心,而不是动态规划?

用贪心的情况:

(从根出发,每次向下)每一步都做出一个局部最优的选择,最终的结果就是全局最优

注意哦,这是一种特殊性质,其实只有一小部分问题拥有这个性质。比如你面前放着 100 张人民币,你只能拿十张,怎么才能拿最多的面额?显然每次选择剩下钞票中面值最大的一张,最后你的选择一定是最优的。

参考文章

https://blog.csdn.net/ppppublic/article/details/61629248

https://www.cnblogs.com/Joezzz/p/9716193.html

原文地址:https://www.cnblogs.com/frankcui/p/14208895.html