[轉]: 五大基本算法——貪心法

一、基本思想

貪心算法採用每一步都選取當前狀態下最優的選擇,這樣雖然能得到局部最優解,但是可能無法求得全局最優解。

比如最簡單的揹包問題,將揹包的價值v與揹包的重量w相除,得到v/w爲單位重量下的物品價值,很明顯,這個值越高,這個物品越應該被裝入,也就是貪心法“貪”的衡量標準。
我們每次都把v/w最高的物品放入,這樣我們每一步放入都不會虧,這就是貪心算法。

爲什麼貪心法只能用於揹包問題而不能用於0/1揹包問題? 見後面的分析。

二、貪心法基本性質

1、最優子結構性質
所謂最優子結構性質,與動態規劃算法一樣,貪心法也需要先求解子問題的解,進而求解大問題的解,所以必須具有該性質。這也是問題需要用到動態規劃算法或貪心法時必須滿足的條件。

2、貪心選擇性質
這是貪心法獨有的性質,也是與動態規劃法的區別之一。即每一步都選取當前狀態下最優的選擇。
對於一個具體問題,要確定它是否具有貪心選擇性質,必須證明每一步所作的貪心選擇最終能夠導致問題的整體最優解。

三、貪心法與動態規劃法的區別

貪心算法性質:每一步選擇都採取當前狀態下最優的選擇,而不着眼於全局最優。

動態規劃法(最優子結構+重疊子問題)——>自底向上
每一步的最優解由上一步的局部最優解進行選擇得出,因此需要保存之前求解的所有子問題的最優解備查。

貪心算法(最優子結構+貪心選擇性質)——>自頂向下
每一步的最優解由上一步的最優解推導而得,當前最優解包含上一步的最優解,但之前的最優解不做保留。因此,在貪心算法中,做出的每一步決策都無法改變

相同點:兩者都具有最優子結構性質(每一步的選擇都將當前問題簡化爲一個規模更小的與原問題相同形式的子問題)

不同點:動態規劃算法每步往往依賴於相關子問題的解,因而只有在解出相關子問題的解後才能做出選擇。而貪心算法只着眼於當前狀態的最優解,即局部最優選擇,然後再去解出這個選擇後的狀態的相應的子問題。(自底向上與自頂向下)

區別兩者的經典例子:0/1揹包問題與揹包問題

四、典型例子

0/1揹包與揹包問題定義:

 

0/1揹包問題需採用動態規劃算法達到最優解。

揹包問題採用貪心算法可求解。

對於0/1揹包問題,不能用貪心算法求解,爲什麼?

因爲對該問題用貪心選擇策略求解無法保證最後揹包被裝滿,閒置的揹包空間會影響每公斤揹包的價值,進而影響整體求解的最大價值。

0/1揹包問題應比較:選擇與不選擇兩種方案的哪種更優,然後再進行下一步選擇,這樣會形成多個重疊子問題,須用動態規劃中的動態規劃表進行存儲。

 

 

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