来自《算法图解》
# greedy algorithm
# 贪婪算法
# 使用依据:快速度,与最优解的接近度
"""
集合覆盖
某广播节目要让全国都能收听,为此需决定在那些广播台播出
每个广播台都覆盖特定区域,且覆盖区域可能重叠
目的:尽可能少的广播台播出
思路:重复选择覆盖最多未覆盖区域的电台,直到完全覆盖
"""
states_needed = set(["mt", "wa", "or", "id", "nv", "ut"]) # 传入一个数组,被转换为集合
# 使用集合原因:集合类似列表,只是同样元素只能出现一次
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_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(best_station)
print(final_stations)
广度优先搜索 和 狄科斯特拉算法 也是贪婪算法。