贪心算法原理

Posted 算法小筑

tags:

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

"贪心算法原理"

今天我们来聊聊贪心算法的原理.


01

设计贪心算法


    贪心算法每次选择当时最佳的答案, 这种方式不保证可以找到最优解, 对于有些问题确实有效.  设计贪心算法的步骤:

    1、对其做出一次选择后, 只剩下一个子问题需要求解.

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

    3、选择后, 剩余的子问题满足: 其最优解与贪心选择组合即可得到原问题的最优解, 这样就得到了最优子结构.


02

贪心选择性质


    贪心选择性质是第一关键要素. 我们通过贪心选择做出局部最优来构造出全局最优解. 也就是我们直接做出当前问题中看来最优的选择, 不用考虑子问题的解.

    这就是贪心算法, 每次只选眼前最好的. 然后在求解后面的子问题. 贪心算法通常是自顶向下的, 每次选择会使问题变得更小. 贪心选择的时候我们不得不考虑众多的选择, 也就是可以改进贪心选择, 让它更高效.


03

贪心选择的最优子结构


    若问题的最优解包含其子问题的最优解, 则称此问题具有最优子结构性质. 应用贪心算法时, 通常使用更为直接的最优子结构. 将子问题的最优解与贪心选择组合在一起就能生成原问题的最优解. 这种方法使用了数学归纳法, 证明了在每个步骤进行贪心选择会生成原问题的最优解.


04

贪心对比动态规划


    贪心和动态规划都利用了最优子结构性质, 下面咱们用经典最优化问题来说明它们的区别.

    1、0-1背包问题: 有个小偷抢劫商店, 发现了n个商品, 第i个商品价值vi美元, 重量为wi磅. vi和wi都是整数. 小偷希望拿走价值尽量高的商品, 但他的背包最多能容纳W磅重的商品, W是一个整数. 他应该拿哪些商品呢? (要么拿, 要么不拿, 称为0-1问题)

    2、分数背包问题: 跟上面问题一样, 小偷可以拿走其一部分, 而不是只能做出拿整体或不拿整体的选择.

    上面两个问题都有最优子结构性质. 对于0-1背包问题, 考虑重量不超过W而价值最高的装包方案. 若将商品j从方案中删除, 则剩余商品的重量为不超过W-wj的价值最高方案(只能从不包括商品j的n-1个商品中选择拿走哪些).

    我们用贪心策略可以求解分数背包问题, 而解不了0-1背包问题.

    为了求解分数背包问题, 首先计算每个商品的每磅价值vi/wi. 遵循贪心策略, 小偷首先尽量多地拿走每磅价值最高的商品. 若该商品已全部拿走而背包尚未满, 他继续尽量多地拿走每磅价值第二高的商品, 以此类推, 直至达到上限W. 因此通过将商品按每磅价值排序可以让贪心算法的运行时间为O(nlogn).

    下面说明贪心策略对0-1背包问题无效, 看图:

贪心算法原理

上图包含3个商品和一个能放50磅重量的背包. 商品1重10磅, 价值60美金, 商品2重20磅, 价值100美金. 商品3重30磅, 价值120美元. 所以商品1的每磅价值为6美金, 高于商品2(5美金)和商品3(4美金)的每磅价值. 所以应用贪心策略或首先拿走商品1, 但是看图:

贪心算法原理

根据上图可知拿走商品2和商品3是最合适的. 这个用贪心是得不到最优解的.

分数背包问题, 使用贪心看图:

    所以对于分数背包问题, 可以获得最优解. 贪心原理就聊到这里.


如果喜欢本文请关注: