3-击中集问题的3倍近似多项式时间算法设计及近似比证明问询
嘿,咱们来一步步搞定这个3-击中集问题的近似算法设计和正确性证明吧!
首先先明确问题定义:
3-击中集问题是指,给定一个大小为$|U|=n$的基础集合$U$,以及由$U$的3元子集构成的集合族$F$,我们的目标是找到$U$的最小子集$S \subseteq U$,使得$S$与$F$中的每个集合都有非空交集——也就是对任意$f \in F$,都满足$f \cap S \ne \emptyset$。
接下来是咱们要用到的贪心算法,步骤很清晰:
贪心算法步骤
- 初始化剩余集合族$R = F$,空的击中集$S = \emptyset$。
- 当$R$不为空时:
- 从$U$中选出能击中$R$里最多集合的元素$u$(也就是$u$在$R$的3元子集中出现次数最多)
- 将$u$加入击中集$S$
- 从$R$中移除所有包含$u$的集合(也就是所有被$u$击中的集合)
- 当$R$为空时,返回$S$
这个算法是多项式时间的,因为每一步我们都可以在$O(n|F|)$的时间内找到击中最多集合的元素,而循环最多执行$n$次(最多选完$U$所有元素),所以总时间是多项式级别的。
近似比证明(3倍近似)
现在咱们来证明这个算法得到的$S$的大小不会超过最优解$S^*$的3倍:
假设最优解$S^*$的大小为$k$,算法输出的$S$大小为$m$。
集合分配:
每个集合$f \in F$至少包含$S*$中的一个元素(毕竟$S$是击中集),又因为$f$是3元集,所以最多包含$S*$中的3个元素。我们把每个$f$分配给$S$中它包含的任意一个元素,这样每个$S^*$中的元素$v$会被分配到$c_v$个集合,显然所有$c_v$的和等于$|F|$(每个集合都被分配了一次)。贪心选择的优势:
算法每一步选择的都是当前击中剩余集合最多的元素。对于任意剩余集合族$R$,这些剩余集合都还没被之前选的元素击中,所以它们都被分配给$S*$中的某个元素。根据鸽巢原理,$S*$中至少有一个元素$v$,它被分配的剩余集合数至少是$|R|/k$——毕竟$|R|$个集合分给$k$个元素,肯定有一个元素分到至少$1/k$的份额。而我们的算法选的元素击中的集合数肯定不少于这个值,所以每一步至少能击中当前剩余集合的$1/k$。近似比推导:
现在考虑$S^*$中的任意一个元素$v$,它被分配了$c_v$个集合。假设算法用了超过3个元素来击中这些$c_v$个集合,那么根据每一步至少击中$1/k$的剩余集合,这几步击中的集合总数会超过$c_v$(因为每一步的剩余集合数递减,但四次击中的总和会超过$c_v$),这显然不可能——因为$c_v$个集合只能被击中一次。所以每个$v$对应的$c_v$个集合最多需要3个算法元素来覆盖。既然$S^$有$k$个元素,每个最多对应3个算法元素,那么总的算法元素数$m \leq 3k$,也就是$|S| \leq 3|S^|$。
这样就证明了这个贪心算法是3倍近似的多项式时间算法。
备注:内容来源于stack exchange,提问作者furnio

