Set Cover问题的贪心近似算法分析
问题描述
全集 \(U = \{ e_1, e_2, ... , e_n \}\) 被划分为一系列的子集 \(S = \{ S_1, S_2, ... , S_k \}\)。且存在一个cost函数\(c: S \rightarrow \mathbb{R}^+\)。
目标是挑选子集使其覆盖所有全集 \(U\) 的元素同时cost最小
问题算法
该问题是经典的NPC问题。
给出其中一种近似算法:贪心策略,近似因子\(\ln n\)。如下描述
在每次迭代选择中,记当前已覆盖元素的集合为\(C\)。我们选择使得 \(\frac{cost(S)}{|S \backslash C|}\) 最小的 \(S\) 作为下一个子集,直至 \(C = U\)
近似因子分析
可以对每个被覆盖的元素定义一个价值函数 \(price\),$ price(e) = \frac{cost(S)}{|S \backslash C|}$,e是在该次选择 \(S\) 的贪心迭代中被覆盖的。可以清楚的感知到我们希望元素的price尽可能小,且最终的 $ 总cost = \sum\limits_{k=1}^{n} price(e_k) $
不妨按\(e_i\)被覆盖的顺序重新排列 \(U\) 中的元素为 \(\{ e_1, e_2, ..., e_k, ... , e_n \}\)。不失一般性,讨论任意某次迭代:在迭代之初,\(e_k\)尚未被覆盖,但根据算法将在此次迭代中将被选中的 \(S_i\) 覆盖。记原问题的最佳覆盖选择为\(OPT\),对于剩余元素的最佳覆盖选择为\(OPT_{剩余}\),有:
- 剩余元素数量 $ |U \backslash C| \geq n-k+1 $
- 此次贪心迭代所选集合的元素price 必不大于 剩余元素的最佳覆盖选择的平均元素price (局部贪心肯定最小)
- 剩余元素的最佳覆盖cost 必不大于 所有元素的最佳覆盖cost (都是最优解)
\]
所以有
\]
即 $ \delta = \ln n $
紧致性证明
构造情况如下

OPT为选择一个 \(1+\epsilon\) 的集合;贪心算法为选择剩下的所有集合。随着\(\epsilon \rightarrow 0\),近似因子趋近于调和级数 \(H_n\)
Set Cover问题的贪心近似算法分析的更多相关文章
- XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Saratov
A. Three Arrays 枚举每个$a_i$,双指针出$b$和$c$的范围,对于$b$中每个预先双指针出$c$的范围,那么对于每个$b$,在对应$c$的区间加$1$,在$a$处区间求和即可. 树 ...
- 斯坦福NLP课程 | 第12讲 - NLP子词模型
作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www. ...
- 2020牛客暑期多校训练营 第二场 C Cover the Tree 构造 贪心
LINK:Cover the Tree 最受挫的是这道题,以为很简单 当时什么都想不清楚. 先胡了一个树的直径乱搞的贪心 一直过不去.后来意识到这类似于最经典长链剖分优化贪心的做法 然后那个是求最大值 ...
- 用贪心算法近似求解 Loading Balance 问题(作业调度的负载均衡)
一,Loading Balance 问题描述:有 m 台相同的机器及 n 个作业,其中 m={M(1),M(2),……M(m)}.n = {J(1),J(2),……J(n)}.每个作业都有一个处理时间 ...
- 贪心算法求解活动安排<算法分析>
一.实验内容及要求 1.要求按贪心算法原理求解问题: 2.要求手工输入s[10]及f[10],其中注意自己判断s[i]<f[i]: 3.要求显示所有活动及最优活动安排的i事件列表.二.实验步骤 ...
- 剑指Offer——贪心算法
剑指Offer--贪心算法 一.基本概念 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解.虽然贪心算法不能对 ...
- 贪心算法_01背包问题_Java实现
原文地址:http://blog.csdn.net/ljmingcom304/article/details/50310789 本文出自:[梁敬明的博客] 1.贪心算法 什么是贪心算法?是指在对问题进 ...
- uva.10020 Minimal coverage(贪心)
10020 Given several segments of line (int the X axis) with coordinates [Li, Ri]. You are to choose t ...
- 贪心 URAL 1303 Minimal Coverage
题目传送门 /* 题意:最少需要多少条线段能覆盖[0, m]的长度 贪心:首先忽略被其他线段完全覆盖的线段,因为选取更长的更优 接着就是从p=0开始,以p点为标志,选取 (node[i].l < ...
- 阶乘之和 & 程序运行时间 & 算法分析
实例:输入n,计算S = 1! + 2! + 3! + 4! + ... + n!的末六位(不含前导0).其中 n ≤ 106. 分析:考虑到数据溢出后程序如下: #include <stdio ...
随机推荐
- k8s pod重启 deployment重启
1.15版本之后可通过kubectl rollout restart deployment -n 命令来实现滚动重启POD 该命令会先创建待用POD,待新POD运行成功后,再关闭原有POD.因此需要保 ...
- Linux系统 tcpdump 抓包命令使用教程
tcpdump 是Linux系统下的一个强大的命令,可以将网络中传送的数据包完全截获下来提供分析.它支持针对网络层.协议.主机.网络或端口的过滤,并提供and.or.not等逻辑语句来帮助你去掉无用的 ...
- 组件漏洞测试工具---Dependency-Check
目录 文章综述 Dependency-Check简介 工作原理 常用命令 报告解读 使用场景 缺点 文章综述 本文主要介绍Dependency-Check工具的工作原理和使用方法,并提供一个开源方案帮 ...
- JS操作iframe父级子级元素,jquery自动点击iframe里按钮
在父窗口中操作 选中iframe中的id $(window.frames["ifm"].document).find("#id").attr("val ...
- Qt4/5升级到Qt6吐血经验总结V202308
00:直观总结 增加了很多轮子,同时原有模块拆分的也更细致,估计为了方便拓展个管理. 把一些过度封装的东西移除了(比如同样的功能有多个函数),保证了只有一个函数执行该功能. 把一些Qt5中兼容Qt4的 ...
- Qt编写地图综合应用1-闪烁点图
一.前言 Qt作为一个超大型的一站式GUI超市开发集成环境,不仅集成了大量的可视化UI组件,还提供了网络库.数据库操作.文件操作等类库,封装的还是相当精彩一步到位,根据个人身边的一些程序员朋友了解,自 ...
- [转]为什么VS提示SurfFeatureDetector不是cv的成员函数
surf和sift算法都是在头文件#include <opencv2/features2d/features2d.hpp>中,但在新的opencv版本出来后,如果仍然使用这个头文件就会出现 ...
- IM开发快速入门(二):什么是IM系统的实时性?
本文在编写时参考了博客作者"鹿呦呦"和在线课程"即时消息技术剖析与实战"的相关资料,一并表示感谢. 1.引言 随着移动互联网络的发展,IM技术的应用已经不仅限于 ...
- dotnet最小webApi开发实践
dotnet最小webApi开发实践 软件开发过程中,经常需要写一些功能验证代码.通常是创建一个console程序来验证测试,但黑呼呼的方脑袋界面,实在是不讨人喜欢. Web开发目前已是网络世界中的主 ...
- Transformer总结
Contents Attention OverallSurvey NLP Language Speech CV Backbone_Classification Self-Supervised Inte ...