[Algorithm] NPC问题 --- 集合覆盖问题

声明☕️

此内容是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)

请添加图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Chae_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值