实例:
假设你办了个广播节目,要让全美50个州的听众都听到。为次,你需要决定哪些广播台播出。在每个广播台播出都需要支付费用,因此你要尽可能少的在广播台播出。。

其中每个广播台覆盖特定的区域,不同广播台的覆盖区域可能重叠

这样的话要遍历所有的可能的子集合组合,就有2n2^n,其中n为广播台数目,用大O表示法运行时间为O(2n)O(2^n)。如果广播台很多,就成了一个NP难问题,而贪婪算法可以得到非常接近的解:

  1. 选出这样一个广播台,即它覆盖了最多的州。即便这个广播台覆盖了一些已覆盖的州,也没有关系
  2. 重复第一步,直到覆盖所有的州

这是一种近似算法,因为获得精确解需要的时间太长,而贪婪算法可以很好的近似。。
而贪婪算法的运行时间为O(n2)O(n^2),减少的时间不止一点点。。

# coding=utf-8# 要覆盖的州
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"])final_stations = set() # 存储最终选择的广播台while states_needed:  # 只要没有全部覆盖完best_station = None states_covered = set()  # 存储已经覆盖的州for station, states in stations.items(): # items()存储键值(广播台和相应的覆盖州)covered = states_needed & states  # 集合的交集,判断还未覆盖的州与此广播台的交集个数   if len(covered) > len(states_covered): # 如果当前广播台州交集的个数大于当前要覆盖的州 best_station = station  # 就替换为最优的广播台states_covered = covered  # 替换已经覆盖的州states_needed -= states_covered # 从要覆盖的州中减去已经覆盖过的(集合相减)print 'states_needed:',states_neededfinal_stations.add(best_station) # 添加最优的广播台print final_stations

结果:

========== RESTART: C:\Users\LiLong\Desktop\Algorithm\set_cover.py ==========
states_needed: set(['ut', 'ca', 'az', 'or', 'nv'])
states_needed: set(['ut', 'az'])
states_needed: set(['ut'])
states_needed: set([])
set(['ktwo', 'kthree', 'kone', 'kfive'])
>>> 

得到了最终选的广播台集合是:’ktwo’, ‘kthree’, ‘kone’, ‘kfive’这4个

这只是个很简单的NP难得例子,还有其他的很多,有待进一步学习。。

参考:《算法图解》

贪婪算法近似集合覆盖问题的解相关推荐

  1. matlab求解集合覆盖问题,贪心算法实践之集合覆盖问题

    介绍 贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法 贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解 ...

  2. 三十六、贪心算法--集合覆盖问题

    一.贪心算法介绍 1.贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解 2.贪心算法不是对所有问题都 ...

  3. 贪心算法讲解(集合覆盖问题,旅行商问题求解)

    教室调度问题 假设有如下课程表,你希望将尽可能多的课程安排在某间教室上. 你没法让这些课都在这间教室上,因为有些课的上课时间有冲突. 你希望在这间教室上尽可能多的课.如何选出尽可能多且时间不冲突的课程 ...

  4. 贪心算法:集合覆盖问题

    文章目录 贪心算法 教室调度问题 背包问题 集合覆盖问题 NP完全问题 总结 贪心算法 贪心算法是一种解决问题的思路:每一步选择局部最优解,最终也许不会得到最优结果,但是也会接近最优结果. 贪心算法具 ...

  5. 【算法图解】 之 [贪婪算法(贪心算法)] 详解

    入门算法学习,看的第一本是深入浅出的<算法图解>一书,本博客是对<算法图解>一书的学习笔记,将书中的分享的算法示例用Python3语言实现. 如果你也想要阅读这本书,百度云盘链 ...

  6. 贪心算法【区间调度】【背包问题】【集合覆盖】【旅行商问题】【哈夫曼构造价值树】

    贪心算法  在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解.  贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择, ...

  7. 集合框架 Queue---BlockingQueue详解

    转载自  集合框架 Queue---BlockingQueue详解 摘要:本例介绍一个特殊的队列:BlockingQueue,如果BlockingQueue是空的,从BlockingQueue取东西的 ...

  8. Java集合迭代器原理图解_Java Iterator接口遍历单列集合迭代器原理详解

    这篇文章主要介绍了Java Iterator接口遍历单列集合迭代器原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Iterator接口概述 ...

  9. matlab求解集合覆盖问题,Set Cover Problem (集合覆盖问题)

    流网络-最大流问题(Maximum-flow problem) image.png 希望从0-7找到最大值,管道可以承载的最大值. 那么目标函数是objective:maximize X01+X02+ ...

最新文章

  1. C++ OpenCV创建xml,yml文件(图像)列表程序
  2. 如何使用 Python 操作 Git 代码?GitPython 入门介绍
  3. JAVA sql2000 连接细节
  4. qs.parse()、qs.stringify()使用方法
  5. [待]-optee的native_intr_handler中断处理流程
  6. 会议交流 - CCKS2020 | 2020年全国知识图谱与语义计算大会
  7. iOS之深入解析weak关键字的底层原理
  8. [译]C#8.0中一个使接口更加灵活的新特性-默认接口实现
  9. .NET Core 3.0之深入源码理解Startup的注册及运行
  10. 关于ArcObjects图层编辑的读写编辑锁
  11. 9月20日等级考试试题答案实时追踪中
  12. Java入门到进阶推荐书籍
  13. AI初学者用什么软件?适合AI新手的9款人工智能开源软件
  14. 固高运动控制卡跟随运动(Follow 运动模式)
  15. 计算机病毒是通过内存传播吗,计算机病毒的工作过程
  16. 删除日志文件 空间不释放
  17. Liunx服务器创建新用户
  18. python解包exe_Pyinstaller打包的EXE之解包
  19. 关于mask蒙尘效果触发
  20. QPushButton按钮互斥效果

热门文章

  1. OpenCV简单的几何绘图的实例(附完整代码)
  2. OpenCV透视变换应用于图像的实例(附完整代码)
  3. QT的QMultiSampleAntiAliasing类的使用
  4. QT的QHoverEvent类的使用
  5. 简单阻容降压电路图_X2安规电容用于阻容降压容量衰减原因及对策
  6. 2cocos2dx别踩白块游戏案例
  7. Struts2中的链接标签 s:url和s:a
  8. 线性代数行列式计算之升阶法
  9. 检索数据_14_返回不重复的记录
  10. android dumpsys 分析,Android开发调试性能分析工具:dumpsys