五大基本算法——贪心法

一、基本思想

贪心算法采用每一步都选取当前状态下最优的选择,这样虽然能得到局部最优解,但是可能无法求得全局最优解。

比如最简单的背包问题,将背包的价值v与背包的重量w相除,得到v/w为单位重量下的物品价值,很明显,这个值越高,这个物品越应该被装入,也就是贪心法“贪”的衡量标准。
我们每次都把v/w最高的物品放入,这样我们每一步放入都不会亏,这就是贪心算法。

为什么贪心法只能用于背包问题而不能用于0/1背包问题? 见后面的分析。

二、贪心法基本性质

1、最优子结构性质
所谓最优子结构性质,与动态规划算法一样,贪心法也需要先求解子问题的解,进而求解大问题的解,所以必须具有该性质。这也是问题需要用到动态规划算法或贪心法时必须满足的条件。

2、贪心选择性质
这是贪心法独有的性质,也是与动态规划法的区别之一。即每一步都选取当前状态下最优的选择。
对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终能够导致问题的整体最优解。

三、贪心法与动态规划法的区别

贪心算法性质:每一步选择都采取当前状态下最优的选择,而不着眼于全局最优。

动态规划法(最优子结构+重叠子问题)——>自底向上
每一步的最优解由上一步的局部最优解进行选择得出,因此需要保存之前求解的所有子问题的最优解备查。

贪心算法(最优子结构+贪心选择性质)——>自顶向下
每一步的最优解由上一步的最优解推导而得,当前最优解包含上一步的最优解,但之前的最优解不做保留。因此,在贪心算法中,做出的每一步决策都无法改变

相同点:两者都具有最优子结构性质(每一步的选择都将当前问题简化为一个规模更小的与原问题相同形式的子问题)

不同点:动态规划算法每步往往依赖于相关子问题的解,因而只有在解出相关子问题的解后才能做出选择。而贪心算法只着眼于当前状态的最优解,即局部最优选择,然后再去解出这个选择后的状态的相应的子问题。(自底向上与自顶向下)

区别两者的经典例子:0/1背包问题与背包问题

四、典型例子

0/1背包与背包问题定义:

五大基本算法——贪心法_第1张图片
0/1背包问题与背包问题

0/1背包问题需采用动态规划算法达到最优解。

背包问题采用贪心算法可求解。

对于0/1背包问题,不能用贪心算法求解,为什么?

因为对该问题用贪心选择策略求解无法保证最后背包被装满,闲置的背包空间会影响每公斤背包的价值,进而影响整体求解的最大价值。

0/1背包问题应比较:选择与不选择两种方案的哪种更优,然后再进行下一步选择,这样会形成多个重叠子问题,须用动态规划中的动态规划表进行存储。

你可能感兴趣的:(五大基本算法——贪心法)