貪心演算法又叫貪婪演算法,是一種在每一步選擇中都採取在當前狀態下最好或最優(法,即最有利)的選擇,從而希望導致結果是最好或最優的演算法
1.建立數學模型來描述問題。
2.把求解的問題分成若干個子問題。
3.對每一子問題求解,得到子問題的區域性最優解。
4.把子問題的解區域性最優解合成原來解問題的乙個解。
實際上貪心演算法適用的問題很少。一般,對乙個問題分析是否適用於貪心演算法,可以先選擇該問題下的幾個實際資料進行分析,就可做出判斷。
貪心演算法可以解決一些最優化問題比如求最小生成樹、哈夫曼編碼等,一旦某個問題可以用貪心演算法,那麼貪心演算法將是解決這個問題的最好辦法。
貪心演算法也可以用作輔助演算法或者直接解決一些要求結果不特別精確的問題,減少時間複雜度
貪心演算法其實適用情況較少,比如揹包問題:
但是貪心演算法有時可以用做快速的近似解法:
為了簡化問題,舉個例子包含幾個省的例子,如下不同顏色的圈表示不同基站能夠覆蓋的範圍,現在我們需要使用最少的圈將所有省份覆蓋住。
# 建立乙個列表,其中包含要覆蓋的省
states_needed =
set(
["shanghai"
,"fujian"
,"zhejiang"
,"anhui"
,"shandong"
,"jiangxi"
,"henan"
,"jiangsu"
])
stations =
stations[
"1"]
=set([
"anhui"
,"shandong"
,"jiangsu"
,"henan"])
stations[
"2"]
=set([
"fujian"
,"zhejiang"
,"shanghai"])
stations[
"3"]
=set([
"zhejiang"
,"anhui"
,"fujian"])
stations[
"4"]
=set([
"anhui"
,"jiangxi"])
stations[
"5"]
=set([
"henan"
,"jiangsu"])
# stations["6"] = set(["jiangxi"])
final_stations =
# 使用乙個集合來儲存最終選擇的基站
while states_needed:
best_station =
none
# 將覆蓋了最多的未覆蓋省的基站儲存進去
states_covered =
set(
)# 乙個集合,包含該基站覆蓋的所有未覆蓋的省
for station, states in stations.items():
# 迴圈迭代每個基站並確定它是否是最佳的基站
covered = states_needed & states # 計算交集
iflen
(covered)
>
len(states_covered)
:# 檢查該基站的省是否比best_station多
best_station = station # 如果多,就將best_station設定為當前基站
states_covered = covered
states_needed -= states_covered # 更新states_needed
# 在for迴圈結束後將best_station新增到最終的基站列表中
print
(final_stations)
# 列印final_stations
貪心演算法得到的結果是[1,2,4]
,實際上這就是最優解之一,但是如果加乙個圈:
此時理論上最優解是[1,2,6]
,但實際上貪心演算法還是會優先考慮覆蓋範圍大的2或者4,最終結果依然是[1,2,4]
經典貪心演算法 貪心演算法概述
貪心演算法具有最優子問題結構,它的特點是 短視 每次選擇對當前局面最有利的決策,來一步步獲得最優解。我個人認為,貪心不是乙個具體的方法,而是一類方法,貪心演算法的關鍵不在於想到,而在於正確性的證明。要證明乙個貪心演算法是正確的,需要證明我們可以把乙個最優解逐步轉化為我們用貪心演算法所得到的解,而解不...
演算法 貪心演算法
把乙個複雜問題分解為一系列較為簡單的區域性最優選擇,每乙個選擇都是對當前解的乙個擴充套件,知道獲得問題的完整解。在解決問題的策略上目光短淺,只根據當前已有的資訊做出選擇,而且一旦做出了選擇,不管將來有什麼結果這個選擇都不會改變。換言之,貪心法並不是從整體最優考慮,它所做出的選擇只是在某種意義上的區域...
演算法 貪心演算法
集合覆蓋問題 旅行商問題等都屬於np完全問題,在數學領域上並沒有快速得到最優解的方案,非常適合用貪婪演算法。判斷方法 1.元素較少時,一般執行速度很快,但隨著元素數量增多,速度會變得非常慢 2.涉及到需要計算比較 所有的組合 情況的通常是np完全問題 3.無法分割成小問題,必須考慮各種可能的情況。這...