我們生活往往會遇到很多類似於:書包裡東西要怎樣放才能裝下盡可能多的東西。具體來說:比如我有乙個可以裝35磅的袋子,有一台重15磅價值1500美元的結他;一台重20磅價值1000美元的電腦;台重30磅價值3000美元的音響。應該怎麼怎麼裝裝下價值最大的東西?
貪婪策略的思想是:(1)先裝價值最大的物品
(2)剩下得空間再裝價值最大的物品。
那麼根據貪婪演算法思想,我裝3000美元音響,繼而也得到了問題最優解
但是,如果電腦的價值變為了2500美元呢?
顯然其沒有得到最優解。
優點:簡單易行,每步採取最優解(對於單維度問題其是奏效的)
缺點:得到的解不一定是最優解,只能得到乙個相對滿意的解
以集合覆蓋問題為例:
假設你辦了個廣播節目,要讓全美50個州的聽眾都能收聽的到。為此,你需要決定在哪些廣播台播出。在每個廣播台播出都需要支付費用,因此你力圖在盡可能少的廣播台播出。現有廣播台名單
廣播台覆蓋的州
每個廣播台都覆蓋特定的區域,不同廣播台的覆蓋區域可能重疊。
通過貪婪演算法可以得到非常接近的解:
(1)選出這樣乙個廣播台,即它覆蓋了最多的未覆蓋的州。即便這個廣播台覆蓋了一些已覆蓋的州,也沒有關係。
(2)重複第一步,直到覆蓋了所有的州。
廣播站清單,雜湊表
states_needed=set(["id","wa","mt","nv","ut","ca","az","or"])
stations={}#定義一組字典
stations["kone"]=set(["id","nv","ut"])
stations["ktwo"]=set(["wa","id","mt"])
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 in stations.items():
covered = states_needed & states#取交集
if len(covered) > len(states_covered):
best_station = station
states_covered = covered
states_needed -= states_covered
final_stations.add(best_station)
print(final_stations)
演算法 集合覆蓋問題
假設你辦了個廣播節目,要讓全美50個州的聽眾都收聽得到,為此,你需要決定在哪些廣播台播出。這是乙個貪婪演算法問題,隨著廣播台的數量增加,計算時間將會 所以用近似演算法來解。states needed set mt wa or id nv ut ca az stations stations kone...
演算法 用js實現貪婪演算法(覆蓋問題)
適合了解該演算法的人理解 貪婪演算法 覆蓋問題 var obj 存放出現過的字母 var arr letter 存放未擁有arr letter元素最多的obj key值 var arr obj 找到未擁有arr letter元素最多的obj key值 function findmaxobj if m...
貪心演算法解決集合覆蓋問題
貪心演算法的核心就是 在每一步選擇中都採取最好或者最優 即最有利 的選擇,從而希望能夠導致結果是最好或者最優的演算法。假設存在下面需要付費的廣播台,以及廣播台訊號可以覆蓋的地區。如何選擇最少的廣播台,讓所有的地區 都可以接收到訊號。思路 1 遍歷所有的廣播電台,找到乙個覆蓋了最多未覆蓋的地區的電台 ...