zoukankan      html  css  js  c++  java
  • 五大算法思想—贪心算法

    怎么理解


      贪心法在解决这个问题的策略上目光短浅,仅仅依据当前已有的信息就做出选择,并且一旦做出了选择。无论将来有什么结果,这个选择都不会改变。

      一句话:不求最优,仅仅求可行解。


    怎样推断


        对于一个详细的问题,怎么知道是否可用贪心算法解此问题,以及是否能得到问题的最优解?

      我们能够依据贪心法的2个重要的性质去证明:贪心选择性质和最优子结构性质

      1、贪心选择

      什么叫贪心选择?从字义上就是贪心也就是目光短线。贪图眼前利益。在算法中就是仅仅依据当前已有的信息就做出选择,并且以后都不会改变这次选择。(这是和动态规划法的主要差别)  

      所以对于一个详细问题。要确定它是否具有贪心选择性质,必须证明每做一步贪心选择是否终于导致问题的总体最优解。

      2、最优子结构

      当一个问题的最优解包括其子问题的最优解时,称此问题具有最优子结构性质。

      这个性质和动态规划法的一样,最优子结构性质是可用动态规划算法或贪心算法求解的关键特征。

     



    区分动态规划


       动态规划算法通常以自底向上的方式解各子问题,是递归过程。

      贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。


      以二叉树遍历为例:

       贪心法是从上到下仅仅进行深度搜索。也就是说它从根节点一口气走到黑的,它的代价取决于子问题的数目,也就是树的高度,每次在当前问题的状态上作出的选择都是1。不进行广度搜索。所以终于它得出的解不一定是最优解。非常有可能是近似最优解。

      而动态规划法在最优子结构的前提下,从树的叶子节点開始向上进行搜索,而且在每一步都依据叶子节点的当前问题的状况作出选择,从而作出最优决策。所以她的代价是子问题的个数和可选择的数目。它求出的解一定是最优解。



    一般求解过程


      使用贪心法求解能够依据下面几个方面进行(终于也相应着每步代码的实现),以找零钱为例:

      1、候选集合(C)

        通过一个候选集合C作为问题的可能解。(终于解均取自于候选集合C)

        比如。在找零钱问题中,各种面值的货币构成候选集合。

      2、解集合(S)

        每完毕一次贪心选择,将一个解放入S。终于获得一个完整解S

      3、解决函数(solution)

        检查解集合S是否构成问题的完整解。

        比如,在找零钱问题中。解决函数是已付出的货币金额恰好等于应付款。

      4、选择函数(select)

        即贪心策略。这是贪心法的关键,选择出最有希望构成问题的解的对象。

    (这个选择函数通常和目标函数有关)

              比如,在找零钱问题中,贪心策略就是在候选集合中选择面值最大的货币。

      5、可行函数(feasible)

        检查解集合中增加一个候选对象是否可行。(增加下一个对象后是不是满足约束条件)

        比如。在找零钱问题中,可行函数是每一步选择的货币和已付出的货币相加不超过应付款。

           


    C的实现:(一般试题就是在这个基础上加入详细的实现)

      
    Greedy(C)  //C是问题的输入集合即候选集合
    
    {
    
        S={ }; //初始解集合为空集
    
        while (not solution(S))  //集合S没有构成问题的一个解
    
        {
    
           x=select(C);    //在候选集合C中做贪心选择
    
           if feasible(S, x)  //推断集合S中增加x后的解是否可行
    
              S=S+{x};
    
              C=C-{x};
    
        }
    
        return S;
    
    }



    小结


      像找零问题,背包问题。近期临点都是非常经典的贪心算法。并且都是实际的问题。理解上不太难,对于算法题,在理解算法思想的基础上,多做题,查找规律,多总结一些C实现中重要的代码段。

  • 相关阅读:
    JS,Jquery获取各种屏幕的宽度和高度
    mysql存储html代码之导出后无法导入问题
    php之简单socket编程
    php单点登录SSO(Single Sign On)的解决思路
    php读取邮件
    YII框架的依赖注入容器
    YII框架的行为
    YII框架的事件机制
    YII框架的模块化技术
    mysql的索引
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7141358.html
Copyright © 2011-2022 走看看