Python之貪婪演算法

2021-09-18 02:34:28 字數 1900 閱讀 6538

np完全問題:

找不到快速演算法的問題。

識別np完全問題,以免浪費時間去尋找解決它們的快速演算法:

沒辦法判斷問題是不是np完全問題,但還是有一些蛛絲馬跡可循的。

1、元素較少時演算法的執行速度非常快,但隨著元素數量的增加,速度會變得非常慢。

2、涉及「所有組合」的問題通常是np完全問題。

3、不能將問題分成小問題,必須考慮各種可能的情況。這可能是np完全問題。

4、如果問題涉及序列(如旅行商問題中的城市序列)且難以解決,它可能就是np完全問題。

5、如果問題涉及集合(如廣播台集合)且難以解決,它可能就是np完全問題。

6、如果問題可轉換為集合覆蓋問題或旅行商問題,那它肯定是np完全問題。

判斷近似演算法優劣的標準如下:

1、速度有多快;2、得到的近似解與最優解的接近程度。

貪婪演算法:

又稱貪心演算法,是一種在每一步選擇中都採取在當前狀態下最好或最優(即最有利)的選擇,從而希望導致結果是最好或最優的演算法。貪婪策略不能獲得最優解,但非常接近。

示例:廣播台覆蓋問題

# 建立待覆蓋州的列表,並轉換為集合

states_needed = set(["mt", "wa", "or", "id", "nv", "ut", "ca", "az"])

# 可供選擇的廣播台,使用雜湊表來表示,其中鍵為廣播台名稱,值為廣播台覆蓋的州。

stations = {}

stations["kone"] = set(["id", "nv", "ut"])

stations["ktwo"] = set(["wa", "id", "mt", "nn"])

stations["kthree"] = set(["or", "nv", "ca"])

stations["kfour"] = set(["nv", "ut"])

stations["kfive"] = set(["ca", "az"])

# 使用集合儲存最終選擇的廣播台。

final_stations = set()

while states_needed: #如果待覆蓋的州列表不為空,則繼續迴圈

best_station = none #初始化選擇的廣播台

states_covered = set() #初始化覆蓋的州

for station,states_for_station in stations.items(): #遍歷所有廣播台

covered = states_needed & states_for_station #獲取待覆蓋的州與該廣播台覆蓋州的交集

#選出覆蓋最廣的廣播台

if len(covered) > len(states_covered): #限制每次while迴圈選擇乙個覆蓋最廣的廣播台

best_station = station #將該廣播台標記為被選擇

states_covered = covered #將上面的交集州標記為被覆蓋的州

states_needed -= states_covered #從待覆蓋的州中去除已標記為被覆蓋的州

final_stations.add(best_station) #將選擇的廣播台新增到最終集合,並迴圈

del stations[best_station] #刪除已選擇廣播台,避免重複迴圈

print(final_stations) #列印最終選擇廣播台

結果為:

演算法之貪婪演算法

雖然設計乙個好的求解演算法更像是一門藝術,而不像是技術,但仍然存在一些行之有效的能夠用於解決許多問題的演算法設計方法,你可以使用這些方法來設計演算法,並觀察這些演算法是如何工作的。一般情況下,為了獲得較好的效能,必須對演算法進行細緻的調整。但是在某些情況下,演算法經過調整之後效能仍無法達到要求,這時...

python 貪婪演算法

貪婪演算法 覆蓋問題,有個節目想要將自己的節目通過電台發布到幾個州,這些電台可能互相有所覆蓋,即覆蓋了相同的州,現在如何能找到幾個電台,最優的覆蓋這些州。想要電台覆蓋的州 states needed set mt wa or id nv ut ca az 每個電台覆蓋的範圍 stations sta...

演算法導論(六)之貪婪演算法

動態規劃是先分析子問題,再做選擇。而貪心演算法則是先做貪心選擇,做完選擇後,生成了子問題,然後再去求解子問題 活動集合s si為 開始時間 fi為 結束時間 s i為開始時間,f i 為結束時間 si 為開始 時間,f i 為結 束時間 i123 4567 891011 s is i si 130 ...