集合覆盖问题与贪婪算法

贪婪算法的思想:每步都选择局部最优解,最终得到的就是全局最优解。

近似算法:在获得精确解需要的时间太长是,可使用近似算法。

判断近似算法的标准:

速度又多快;

得到的近似解与最优解的接近程度;

贪婪算法是不错的选择,不仅简单,而且通常运行速度很快。

集合运算:

并集运算: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))
原文地址:https://www.cnblogs.com/songyuejie/p/11422543.html