贪心算法

概述

思想

  • 贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。
  • 贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。

特点

  • 贪心算法不能对所有问题都得到整体最优解。但对许多问题他能产生整体最优解,或者最优解的近似。
  • 贪心算法中较大子问题的解敲好包含了较小子问题的解作为子集。与动态规划算法中的优化原则本质上一致。
  • 动态规划算法在某一步决定优化函数的最大或最小值时,需要考虑他的所有子问题的优化函数的值。然后从中选出最有的结果。贪心算法的每步判断时,不考虑子问题的计算结果,而是根据当前的情况采取“只顾眼前”的贪心策略决定取舍。

贪心算法的适用条件

  • 最优子结构性质
    • 一个问题的最优解包含其子问题的最优解。问题具有最优子结构性质时,可以用动态规划算法或者贪心算法求解。
  • 贪心选择性质
    • 所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。
    • 动态规划算法通常是自底向上的方式来求解各个子问题。贪心算法同行一自顶向下的方式,一迭代的方式作出相机的谈心选择。每左慈谈心选择就将所求问题简化为规模更小的子问题。
    • 对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所做的贪心选择最终导致问题的整体最优解。

贪心算法正确性

  • 贪心算法不一定得到最优解。贪心策略的选择可能有多重,选择合适的贪心策略并进行正确性证明。

方法

  • 算法步数的归纳
  • 问题规模的归纳

贪心的核心思想-特点

  • 可行的:即它必须满足问题的约束。
  • 局部最优:它是当前步骤中所有可行性选择中最佳的局部选择。
  • 不可取消:即选择一旦做出,在算法的后面步骤中就无法改变了。

2 反向贪心思想

  1. 正向贪心思想,每次都能选择最优的结果,最终能够选择所有最优子问题构成的最优解。
  2. 反向贪心思想,虽然无法确定当前的最优结果。但是每次都能排除掉最差的结果。通过一系列排除最差结果的方法,得到最后的最优解。

实例

以上三个问题,每次的谈心选择,不是选择当前步骤的最优解,而是排除不可能的最差情况。

3 常见问题

分数背包问题

最短路径问题

Dijkstra’s Algorithm

Prim’s

Kruskal’s

Huffman 算法与决策树