python搜尋演算法實現 (二)貪婪演算法

2021-08-24 23:21:47 字數 2042 閱讀 8029

假設你辦了個廣播節目,要讓全美國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 搜尋演算法,還得從啟發式搜尋演算法開始談起。所謂啟發式搜尋,就在於當前搜尋結點往下選擇下一步結點時,可以通過乙個啟發函式 來進行選擇,選擇代價最少的結點作為下一步搜尋結點而跳轉其上 遇到有乙個以上代價最 少的結點,不妨選距離當前搜尋點最近一次展開的搜尋點進行下一步搜尋 ...