什么是贪心算法?

Posted Java仗剑走天涯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是贪心算法?相关的知识,希望对你有一定的参考价值。

一、贪心算法基本概念和特征规律

        “贪心”顾名思义,因此其规律特征就是更加注重当前的状态,贪心法做出的选择是对于当前所处状态的最优选择,它的解决问题的视角是微观的“局部”,而不是从全局宏观的角度思考和看待问题。也就是说,不从整体最优上加以考虑,仅是某种意义上的局部最优解 。

        根据这样的性质,要求贪心法解决的问题是“无后效性”——当前的决策不会影响到后续的决策。因为如果问题前后勾连紧密的话,会造成求解过程十分混乱。贪心算法常常用于组合优化问题,它的求解过程是多步判断的过程。

        贪心算法没有固定的算法框架,关键是贪心策略的选择,所以唯一的难点就是找到带求解问题的贪心策略,但毕竟熟能生巧嘛,算法的基本思想总是固定不变的。贪心选择的意思是对于所求问题的整体最优解可以通过一系列的局部最优选择求得。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。

        运用贪心算法求解问题时,会将问题分为若干个子问题,可以将其想象成俄罗斯套娃,利用贪心的原则从内向外依次求出当前子问题的最优解,也就是该算法不会直接从整体考虑问题,而是想要达到局部最优。只有内部的子问题求得最优解,才能继续解决包含该子问题的下一个子问题,所以前一个子问题的最优解会是下一个子问题最优解的一部分,重复这个操作直到堆叠出该问题的最优解。

二、贪心算法的基本思路

贪心算法求解步骤

  1. 建立数学模型来描述问题
  2. 将问题分解为若干个子问题
  3. 找出适合的贪心策略
  4. 求解每一个子问题的最优解
  5. 将局部最优解堆叠成全局最优解

三、贪心算法适用的问题

贪心策略适用的前提:局部最优策略能导致产生全局最优解。

实际上,贪心算法适用的情况很少。一般,对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可做出判断。

四、贪心算法的实现框架

从问题的某一初始解出发,由所有解元素组合成问题的一个可行解。

while (能朝给定总目标前进一步) {  利用可行的决策,求出可行解的一个解元素; }

用贪心算法求解问题应该考虑如下几个方面:

(1)候选集合C:为了构造问题的解决方案,有一个候选集合C作为问题的可能解,即问题的最终解均取自于候选集合C。

(2)解集合S:随着贪心选择的进行,解集合S不断扩展,直到构成一个满足问题的完整解。

(3)解决函数solution:检查解集合S是否构成问题的完整解。

(4)选择函数select:即贪心策略,这是贪心算法的关键,它指出哪个候选对象最有希望构成问题的解,选择函数通常和目标函数有关。

(5)可行函数feasible:检查解集合中加入一个候选对象是否可行,即解集合扩展后是否满足约束条件。

贪心算法的一般流程

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; 
}

五、贪心策略的选择

因为用贪心算法只能通过解局部最优解的策略来达到全局最优解,因此,一定要注意判断问题是否适合采用贪心算法策略,找到的解是否一定是问题的最优解。

参考:

贪心算法及几个经典例子

这几道经典例题帮你轻松搞透贪心算法

以上是关于什么是贪心算法?的主要内容,如果未能解决你的问题,请参考以下文章

贪心算法----区间覆盖问题(POJ2376)

Contig|scaffold|N50|L50|NG50|贪心算法|de bruiji graph|

算法-贪心算法思想

有人可以解释啥是 SVN 平分算法吗?理论上和通过代码片段[重复]

什么是贪心算法(又称贪婪算法)?

贪心算法,一个的吃货理解