1. 程式人生 > >貪心算法

貪心算法

快速 搜索 心算 求解 get 現在 選擇性 tails 方法

貪心算法是指在對問題求解時,總是作出當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,所得的僅是在某種意義上的局部最優解。

貪心算法不是對所有問題都能得到整體最優解,但對範圍相當廣泛的許多問題他能產生整體最優解或者是整體最優解的近似解。

4種硬幣,面值為二角五分、一角、五分、一分。現在有人用1塊錢買了4角錢的東西,當售貨員找零錢時,希望她找給小孩的硬幣數目最少。

通常先找出不超過六角的最大面值即二角五分;然後用六角減去二角五分為三角五分,再找出二角五分,剩下一角;最後再找出一角即可。這種按遞減的順序考慮各種幣種的方法稱為貪心法(Greey Method),或稱為啟發式搜索法。

對上述問題可以描述為有n個輸入,而它的解由這n個輸入的某個子集組成,只有當某個子集滿足某些事先給定的條件(約束條件)時才稱為子集為該問題的一個可行解。顯然,滿足約束條件的子集可能有多個。因此,一般來講,可行解也存在多個。為了衡量不同可行解的優劣,事先需要給出一定的判斷標準。這些標準一般以目標函數的形式出現,只有保證目標函數能獲取到極值的可行解才稱為最優解。

實踐表明,貪心法一般可以快速得到滿意的解,因為省去了為尋找最優解需要窮盡所有可能的操作。另外,貪心法對許多問題也能產生整體最優解。如對單源最短路徑,最小生成樹等問題的求解。在有些情況下,即使貪心法得不到整體最優解,但其最終結果也可能是最優解的近似解。

貪心法的基本思路

從問題的某一個初始解觸發逐步逼近給定的目標,以盡可能快的方法求得更好的解。即當達到算法中的某一步不能再繼續前進時,算法停止,得到一個解,該算法有如下特點:

(1)不能保證求得的最終解是最佳的;

(2)不能用來求最大或最小等有極值要求問題的解;

(3)只能求得滿足某些約束條件的可行解;

貪心選擇性質:

一個問題的整體最優解可通過一系列局部的最優解的選擇達到,並且每次的選擇可以依賴以前作出的選擇,但不依賴於後面要作出的選擇。

對於一個具體問題,要確定它是否具有貪心選擇性質,必須證明每一步所作的貪心選擇最終導致問題的整體最優解。

最優子結構選擇:

當一個問題的最優解包含其子問題的最優解時,稱此問題具有最優子結構。問題的最優子結構性質是該問題可用貪心法求解的關鍵所在。

利用貪心法求解問題的過程通常包含如下3個步驟。

1)分解。將原問題分解為若幹相互獨立的階段。

2)解決。對於每個階段求局部的最優解,即貪心選擇。在每個階段,選擇一旦作出就不可更改,作出貪心選擇的依據稱為貪心準則。貪心準則的制定是用貪心法解決最優化問題的關鍵,它關系到問題能否得到成功解決及解決質量的高低。

3)合並。將各個階段的解合並為原問題的一個可行解。

貪心算法優點是求解速度快,時間復雜性低、缺點是需要證明要求解的問題的解是最優解。

背包問題

開心的金明:http://blog.csdn.net/wangdd_199326/article/details/57127173

ALGO-30 算法訓練 入學考試http://blog.csdn.net/wangdd_199326/article/details/56293834

ALGO-21 算法訓練 裝箱問題 http://blog.csdn.net/wangdd_199326/article/details/56293227

貪心算法