# Overview

部分问题的解答中,关于怎么逻辑紧密的计算近似比,我实在理解不了、解释不了;

凑合背背应付考试吧

唯一能说的:

我们本节讨论的都是优化问题!!!

判断问题需要转化为优化问题!!!

# 顶点覆盖问题

image-20241224160445524

人话翻译:对于一张图,我要找一群点VV'。你看一条边两头不是有两个点吗,我要求对 G 图任意一条边ee,都有VV' 中的一个点是 e 的两头之一

因为你想选最少的点解决问题,所以问题成本 C 就是选了多少个点,即点的数量

# 具体近似算法

随机算法,一开始VV' 为空,

  1. 在 G 图上任取一条边 e
  2. 将 e 的两端点u,vu,v 并入VV'
  3. EE 中所有以 u 为一头端点的边删掉,再把EE 中所有以 v 为一头端点的边删掉
  4. 循环,直到 E 为空

# 时间复杂度

每次循环都会选出两点一边,所以你的算法时间复杂度为O(C/2)O(C/2)

# 近似率

对于近似率Q(n)Q(n),由于这是一个求最小问题,俺们的方法应该比最优方法要孬。近似比永远不小于 1,小的放分母,所以把最优CoptC_{opt} 放分母上

那咋算呢,回顾我们的随机算法,我们每轮循环会随机选一条边。到结束,我们选择所有边,是一群没有公共顶点的边,数量为 k。那我们的近似算法就选择了 2k 个点;

对于 k 个没有公共顶点的边,只要满足题设条件,那每条边至少要选一个顶点。所有满足条件的选法,其选点数量CkC\ge k,最优选法是 {所有满足条件的选法} 的一员,所以CoptkC_{opt}\ge k

CoursCopt2\dfrac{C_{ours}}{C_{opt}}\le 2,近似率为 2

# 集合覆盖问题

image-20241222174401067

人话翻译:对于 n 个元素,我有一系列元素组成的集合{S}={S1,S2,,Sm}\{S\}=\{S_1,S_2,\dots,S_m\}。这群集合并在一起覆盖了每个元素,但我嫌mm 太多了,我想从这mm 个集合中选一部分{S}\{S'\}{S}\{S'\} 含有 k 个子集。{S}\{S'\} 里所有子集并起来依然能覆盖所有元素,希望 k 最小

因为你想选最少数量的子集解决问题,所以问题成本 C 就是选了多少个子集,即子集的数量

# 具体近似算法

贪心算法,一开始{S}\{S\} 包含 m 个子集;{x}\{x\} 表示所有还没被覆盖过的元素,初始为{S}\{S\} 并起来的所有元素

  1. S{S} 中选择一个SkS_kSkS_k 中包含的元素和{x}\{x\} 交集最大;换句话,SkS_k 能覆盖最多的还没被覆盖的元素
  2. {S}\{S\} 中删除SkS_k
  3. {x}\{x\} 中删除所有SkS_k 的元素
  4. 循环,直到所有元素被覆盖

# 时间复杂度

每次循环都会选出一个子集,所以你的算法时间复杂度为O(C)O(C)

# 近似率

对于近似率Q(n)Q(n),由于这是一个求最小问题,近似方法应该比最优方法要孬。近似比永远不小于 1,小的放分母,所以把最优CoptC_{opt} 放分母上

回顾我们的随机算法,假设第 k 轮循环,{xk}\{x_k\} 大小为numknum_k,也就说还有numknum_k 个元素一次都没被覆盖过

对于原{x}\{x\}CoptC_{opt} 大小的{S}\{S'\} 可以并起来全部覆盖;{xk}\{x_k\}{x}\{x\} 的一部分,所以{S}\{S'\} 也能覆盖{xk}\{x_k\},且{S}\{S'\} 中的每个子集,平均要覆盖{xk}\{x_k\}numk/Coptnum_k/C_{opt} 个元素。

那放在这第 k 轮循环里,{Sk}\{S_k\} 中依然有{S}\{S'\} 中的子集SS';不然若没有,说明之前的循环中已经把{S}\{S'\} 取完了,那已经全覆盖了,不需要看第 k 轮循环了

子集SS’至少要覆盖numk/Coptnum_k/C_{opt}{xk}\{x_k\} 中的元素:因为numknum_kCoptC_{opt} 个子集SS' 瓜分

  • 要是{S}\{S'\} 在第kk 轮一个没少,那分母是CoptC_{opt}
  • 要是第 k 轮之前有的SS' 被选走过了,但他们一个{xk}\{x_k\} 中的元素没覆盖到,不干活;剩下的SS' 数量更少了,平均每个要分的{xk}\{x_k\} 中的元素更多了;

在第 k 轮我们选择子集SkS_k,这个选择是贪心的,是能覆盖{xk}\{x_k\} 中元素数量最多的,所以Sk>SS_k>S'SkS_k 至少能覆盖numk/Coptnum_k/C_{opt} 个没覆盖过的元素,SkS_k 覆盖新元素数numk/Copt\ge num_k/C_{opt}

那对于 k+1 轮循环,numk+1=numkSknum_{k+1}=num_k-S_k 覆盖新元素数,得:numk+1numk×(11/Copt)num_{k+1}\le num_k\times(1-1/{C_{opt}})

递推,得:numknum0×(11/Copt)knum_{k}\le num_0\times(1-1/{C_{opt}})^knum0num_0=n = 输入元素个数

令左边 < 1,经过数值计算化简,得到:

kt>ln(n)\dfrac{k}{t}>ln(n)

k 是近似算法的最小值,k=tln(n)k=\lceil tln(n)\rceil,由于Cours=kC_{ours}=k

所以CoursCoptln(n)+1/tln(n)+1\dfrac{C_{ours}}{C_{opt}}\le ln(n)+1/t \le ln(n)+1

# 分组问题

image-20241222183131991

其中a1>a2>>ana_1>a_2>\dots>a_n

人话翻译:对于 n 个元素的集合,我想切两半,使得集合的总和尽量平分到两个子集里

假设A=2L\sum A=2L,题目的目标将AA 划分为X,YX,Y 两集合,求max(X,Y)max(\sum X,\sum Y) 的最小值

所以问题成本CC 就是max(X,Y)max(\sum X,\sum Y)Copt=LC_{opt}=L

# 具体近似算法

随机算法:

  1. 先随机对前 m 个元素随机分配,划入 X,Y

  2. {am+1,,an}\{a_m+1,\dots,a_n\} 中的每一个aka_k,判断X\sum XY\sum Y,选择较小的一方,将aka_k 加入其中

  3. 循环,直到k=nk=n

# 时间复杂度

时间复杂度O(nm)O(n-m)

# 近似率

由于这是一个求最小问题,近似方法应该比最优方法要孬。近似比永远不小于 1,小的放分母,所以把最优CoptC_{opt} 放分母上

回顾我们的随机算法,不妨假设最终X>Y\sum X>\sum YQ(n)=X/LQ(n)=\sum X/L

考虑集合AA 中最后一个被分到XX 的元素aka_k,它是集合 A 的第kk 个元素,那么元素aka_k

  • 来自步骤 1,是随机分配时分入XX
  • 来自步骤 2,在分配aka_k 前,X<Y\sum X<\sum Y

前一种情况暂不考虑(不知道咋考虑……)

考虑后一种情况,其满足:

XkakYkAXk\sum X_k - a_k \le \sum Y_k\le \sum A -\sum X_k

其中Xk,  Yk\sum X_k,\;\sum Y_k 表示划分完aka_k 后两子集的元素和

变形可得:

XkL+ak2\sum X_k \le L + \dfrac{a_k}2

a1>a2>>ana_1>a_2>\dots>a_n,我们可以得到:

AXk+Yk=sum(a1,a2,,ak)(m+1)×ak\begin{align*} \sum A&\ge \sum X_k +\sum Y_k\\ &=sum(a_1,a_2,\dots,a_k)\\ &\ge (m+1)\times a_k \end{align*}

所以Q(n)=X/L<1+11+mQ(n)=\sum X/L<1+\dfrac{1}{1+m}

此文章已被阅读次数:正在加载...更新于

谢谢你请我喝[茶]!(๑OvO๑)♪

柳小寒寒子 微信支付

微信支付