集合覆盖问题 贪婪算法反思总结 Python

问题描述:

假设你办了个广播节目,要让全美50个洲的听众都能听到,为此,你需要决定在哪些广播台播出,在每个广播台播出都需要支付费用,力图以最少的费用达到覆盖的目的——来自算法图解

 贪婪思路:1:找出所有广播台中覆盖面积最广的(面积指的是未覆盖的面积) 换言之就是寻找覆盖未覆盖面积最广的广播站

2:记录本轮的覆盖区域 更新未覆盖区域(取交集 用到集合set)

3:重复 1 2 直至完全覆盖

 初始信息:state_needed(需要覆盖的州),stations 字典(每个广播台覆盖的州)fianl_stations(保存最终选择的广播台)

state_needed=set(['mt','wa','or','id','nv','ut','ca','az'])
stations={}
stations['1']=set(['id','nv','ut'])
stations['2']=set(['wa','id','mt'])
stations['3']=set(['or','nv','ca'])
stations['4']=set(['nv','ut'])
stations['5']=set(['ca','az'])
final_stations=set()
def find_covermost():
    ans,res=0,''
    for k,v in stations.items():
        if ans<len(v&state_needed) and k not in final_stations:ans,res=len(v),k#v&state_needed很关键,覆盖面积广指的是覆盖还没覆盖的面积最广
    final_stations.update([res])
    return stations[res]
while state_needed:
    state_needed-=find_covermost()
print(final_stations)
print(state_needed)
##输出{'5', '3', '1', '2'}
#set()

总结:贪婪算法是一种近似算法,通过寻找局部最优解获得全局最优解 

前面学到的BFS与狄克斯特拉算法就包含的贪婪的思想

另外今天学到了集合中的两个操作 并集>>&    添加元素>>set.update([seq])

我是小郑 期待和你一起进步

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Py小郑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值