zoukankan      html  css  js  c++  java
  • 算法 *-* 贪心算法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

  • 相关阅读:
    Java基础06 组合
    纸上谈兵: 树, 二叉树, 二叉搜索树
    Java基础05 实施接口
    纸上谈兵: 队列 (queue)
    纸上谈兵: 数学归纳法, 递归, 栈
    Java基础01 从HelloWorld到面向对象
    纸上谈兵: 表 (list)
    Java基础02 方法与数据成员
    纸上谈兵: 排序算法简介及其C实现
    纸上谈兵: 栈 (stack)
  • 原文地址:https://www.cnblogs.com/frankcui/p/14208895.html
Copyright © 2011-2022 走看看