声明☕️
此内容是Grokking-algorithms这本书的学习笔记。
问题背景 🎆
找出能够覆盖全国各个地方的机构的最小集合。
问题分析 🤔
很容易获得此类问题的时间复杂度是O(2^n),也就是说随着机构n的数量的增加,需要的时间猛增。所以需要使用近似算法。
近似算法 - 贪婪算法 🧮
每次选择价值最高的方式,使每一步获得局部最优解,最后得到的就是全局最优解。
此问题中,使用贪婪算法的时间复杂度是O(n^2)。
在这一个具体问题中,选出一个机构,此机构覆盖了最多的未覆盖的地方。且即使覆盖了一些已经覆盖的地方也无所谓。
if __name__ == "__main__":
states_needed = {"mt", "wa", "or", "id", "nv", "ut", "ca", "az"} #要覆盖的洲
stations = {"kone": {"id", "nv", "ut"}, "ktwo": {"wa", "id", "mt"}, "kthree": {"or", "nv", "ca"},
"kfour": {"nv", "ut"}, "kfive": {"ca", "az"}} # 可供选择的广播清单
final_stations = set() # 最终选择的广播台
while states_needed:
best_station = None # 覆盖了最多的未覆盖洲的广播台
states_covered = set() # 前一个时间步覆盖的states集合; 该广播台覆盖的所有尚未覆盖的洲
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)