问题描述

全集 \(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 $

紧致性证明

构造情况如下

OPT为选择一个 \(1+\epsilon\) 的集合;贪心算法为选择剩下的所有集合。随着\(\epsilon \rightarrow 0\),近似因子趋近于调和级数 \(H_n\)

Set Cover问题的贪心近似算法分析的更多相关文章

  1. 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$处区间求和即可. 树 ...

  2. 斯坦福NLP课程 | 第12讲 - NLP子词模型

    作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www. ...

  3. 2020牛客暑期多校训练营 第二场 C Cover the Tree 构造 贪心

    LINK:Cover the Tree 最受挫的是这道题,以为很简单 当时什么都想不清楚. 先胡了一个树的直径乱搞的贪心 一直过不去.后来意识到这类似于最经典长链剖分优化贪心的做法 然后那个是求最大值 ...

  4. 用贪心算法近似求解 Loading Balance 问题(作业调度的负载均衡)

    一,Loading Balance 问题描述:有 m 台相同的机器及 n 个作业,其中 m={M(1),M(2),……M(m)}.n = {J(1),J(2),……J(n)}.每个作业都有一个处理时间 ...

  5. 贪心算法求解活动安排<算法分析>

    一.实验内容及要求 1.要求按贪心算法原理求解问题: 2.要求手工输入s[10]及f[10],其中注意自己判断s[i]<f[i]: 3.要求显示所有活动及最优活动安排的i事件列表.二.实验步骤  ...

  6. 剑指Offer——贪心算法

    剑指Offer--贪心算法 一.基本概念 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解.虽然贪心算法不能对 ...

  7. 贪心算法_01背包问题_Java实现

    原文地址:http://blog.csdn.net/ljmingcom304/article/details/50310789 本文出自:[梁敬明的博客] 1.贪心算法 什么是贪心算法?是指在对问题进 ...

  8. uva.10020 Minimal coverage(贪心)

    10020 Given several segments of line (int the X axis) with coordinates [Li, Ri]. You are to choose t ...

  9. 贪心 URAL 1303 Minimal Coverage

    题目传送门 /* 题意:最少需要多少条线段能覆盖[0, m]的长度 贪心:首先忽略被其他线段完全覆盖的线段,因为选取更长的更优 接着就是从p=0开始,以p点为标志,选取 (node[i].l < ...

  10. 阶乘之和 & 程序运行时间 & 算法分析

    实例:输入n,计算S = 1! + 2! + 3! + 4! + ... + n!的末六位(不含前导0).其中 n ≤ 106. 分析:考虑到数据溢出后程序如下: #include <stdio ...

随机推荐

  1. 【前端】CSS实现图片文字对齐 并随着设备尺寸改变而改变大小

    效果预览 HTML源码 点击查看HTML代码 <!DOCTYPE html> <html lang="zh-cn"> <head> <me ...

  2. X64\X86\X86-64的区别

    x86是指intel的开发的一种32位指令集,从386开始时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种指令集,ntel官方文档里面称为&qu ...

  3. linux shell移植,sh不支持数组及bash移植

    查看此时系统shell ls -al /bin/sh Linux 操作系统缺省的 shell 是Bourne Again shell,它是 Bourne shell 的扩展,简称 Bash,与 Bou ...

  4. Mybatisplus实现MetaObjectHandler接口自动更新创建时间更新时间

    踩坑: 直接实现该接口,发现进入该类后的entity已经重新处理updateTime了,但是更新数据库的时候,却不带updateTime更新. 原因: 由于对该接口等认识不足导致. 解决方案: 实体类 ...

  5. Java调用Shell问题整理

    背景 java可以通过Runtime来调用其他进程,如cmd命令,shell文件或脚本等. 基本用法 Runtime执行时返回一个Process对象,利用该对象完成脚本执行.下面的例子中,Linux的 ...

  6. 在openEuler RISC-V上无痛部署Solidity

    近几年区块链很火,随着各国政府对加密技术的监管政策不断变化和BTC的暴涨,越来越多人对这项去中心化的技术充满着期待.这次我用openEuler 24.09 RISC-V的远程机器尝试编译了Solidi ...

  7. Qt编写安防视频监控系统22-摄像机搜索

    一.前言 摄像机搜索模块是后面新增加的,这个模块很有必要,一开始做视频监控系统的时候,那时候还没有研究出来一套纯Qt底层通信的onvif类,也就前几个月搞出来了,支持搜索设备信息和云台控制,所以马上加 ...

  8. IDEA中基于SSM框架进行web开发部署项目到Tomcat时报错:Error:Cannot build artifact '******:war exploded' because it is included into a circular depency的解决办法

    在Idea中使用Maven创建父子工程,第一个Model的那个项目可以很好的运行,在创建一个Model运行时报这个错.原因是tomcat部署了多个Web项目,可能最开始是两个项目的配置文件混用用,最后 ...

  9. 网络编程入门如此简单(四):一文搞懂localhost和127.0.0.1

    本文由萤火架构分享,原题"localhost和127.0.0.1的区别是什么?",原文链接"juejin.cn/post/7321049446443417638" ...

  10. 前端开发常用git命令详细版

    1.新建代码库 当前目录创建一个git代码库 git init 新建一个目录文件 将其初始化为git代码库 git init [pro-name] 远端拉去项目 git clone [url] 2.基 ...