假設你辦了個廣播節目,要讓全美國50個州的聽眾都能聽得到,為此, 你需要決定在哪些廣播台播出。每個廣播台臺播出都需要費用,所以你需要盡可能地在更少的廣播台播出節目。現有廣播台名單如下:
每個廣播台都覆蓋不同的範圍,但是有些是重複的
如何才能找出覆蓋全美50個州的最小廣播台集和呢?先提供一種方法:
(1)列出每種可能的廣播台集和,稱之為冪集,總共有2^n種集和
(2)找出這2^n種集和中覆蓋全美50個州的最小集合。
以上演算法的問題是計算所有集和的時間需要很多,假如有100個廣播台,那麼集和一共2^100次方,這可是乙個非常大的數!
那麼,有沒有一種演算法可以快速的解決這種類似的問題呢?有,就是貪婪演算法。
貪婪演算法是近似演算法的一種,它的解決方法如下:
(1)選出乙個廣播台,這個廣播台覆蓋了最多的未覆蓋州,即便這個廣播台覆蓋了一些已經覆蓋的州也沒有關係。
(2)重複第一步,直到覆蓋了所有的州
只要簡單的兩步!而且貪婪演算法的時間複雜度為o(n^2),其中n為廣播台數量,在n比較大的時候遠比第一種方法速度快。
但是貪婪演算法並不一定能得到最優解,它獲取的只是近似的最優解。很多時候,對於難以計算的問題,才會使用貪婪演算法,快速的得到近似解。衡量貪婪演算法有兩點:
(1)速度有多快
(2)得到的近似解與最優解的接近程度
**實現:
""
"假設你辦了個廣播節目,要讓全美50個州的聽眾都收聽得到,為此,
你需要決定在哪些廣播台播出,出於預算,你要力圖在盡可能少的
廣播台播出,現在廣播台名單和其覆蓋位置如下:,,
"""# 要覆蓋的州
states_needed = set(['mt', 'wa', 'or', 'id', 'nv', 'ut', 'ca', 'az'])
# 廣播台清單
stations = dict()
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_for_station in stations.items():
# 計算需要覆蓋的州和每個廣播台覆蓋的州的交集
covered = states_needed & states_for_station
# 如果交集的州數量比已經覆蓋的州的數量多
if len(covered) > len(states_covered):
best_station = station # 最佳廣播台更新為這個廣播台
states_covered = covered # 已覆蓋的州更新為交集
states_needed -= states_covered # 更新為覆蓋的州
final_stations.add(best_station) # 更新最終結果
print(final_stations)
二分搜尋演算法,Java實現
這裡用遞迴和非遞迴的方式實現了二分搜尋 ps 二分搜尋是對已經排序完成的陣列進行搜尋定位,我這裡是以公升序排列為例,可用歸併排序等演算法進行排序 可見我其他博文 二分搜尋演算法,通過比較順序列表中間元素的值,迅速縮小規模查詢元素,時間複雜度為 o n logn public class binary...
python版二分搜尋演算法
先用圖展示一下二分搜尋演算法的原理 二分搜尋演算法又稱為折半搜尋,下面 實現的是輸出要搜尋資料在陣列中的位置和查詢的次數 演算法的步驟 給乙個帶有n個值的陣列,陣列a是從小到大的排列 需要查詢t值在陣列的中的位置 1 先令l為0,r為n 1 2 如果存在l r,則不需進行搜尋 3 令m 中間元素 為...
A 搜尋演算法
啟發式搜尋演算法 要理解 a 搜尋演算法,還得從啟發式搜尋演算法開始談起。所謂啟發式搜尋,就在於當前搜尋結點往下選擇下一步結點時,可以通過乙個啟發函式 來進行選擇,選擇代價最少的結點作為下一步搜尋結點而跳轉其上 遇到有乙個以上代價最 少的結點,不妨選距離當前搜尋點最近一次展開的搜尋點進行下一步搜尋 ...