6 贪心算法
贪心算法
概述
思想
- 贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。
- 贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。
特点
- 贪心算法不能对所有问题都得到整体最优解。但对许多问题他能产生整体最优解,或者最优解的近似。
- 贪心算法中较大子问题的解敲好包含了较小子问题的解作为子集。与动态规划算法中的优化原则本质上一致。
- 动态规划算法在某一步决定优化函数的最大或最小值时,需要考虑他的所有子问题的优化函数的值。然后从中选出最有的结果。贪心算法的每步判断时,不考虑子问题的计算结果,而是根据当前的情况采取“只顾眼前”的贪心策略决定取舍。
贪心算法的适用条件
- 最优子结构性质
- 一个问题的最优解包含其子问题的最优解。问题具有最优子结构性质时,可以用动态规划算法或者贪心算法求解。
- 贪心选择性质
- 所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。
- 动态规划算法通常是自底向上的方式来求解各个子问题。贪心算法同行一自顶向下的方式,一迭代的方式作出相机的谈心选择。每左慈谈心选择就将所求问题简化为规模更小的子问题。
- 对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所做的贪心选择最终导致问题的整体最优解。
贪心算法正确性
- 贪心算法不一定得到最优解。贪心策略的选择可能有多重,选择合适的贪心策略并进行正确性证明。
方法
- 算法步数的归纳
- 问题规模的归纳
贪心的核心思想-特点
- 可行的:即它必须满足问题的约束。
- 局部最优:它是当前步骤中所有可行性选择中最佳的局部选择。
- 不可取消:即选择一旦做出,在算法的后面步骤中就无法改变了。
2 反向贪心思想
- 正向贪心思想,每次都能选择最优的结果,最终能够选择所有最优子问题构成的最优解。
- 反向贪心思想,虽然无法确定当前的最优结果。但是每次都能排除掉最差的结果。通过一系列排除最差结果的方法,得到最后的最优解。
实例
以上三个问题,每次的谈心选择,不是选择当前步骤的最优解,而是排除不可能的最差情况。
3 常见问题
分数背包问题
最短路径问题
Dijkstra’s Algorithm
Prim’s
Kruskal’s
Huffman 算法与决策树
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Estom的博客!










