[转]: 五大基本算法——贪心法

一、基本思想

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

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

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

二、贪心法基本性质

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

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

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

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

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

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

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

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

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

四、典型例子

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

 

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

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

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

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

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章