首页 > 编程语言 >Set Cover问题的贪心近似算法分析

Set Cover问题的贪心近似算法分析

时间:2023-04-06 22:34:20浏览次数:64  
标签:OPT Set frac 覆盖 price 元素 Cover cost 近似算法

问题描述

全集 \(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 (都是最优解)

\[ price(e_k) = \frac{cost(S_i)}{|S_i \backslash C|} \leq \frac{cost(OPT_{剩余})}{|U \backslash C|} \leq \frac{cost(OPT)}{|U \backslash C|} \leq \frac{cost(OPT)}{n-k+1} \]

所以有

\[ total\ cost = \sum\limits_{k=1}^{n} price(e_k) \leq (1 + \frac{1}{2} + \frac{1}{3} + ... + \frac{1}{n}) \cdot cost(OPT) = H_n \cdot cost(OPT) \leq \ln n \cdot cost(OPT) \]

即 $ \delta = \ln n $

紧致性证明

构造情况如下

image

OPT为选择一个 \(1+\epsilon\) 的集合;贪心算法为选择剩下的所有集合。近似因子就是调和级数 \(H_n\)

标签:OPT,Set,frac,覆盖,price,元素,Cover,cost,近似算法
From: https://www.cnblogs.com/elucidator-xrb/p/17294349.html

相关文章

  • java.nio.charset.MalformedInputException: Input length = 1
    将nacos作为配置中心时,发现加载nacos内容时报错:java.nio.charset.MalformedInputException:Inputlength=1后来发现,将项目统一为utf-8后,正常启动。 ......
  • Android中asset文件夹和raw文件夹区别
    res/raw和assets的相同点:1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。res/raw和assets的不同点:1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java......
  • RocketMQ手动跳过延迟消息offset
    背景收到开发人员反馈,延迟30s的消息,到时间还没有正常被消费,于是登陆到broker节点上去查看日志,有个ERROR级别的报错:#vimrocketmq-log/stats.logScheduleMessageService,amessagetimeup,butreputitfailed,topic:SCHEDULE_TOPIC_XXXXmsgId016F513245602A9F00904695B4CF......
  • ListView之setEmptyView的问题
    使用listView或者gridView时,当列表为空时,有时需要显示一个特殊的emptyview来提示用户,一般情况下,如果你是继承ListActivity,只要<ListViewandroid:id="@id/android:list".../><TextViewandroid:id="@id/android:empty.../>当列表为空时就会自动显示Tex......
  • 使用DbContext.Set<TEntity>()方法也可以对数据库实体进行CRUD操作
    我们可以用DbContext.Set<TEntity>()方法获取到一个DbSet<TEntity>对象,从而对泛型TEntity类所代表的数据库表进行CRUD操作。例如我们现在有数据库表和TEntity类Person,那么下面两种写法是完全等价的:dbContext.Persons.Take(10).ToList();//dbContext.Persons等于dbContext.Set<P......
  • bitset数组
    bitset的用法及例题(对DP过程的优化)  bitset这容器有点离谱,卡常优化空间神器。什么是bitset?bitset是c++STL里面的一个容器,可以理解为存放01串的,很奇怪,bool[]不也一样能实现这个功能?不是这样的,bool每个元素占一个字节,也就是8bit,而bitset中每个串中的01值每个只占一个bit!!!......
  • Kafka Tool | Offset Explorer工具
    OffsetExplorer工具介绍OffsetExplorer(即Kafkatool)是用于管理和使用Kafka群集的GUI应用程序。它提供了一个直观的UI,允许用户查看Kafka集群中的对象以及集群主题中存储的消息。官网地址:https://www.kafkatool.com/。kafka版本低于0.8.1:不支持kafka版本大于等于0.8.1、小于0.11:需......
  • [oeasy]python0128_unicode_字符集_character_set_八卦_星座
    unicode回忆上次内容中国的简体和繁体汉字字符数量都超级大彼此还认对方为乱码 如果有一种编码所有的字符都能编进去就好了中日韩(CJK)欧洲拼音梵文阿拉伯文卢恩字符等等等都包括进去 ​ 添加图片注释,不超过1......
  • cfdm配套的maven版本和setting
    1、版本号3.5.22、setting.xml<?xmlversion="1.0"encoding="UTF-8"?><settingsxmlns="http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="......
  • Git命令列表--git-reset
    GitReset名称git-Reset-重置当前HEAD到指定的状态或者复制条目到索引语法gitreset[-q][<tree-ish>][--]<pathspec>gitreset[-q][--pathspec-from-file=<file>[--pathspec-file-nul]][<tree-ish>]gitreset(--patch|-p)[<tree-ish>][--][<p......