贪心算法详解


一:贪心选择原理

1:基本概念

所谓贪心算法是指,在对问题求解时,总是做出在 当前看来是最好的选择 也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的 局部最优解
贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性——无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。
所以对所采用的贪心策略一定要仔细分析其是否满足无后效性。

贪心算法的两个重要因素:贪心选择和最优子结构。

(1)贪心选择性质

贪心选择性质是指:可以通过做出局部最优(贪心)选择来构造全局最优解。

对于一个具体问题,要确定它是否具有贪心选择性质,我们必须证明每一步所作的贪心选择最终导致问题的一个整体最优解。通常可以用我们在证明活动安排问题的贪心选择性质时所采用的方法来证明。首先考察问题的一个整体最优解,并证明可修改这个最优解,使其以贪心选择开始。而且作了贪心选择后,原问题简化为一个规模更小的类似子问题。然后,用数学归纳法证明,通过每一步作贪心选择,最终可得到问题的一个整体最优解。其中,证明贪心选择后的问题简化为规模更小的类似子问题的关键在于利用该问题的最优子结构性质。

(2)最优子结构

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


2、贪心算法的基本思路:
    1)建立数学模型来描述问题。
    2)将最优化问题转化为这样的形式:做出一次选择后,只剩下一个子问题需要求解!不像动态规划,可以有多个子问题

    3)证明做出贪心选择后,原问题总是存在最优解,即贪心选择是安全的。

    4)证明做出贪心选择后,剩余子问题满足性质:其最优解与贪心选择组合即可得到原问题的最优解。




3:贪心法存在的问题: 
     1)不能保证求得的最后解是最佳的; 
     2)不能用来求最大或最小解问题; 
     3)只能求满足某些约束条件的可行解的范围

上述的这些问题可以在动态规划 , 回溯算法 ,分支限界算法 里面得到相应的解决,但是我们也不会因此放弃对贪心算法的使用。这正是敏捷开发所提倡的,永远没有最好的,只有最适合的.我们选用贪心算法的原因就是因为他能够满足当前的需要并且比其他算法更加简单。 
 
4:贪心算法的实现框架
    从问题的某一初始解出发;
    while (能朝给定总目标前进一步)
    {  
          利用可行的决策,求出可行解的一个解元素;
    }
    由所有解元素组合成问题的一个可行解;
   
5:贪心选择与动态规划的区别

1)贪心选择性质是二者最主要的区别。

        2)在动态规划算法中,每步所作的选择往往依赖于相关子问题的解。因而只有在解出相关子问题后,才能作出选择。而在贪心算法中,仅在当前状态下作出最好选择,即局部最优选择。然后再去解作出这个选择后产生的相应的子问题。贪心算法所作的贪心选择可以依赖于以往所作过的选择,但决不依赖于将来所作的选择,也不依赖于子问题的解。

        3)正是由于2)中所讲的差别,动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为一个规模更小的子问题。
     



参考:贪心算法

你可能感兴趣的:(数据结构,贪心算法,算法,数据结构,算法)