貪婪算法的思想:每步都選擇局部最優解,最終得到的就是全局最優解。
近似算法:在獲得精確解需要的時間太長是,可使用近似算法。
判斷近似算法的標准:
速度又多快;
得到的近似解與最優解的接近程度;
貪婪算法是不錯的選擇,不僅簡單,而且通常運行速度很快。
集合運算:
並集運算:setA | setB
交集運算:setA & setB
差集運算:setA - setB
集合不包含重復的元素;
用最少的廣播台覆蓋最多的區域,不同廣播台覆蓋的區域可能重疊的問題:
def greedy(states_needed):
# 存儲最終選擇的廣播台
final_stations = set()
while states_needed:
# 存儲覆蓋了最多的未覆蓋州的廣播台
best_station = None
# 包含該廣播電台覆蓋的所有未覆蓋的州,for循環迭代每個廣播台,並確定它是否是最佳的廣播台
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)
return final_stations
if __name__ == '__main__':
states_needed = set(["mt", "wa", "or", "id", "nv", "ut", "ca", "az"])
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"])
print(greedy(states_needed))
