算法设计与分析--近似算法内容整理

文章目录

  • P、NP、NP-hard 和 NPC
  • Load Balancing
    • Load Balancing
    • Load balancing on 2 machines is NP-hard
    • Load Balancing: List Scheduling
    • Load balancing: list scheduling analysis
    • Load balancing: LPT rule
  • Center selection
    • Center selection problem
    • Greedy algorithm: a false start
    • Center Selection: Greedy Algorithm
    • Analysis of Greedy Algorithm
  • pricing method:Weighted vertex cover
    • Weighted vertex cover 最小权顶点覆盖
    • Pricing method 定价法
    • 定价法近似算法
    • 定价法近似算法例子
    • 定价法近似算法分析
  • LP rounding: weighted vertex cover
    • weighted vertex cover
    • Weighted vertex cover: ILP formulation
    • LP 可行域
  • Poly-time reductions
    • Reduction
    • Independent set
    • Vertex cover
    • Vertex cover and independent set reduce to one another
    • Set-Cover 集合覆盖
    • Vertex cover reduces to set cover
    • Satisfiability
    • 3-satisfiability reduces to independent set
    • Review
  • Hamilton
    • Hamilton cycle
    • Directed Hamilton cycle reduces to Hamilton cycle
    • 3-satisfiability reduces to directed Hamilton cycle

近似算法-徐小华

P、NP、NP-hard 和 NPC

多项式时间

多项式时间是指 一个问题的计算时间随着问题的规模增加而增加的速度,多项式时间的算法可以用多项式倍数来表示。

多项式时间的一般形式是 O ( n k ) O(n^k) O(nk),其中 n n n 是问题的规模, k k k 是一个常数。

  • 当 k=0 时, O ( n k ) O(n^k) O(nk) 就是 O(1);
  • 当 k=1 时, O ( n k ) O(n^k) O(nk) 就是 O(n)。

所以,O(1) 和 O(n) 都是多项式时间的特例。

举例来说,如果一个问题的计算时间是 O ( n 2 ) O(n^2) O(n2),

  • 那么当问题的规模 n n n 从 10 增加到 20 时,计算时间会从 100 增加到 400,增加了 4 倍。
  • 如果问题的规模再增加 10 倍,变成 200,那么计算时间会变成 40000,增加了 100 倍。

多项式时间的算法通常被认为是高效的,因为它们的运行时间随着问题规模的增长不会太快。相比之下,指数时间、阶乘时间等非多项式时间的算法就很低效,因为它们的运行时间随着问题规模的增长会呈指数爆炸。

多项式时间的算法可以根据它们的 多项式次数 来分类,例如 O(1)、O(log n)、O(n)、O(n log n)、 O ( n 2 ) O(n^2) O(n2)、 O ( n 3 ) O(n^3) O(n3) 等。一般来说,多项式次数越低,算法的效率越高。

下面是一些常见的多项式时间算法的例子:

  • O(1):常数时间,指算法的运行时间与问题的规模无关,例如判断一个数是否是偶数、返回数组的第一个元素等。
  • O(log n):对数时间,指算法的运行时间与问题的规模的对数成正比,例如二分查找、快速幂等。
  • O(n):线性时间,指算法的运行时间与问题的规模成正比,例如遍历数组、线性搜索、计数排序等。
  • O(n log n):指算法的运行时间与问题的规模和对数的乘积成正比,例如归并排序、快速排序、堆排序等。
  • O ( n 2 ) O(n^2) O(n2):指算法的运行时间与问题的规模的平方成正比,例如冒泡排序、选择排序、插入排序等。
  • O ( n 3 ) O(n^3) O(n3):指算法的运行时间与问题的规模的立方成正比,例如矩阵乘法、高斯消元、弗洛伊德算法等。

概念区分

在这里插入图片描述

直观:

  • P P P ≈ 可以用多项式时间的确定性算法求解 的问题;

    例如,排序、最短路径、二分查找等。

    多项式时间意味着,问题的规模(如输入的长度)增大时,算法的运行时间不会超过某个多项式函数的值。

  • N P NP NP ≈ 可以在多项式时间内验证一个解是否正确 的问题。(NP:Nondeterministic polynominal,非确定性多项式)

    例如,旅行商问题、哈密顿回路问题、子集和问题等。

    不知道这个问题存不存在一个多项式时间的算法,所以叫非确定性(non-deterministic),但是可以 在多项式时间内验证并得出这个问题的一个正确解。

P 类问题是 NP 类问题的子集(即存在多项式时间算法的问题,总能在多项式时间内验证它)。

P P P 问题和 N P NP NP 问题之间的区别: N P NP NP 类问题可以用多项式时间的非确定性算法求解,但是不能用多项式时间的确定性算法求解,而 P P P 类问题可以用多项式时间的确定性算法求解。

  • NP-hard :指 比所有的 N P NP NP 问题都难的问题,即所有的 N P NP NP 问题都可以在多项式时间内约化到它,但它不一定是一个 N P NP NP 问题。

    例如,判定停机问题、最长公共子序列问题等。

    为了证明 NP = P,想到的方法之一是问题的约化。可以用问题 B 的算法来解决 A ,我们就说问题 A 可以约化成问题 B。比如,二元一次方程的求解可以约化成一元一次方程的求解。

    约化是具有传递性的,如 A 约化到 B,B 约化到 C,A 就可以约化到 C,同时不断约化下去,一定会存在一个最大的问题,只需要解决了这个问题,那其下的所有问题也就解决啦!这就是 NPC 概念。

  • NP-complete 问题:属于 NP 问题,且属于 NP-hard 问题。

    例如,3SAT 问题、背包问题、图着色问题等。

    存在这样一个 NP 问题,所有的 NP 问题都可以约化成它。也就是说,它是 NP 问题中最难的问题,如果能找到一个 NP-complete 问题的多项式时间算法,那么所有的 NP 问题都可以在多项式时间内解决。

P 和 NP 问题的关系是一个未解决的数学难题,目前没有人能证明或否定 P 是否等于 NP。

  • 如果 P=NP,那么就意味着所有可以快速验证的问题也可以快速求解,这将对数学、计算机科学、密码学等领域产生巨大的影响。
  • 如果 P≠NP,那么就意味着存在一些困难的问题,即使有最强大的计算机也无法在合理的时间内解决。

在这里插入图片描述

NP-hard 的证明

证明某个问题是 NP−hard 问题 的一般方法是使用 归约,即 将一个已知的 NP−hard 问题转化为目标问题,从而说明目标问题的难度不低于已知问题。

具体步骤如下:

  • 首先,选择一个已知的 NP−hard 问题,例如 3SAT、旅行商问题、哈密顿回路问题、背包问题等。
  • 然后,设计一个多项式时间的算法,将已知问题的任意一个实例转化为目标问题的一个实例,使得两个实例的解之间有 一一对应的关系。
  • 最后,证明这个转化算法的正确性和有效性,即如果目标问题有一个多项式时间的算法,那么已知问题也有一个多项式时间的算法,这与 NP−hard 问题的定义相矛盾。

关键点:多项式归约( X ≤ P Y X \ ≤_P \ Y X ≤P​ Y,若 X X X 是 NP-hard,那么 Y Y Y 也是 NP-hard)

例题 1 证明 T S P TSP TSP 问题是 N P − h a r d NP-hard NP−hard 问题 。

证明思路——将 哈密尔顿回路问题 多项式时间归约到 TSP。

  • TSP 问题是指给定一系列城市和每对城市之间的距离,求解 经过每一座城市一次并回到起始城市的最短回路。
  • 哈密顿回路问题是指给定一个无向图,判断是否存在一条 经过每个顶点一次并回到起点的回路。

证明如下:

1)构造实例:

给定无权图 G = ( V , E ) G = (V,E) G=(V,E) ,构造一个带权完全图 G ’ = ( V , E , W ) G’ = (V,E, W) G’=(V,E,W)
W u v = { 1 , ( u , v ) ∈ E ∞ , ( u , v ) ∉ E W_{uv}=\begin{cases} 1, & (u,v)\in E \\ \infty, & (u,v) \notin E \end{cases} Wuv​={1,∞,​(u,v)∈E(u,v)∈/E​

  • 对于图 G G G 中的每对顶点之间的边,将它们的距离设置为 1;

  • 对于图 G G G 中不存在的边,将它们的距离设置为一个非常大的值,保证旅行商不会选择这些边。

将 TSP 的目标函数设置为 最小化旅行的总路程。

2)证明等价性:

这样一来,如果 图 G G G 存在一个哈密尔顿回路,那么 相应的 TSP 实例也存在一个路程等于图 G G G 中哈密尔顿回路长度的最优解。

反过来,如果 TSP 实例存在一个最优解, 它对应的路径将经过每个城市一次,并且总路程等于哈密尔顿回路长度,因此图 G G G 存在一 个哈密尔顿回路。

综上,由于哈密尔顿回路问题是一个 已知的 NP-hard 问题,上述归约证明了 TSP 是 NP-hard 问题。

例题 2 证明最大加权独立集问题是 N P − h a r d NP-hard NP−hard 问题。

证明思路——从 最大独立集问题 多项式归约到 最大加权独立集问题。

  • 最大独立集问题:给定一个无向图 G G G 和一个正整数 k k k,问题是 找到 G G G 中具有最大独立集大小的一个独立集(即,其中没有两个顶点相邻),该独立集的大小至少为 k k k。
  • 最大加权独立集问题:给定一个带有权重的无向图 G G G 和一个正整数 k k k,问题是找到 G G G 中具有最大权重的独立集,该独立集的大小至少为 k k k。

证明如下:

1)构造实例:

对于给定的最大独立集问题实例(图 G = ( V , E ) G = (V,E) G=(V,E) 和正整数 k k k),构造一个具有相同顶点集的带权重的图 G ’ = ( V , E , W ) G’ = (V,E, W) G’=(V,E,W),对于任何 v ∈ V v \in V v∈V , w ( v ) = 1 w(v) = 1 w(v)=1。对于 G G G 中的每条边 ( u , v ) (u, v) (u,v), 在 G ′ G' G′ 中添加一条带有权重 0 的边 ( u , v ) (u, v) (u,v),保持 k k k 不变。

2)证明等价性:

如果 G G G 中存在一个大小至少为 k k k 的独立集,那么在 G ′ G' G′ 中的相应顶点集也是 一个大小至少为 k k k 的独立集,因为 G ′ G' G′ 中的新添加的边都具有权重 0。

如果 G ′ G' G′ 中存在一个大小至少为 k k k 的独立集,那么在 G G G 中的相应顶点集也是一个大小至少为 k k k 的独立集,因为 G ′ G' G′ 中的边都具有权重 0,所以在计算最大权重时,只有顶点的数量起作用。

由于最大独立集问题是一个已知的 NP-hard 问题,上述归约证明了最大加权独立集也是一个 NP-hard 问题。

扩展 NP-hard 问题

3-SAT 问题

对于任意的布尔表达式总能写成以下标准式: ( . . ∨ . . ∨ . . ) ∧ ( . . ∨ . . ∨ . . ) ∧ ( . . ∨ . . ∨ . . ) (.. \vee .. \vee ..)\ \wedge \ (.. \vee .. \vee ..)\ \wedge (.. \vee .. \vee ..) (..∨..∨..) ∧ (..∨..∨..) ∧(..∨..∨..),很多个与 ∧ \wedge ∧ 并在一起,每一个 ( . . ∨ . . ∨ . . ) (.. \vee .. \vee ..) (..∨..∨..) 都是一个 Clause。3-SAT 问题,每个 Clause 子句恰好都有 3 个元素。

TSP 旅行商问题

TSP 是 Travelling Salesman Problem 的缩写,中文翻译成旅行商问题。

给定一系列城市和每对城市之间的距离,求解经过每一座城市一次并回到起始城市的最短回路。

Load Balancing

Load Balancing

输入: m m m 台相同的机器; n ≥ m n ≥ m n≥m 个作业,作业 j j j 的处理时间为 t j t_j tj​。

  • 作业 j j j 必须在一台机器上连续运行。

  • 一台机器一次最多可以处理一个作业。

定义:设 S ( i ) S(i) S(i) 是分配给机器 i i i 的作业集,则机器 i i i 的 负载 为 L i = ∑ j ∈ S ( i ) t j L_i= \displaystyle \sum_{j \in S(i)}t_j Li​=j∈S(i)∑​tj​

定义:makespan 是 任何机器上的最大负载 L = m a x i L i L=max_i L_i L=maxi​Li​

负载均衡:将每个作业分配给机器,以 最小化 makespan。

在这里插入图片描述

Load balancing on 2 machines is NP-hard

Claim. Load balancing is hard even if m = 2 machines.

Pf. PARTITION ≤ P ≤_P ≤P​ LOAD-BALANCE.

≤ P ≤_P ≤P​ 的理解:负载均衡 比 分区问题 还要难。

想表达啥呢?

  • 就是想说 负载均衡是 NP-hard 问题。

分区问题(Partition problem)目的是把一个多重集 S S S 分为 S 1 S_1 S1​ 和 S 2 S_2 S2​ 两个子集,要求 S 1 S_1 S1​ 和 S 2 S_2 S2​ 这两个集合中所有数的和相等。

  • 分区问题属于 NPC 问题。

  • 实例:现有多重集 S = { 3 , 1 , 1 , 2 , 2 , 1 } S=\{3,1,1,2,2,1 \} S={3,1,1,2,2,1} ,可以被分为 S 1 = { 1 , 1 , 1 , 2 } S_1=\{1,1,1,2\} S1​={1,1,1,2} 以及 S 2 = { 2 , 3 } S_2=\{2,3\} S2​={2,3},两者元素之和皆为 5。

  • 三分区问题与分区问题有很大不同,三分区问题要求每个子集中都有 3 个元素。三分区问题比分区问题更难。

Load Balancing: List Scheduling

List-scheduling algorithm. 考虑按某种固定顺序的 n n n个作业,将作业 j j j 分配给到目前为止负载最小的机器。

在这里插入图片描述

实现: L [ k ] L[k] L[k] 使用优先队列,时间复杂度为 O ( n l o g m ) O(n log m) O(nlogm)。

在这里插入图片描述

Load balancing: list scheduling analysis

引理 1:最优 makespan L ∗ ≥ m a x j t j L^* ≥ max_jt_j L∗≥maxj​tj​

证明:一定有一台机器需要处理最耗时的工作。

引理 2:最优 makespan L ∗ ≥ 1 m ∑ j t j L^* ≥ \frac{1}{m} \displaystyle \sum_j t_j L∗≥m1​j∑​tj​

证明:

  • 总处理时间为 ∑ k t k \displaystyle \sum_k t_k k∑​tk​。

  • m m m 台机器中的一台必须至少完成全部工作的 1 / m 1/m 1/m。

定理:贪心算法是 2-近似 算法。

证明:考虑瓶颈机器 i i i 的负载 L [ i ] L[i] L[i],瓶颈机器即 最终负载最高的机器。

让 j j j 是机器 i i i 上安排的最后一个作业,当工作 j j j 分配给机器 i i i 时, i i i 的负载最小,其分配前的负载为 L [ i ] – t j L[i]–t_j L[i]–tj​;

因此对于所有 1 ≤ k ≤ m 1≤k≤m 1≤k≤m, L [ i ] – t j ≤ L [ k ] L[i]–t_j≤L[k] L[i]–tj​≤L[k]。

对所有 k k k 上的不等式求和,两边再除以 m m m,得
L [ i ] − t j ≤ 1 m ∑ k L [ k ] = 1 m ∑ k t k ≤ L ∗ L[i] - t_j ≤ \frac{1}{m} \displaystyle \sum_k L[k] = \frac{1}{m} \displaystyle \sum_k t_k ≤ L^* L[i]−tj​≤m1​k∑​L[k]=m1​k∑​tk​≤L∗
其中, 1 m ∑ k t k ≤ L ∗ \frac{1}{m} \displaystyle \sum_k t_k ≤ L^* m1​k∑​tk​≤L∗ 应用引理 2,至此, L [ i ] − t j ≤ L ∗ L[i] - t_j ≤ L^* L[i]−tj​≤L∗ 成立。

由引理 1, t j ≤ L ∗ t_j ≤ L^* tj​≤L∗ 。

因此, L = L [ i ] = ( L [ i ] − t j ) + t j ≤ 2 L ∗ L = L[i] = (L[i] - t_j) + t_j ≤ 2L^* L=L[i]=(L[i]−tj​)+tj​≤2L∗,即贪心算法是 2-近似 算法。

在这里插入图片描述

在这里插入图片描述

举个例子: m m m 台机器,前 m ( m − 1 ) m(m-1) m(m−1) 个作业的长度为 1,最后一个作业长度为 m m m。

在这里插入图片描述
在这里插入图片描述

可知, L = 2 m − 1 L = 2m-1 L=2m−1 ≤ 2 L ∗ = 2 m 2L^* = 2m 2L∗=2m。

Load balancing: LPT rule

Longest processing time (LPT). 按处理时间的降序对 n n n 个作业进行排序;然后运行 列表调度算法。

在这里插入图片描述

观察:如果瓶颈机器 i i i 只有 1 个作业,那么是最优的。

证明:任何解决方案都必须安排这个作业。

引理 3:如果有多于 m m m 个作业, L ∗ ≥ 2 t m + 1 L^* ≥ 2 t_{m+1} L∗≥2tm+1​。

证明:考虑前 m + 1 m+1 m+1 个作业的处理时间, t 1 ≥ t 2 ≥ . . . ≥ t m + 1 t_1 ≥ t_2 ≥ ... ≥ t_{m+1} t1​≥t2​≥...≥tm+1​,作业按处理时间降序排列,所以这前 m + 1 m+1 m+1 的每个作业至少消耗 t m + 1 t_{m+1} tm+1​ 时间,

m + 1 m+1 m+1 个作业和 m m m 台机器,由鸽巢原理,至少有一台机器被分配两个作业,即 L ∗ ≥ 2 t m + 1 L^* ≥ 2 t_{m+1} L∗≥2tm+1​。

定理:LPT rule 是一个 3 2 \frac{3}{2} 23​-近似 算法。

证明:(类似于列表调度的证明)

考虑瓶颈机器 i i i 的负载 L [ i ] L[i] L[i],让 j j j 是机器 i i i 上安排的最后一个作业,

假设机器 i i i 至少被分配两个作业,那么 j ≥ m + 1 j ≥ m+1 j≥m+1,作业按处理时间降序排列,所以 t j ≤ t m + 1 t_j ≤ t_{m+1} tj​≤tm+1​,

由引理 3, t m + 1 ≤ 1 2 L ∗ t_{m+1} ≤ \frac{1}{2}L^* tm+1​≤21​L∗,所以 t j ≤ 1 2 L ∗ t_j ≤ \frac{1}{2}L^* tj​≤21​L∗,那么
L = L [ i ] = ( L [ i ] − t j ) + t j ≤ 3 2 L ∗ L = L[i] = (L[i] - t_j) + t_j ≤ \frac{3}{2} L^* L=L[i]=(L[i]−tj​)+tj​≤23​L∗
这里 L [ i ] − t j ≤ L ∗ L[i] - t_j ≤ L^* L[i]−tj​≤L∗ 同列表调度的证明。

定理:LPT rule 是一个 4 3 \frac{4}{3} 34​-近似 算法。

证明:对相同算法进行更复杂的分析。

举个例子: m m m 台机器, n = 2 m + 1 n = 2m+1 n=2m+1 个作业,2 个长度为 m , m + 1 , … , 2 m – 1 m, m+1, … , 2m–1 m,m+1,…,2m–1 的作业和一个长度为 m m m 的作业,则 L / L ∗ = ( 4 m − 1 ) / ( 3 m ) L / L^* = (4m − 1) / (3m) L/L∗=(4m−1)/(3m)

Center selection

Center selection problem

Input. Set of n sites s 1 , … , s n s_1,…,s_n s1​,…,sn​ and an integer k > 0 k > 0 k>0.

在给定一些 site 的位置后,找到一组中心的位置,使得 每个 site 都在某个中心的覆盖范围内,且覆盖半径尽可能小。覆盖半径是指 site 到最近的中心的距离的最大值。

目标:求 使覆盖半径 r ( C ) r(C) r(C) 最小化的中心集 C C C,使得 ∣ C ∣ = k |C|=k ∣C∣=k。

为了理解 Center selection ,举个例子,下图是 k = 4 k=4 k=4 时的 Center selection 图示:

在这里插入图片描述

  • d i s t ( x , y ) dist(x, y) dist(x,y) = distance between sites x x x and y y y.
  • d i s t ( s i , C ) = m i n c ∈ C d i s t ( s i , c ) dist(s_i , C) = min_{c ∈ C} dist(s_i , c) dist(si​,C)=minc∈C​dist(si​,c) = distance from s i s_i si​ to closest center.
  • r ( C ) = m a x i d i s t ( s i , C ) r(C) = max_i dist(s_i , C) r(C)=maxi​dist(si​,C) = smallest covering radius.
  • d i s t ( x , y ) dist(x, y) dist(x,y) 就是 site x x x 和 site y y y 之间的距离。
  • d i s t ( s i , C ) dist(s_i , C) dist(si​,C) 就是 site s i s_i si​ 离最近中心的距离,比如下图中 黄绿色箭头 有两条,但是选到下面那个圆心的那条。
  • r ( C ) r(C) r(C) 就是 所有 site 和最近中心的距离的最大值,如图中浅蓝色线所示。在 所有的 Center (图中的圆圈区域)中,必定存在至少一个 site 在圆上,和中心的距离为 r ( C ) r(C) r(C),这是所有的 Center 中离最近的中心最远的 site。

在这里插入图片描述

在这里插入图片描述

当 k = 4 k=4 k=4 时,有 Center 1, 2, 3, 4 四个 Center,其中 Center 1 中的 s 1 s_1 s1​ 和 s 2 s_2 s2​ 距离最近的中心 C 1 C_1 C1​ 的距离为 r ( C ) r(C) r(C),这是 所有的 site 和其最近的中心的距离中的最大值。可以看到 Center 2 中不存在 site 距离最近中心 C 2 C_2 C2​ 的距离等于 r ( C ) r(C) r(C)。

所以,Center selection problem 就是,把所有 site 划分为 k k k 个 Center,求 r ( C ) r(C) r(C) 的最小值。

  • d i s t ( x , x ) = 0 dist(x, x) = 0 dist(x,x)=0
  • d i s t ( x , y ) = d i s t ( y , x ) dist(x, y) = dist(y, x) dist(x,y)=dist(y,x)
  • 三角不等式: d i s t ( x , y ) ≤ d i s t ( x , z ) + d i s t ( z , y ) dist(x, y) ≤ dist(x, z) + dist(z, y) dist(x,y)≤dist(x,z)+dist(z,y)

其中,每个 site 是平面中的一个点,Center 中心可以是平面中任何一个点(不一定在 site 中选择), d i s t ( x , y ) dist(x,y) dist(x,y)=欧几里得距离。

Greedy algorithm: a false start

Greedy algorithm.

  • 将第一个中心放在 单个中心的最佳位置,即 site 的位置的平均值。这样可以保证第一个中心的覆盖半径是最小的。

  • 然后 不断添加中心,以尽可能 减少每次的覆盖半径。

注意:该算法中,Center 中心可以是平面中任何一个点(不一定在 site 中选择)。

比如,当 k = 2 k=2 k=2 时,选择的第一个中心如下图:

在这里插入图片描述

Greedy Center 1 是第一个中心,它是 单个中心的最佳位置。

但是很明显这个中心不是 k = 2 k=2 k=2 时的最优解,最优解应像下图绿色的两个圆,两个 Center 分别是两个圆的圆心。

在这里插入图片描述

Center Selection: Greedy Algorithm

Greedy algorithm. 反复选择 离任何现有中心最远的 site 作为下一个中心。

这是为了尽可能地将 site 分散到不同的中心,从而减少每个中心的覆盖半径。

注意:该算法中,Center 中心必须在 site 中选择。

当 k = 1 k=1 k=1 时,即 第一个中心 Center,随机 从所有 site 中选择。

在这里插入图片描述

Property. 在终止时, C C C 中的所有中心成对地相距至少 r ( C ) r(C) r(C)。

反证法:假设有两个中心,按照算法,第二个中心是距离第一个中心最远的 site。 r ( C ) r(C) r(C) 是所有 site 中离最近中心的最远距离,如果两中心距离小于 r ( C ) r(C) r(C),即 第二个中心距离第一个中心小于 r ( C ) r(C) r(C),那么 余下的 site 距离第一个中心都小于 r ( C ) r(C) r(C),所以所有 site 都可以被第一个中心覆盖(画图容易理解),从而可以删除第二个中心。

这个算法的运行时间是 O ( n k ) O(nk) O(nk),

  • 因为每次选择新的中心需要遍历所有的点,计算它们到已有中心的距离,然后找出最大的一个。
  • 这个过程需要重复 k k k 次,所以总的时间复杂度是 O ( n k ) O(nk) O(nk)。

如果 k k k 是一个常数,那么这个算法的运行时间就是 O ( n ) O(n) O(n)。

Analysis of Greedy Algorithm

在这里插入图片描述

定理:假设 C ∗ C^* C∗ 是最优的一组中心,那么 r ( C ) ≤ 2 r ( C ∗ ) r(C) ≤ 2r(C^*) r(C)≤2r(C∗)。

【思路】

  • C ∗ C^* C∗ 中的每个 site c i ∗ c_i^* ci∗​,是 假设的最优的一组中心,也就是说,它的覆盖半径 r ( C ∗ ) r(C^*) r(C∗) 是所有可能的一组中心中最小的。对于 C ∗ C^* C∗ 中的任何 site s s s,它到 C ∗ C^* C∗ 中的最近的中心 c i ∗ c_i^* ci∗​ 的距离都不会超过 r ( C ∗ ) r(C^*) r(C∗)。

  • C C C 中的每个 site c i c_i ci​,是 贪心算法得到的一组中心。它的覆盖半径 r ( C ) > r ( C ∗ ) r(C) > r(C^*) r(C)>r(C∗)。对于 C C C 中的任何 site s s s,它到 C C C 中的最近的中心 c i c_i ci​ 的距离都不会超过 r ( C ) r(C) r(C)。

  • 接下来,在 C C C 中的每个 site c i c_i ci​ 的周围画一个半径为 1 2 r ( C ) \frac{1}{2}r(C) 21​r(C) 的球。可以想象,这些球就像是 C C C 中的每个中心的覆盖范围,它们可以覆盖到 一定的 site。我们想要知道,这些球里面有没有 C ∗ C^* C∗ 中的中心,也就是说,有没有 C ∗ C^* C∗ 中的中心距离 C C C 中的中心很近。然后发现,每个球里面正好有一个 C ∗ C^* C∗ 中的中心 c i ∗ c_i^* ci∗​,也就是说,每个 c i c_i ci​ 都有一个最近的 c i ∗ c_i^* ci∗​,并且它们的距离小于 1 2 r ( C ) \frac{1}{2}r(C) 21​r(C)。

  • 这样,我们就构造了一个与 C C C 对应的一组中心 C ∗ C^* C∗。

证明:

假设 r ( C ∗ ) < 1 2 r ( C ) r(C^*) < \frac{1}{2}r(C) r(C∗)<21​r(C),

对于 C C C 中的每个site c i c_i ci​,考虑其周围半径为 1 2 r ( C ) \frac{1}{2}r(C) 21​r(C) 的球,每个球正好有一个 c i ∗ c_i^* ci∗​;

这一步是为了构造一个与 C C C 对应的一组中心 C ∗ C^* C∗,使得每个 c i c_i ci​ 都有一个最近的 c i ∗ c_i^* ci∗​,并且它们的距离小于 1 2 r ( C ) \frac{1}{2}r(C) 21​r(C)。

设 c i c_i ci​ 为与 c i ∗ c^*_i ci∗​ 配对的 site,考虑 C ∗ C^* C∗ 中的任何 site s s s 及其最近的中心 c i ∗ c_i^* ci∗​,

d i s t ( s , C ) ≤ d i s t ( s , c i ) ≤ d i s t ( s , c i ∗ ) + d i s t ( c i ∗ , c i ) ≤ 2 r ( C ∗ ) dist(s, C) ≤ dist(s, c_i) ≤ dist(s, c_i^*) + dist(c_i^*, c_i) ≤ 2r(C^*) dist(s,C)≤dist(s,ci​)≤dist(s,ci∗​)+dist(ci∗​,ci​)≤2r(C∗);

s s s 到 c i c_i ci​ 的距离可以用 三角不等式 分解为 s s s 到 c i ∗ c_i^* ci∗​ 的距离加上 c i ∗ c_i^* ci∗​ 到 c i c_i ci​ 的距离,而这两个距离都不会超过 r ( C ∗ ) r(C^*) r(C∗),因为 c i ∗ c_i^* ci∗​ 是 s s s 和 c i c_i ci​ 最近的中心。

即 r ( C ) ≤ 2 r ( C ∗ ) r(C) ≤ 2r(C^*) r(C)≤2r(C∗),这与假设矛盾,因此 r ( C ∗ ) ≥ 1 2 r ( C ) r(C^*) ≥ \frac{1}{2}r(C) r(C∗)≥21​r(C),即 r ( C ) ≤ 2 r ( C ∗ ) r(C) ≤ 2r(C^*) r(C)≤2r(C∗)。

得出结论,即 C C C 的覆盖半径不会超过 C ∗ C^* C∗ 的覆盖半径的两倍。

在这里插入图片描述

每个球正好有一个 c i ∗ c_i^* ci∗​ ?

  • 为什么在 c i c_i ci​ 周围的每个球 至少有一个 c ∗ c^* c∗ ?

    如果一个球里面没有 C ∗ C^* C∗ 中的中心 c ∗ c^* c∗,那么 c i c_i ci​ 就不在 C ∗ C^* C∗ 中任何中心的 1 2 r ( C ) \frac{1}{2}r(C) 21​r(C) 内,这与 r ( C ∗ ) < 1 2 r ( C ) r(C^*)<\frac{1}{2}r(C) r(C∗)<21​r(C) 的假设相矛盾。

  • 为什么在 c i c_i ci​ 周围的每个球 至多有一个 c ∗ c^* c∗ ?

    这些 球是不相交的,每个球至少包含一个 c ∗ c^* c∗,并且 ∣ c ∣ = ∣ c ∗ ∣ |c|=|c^*| ∣c∣=∣c∗∣。

    • 首先,这些球是 不相交 的,因为它们的半径都是 1 2 r ( C ) \frac{1}{2} r(C) 21​r(C),而 C C C 中的所有中心成对地相距至少 r ( C ) r(C) r(C)。这意味着任意两个球的中心之间的距离都大于等于 r ( C ) r(C) r(C),而它们的半径之和都等于 r ( C ) r(C) r(C),所以它们不会重叠。
    • 其次,每个球至少包含一个 c i ∗ c_i^* ci∗​,这是前面已经证明过的。
    • 最后, ∣ c ∣ = ∣ c ∗ ∣ |c|=|c^*| ∣c∣=∣c∗∣,这是 因为 C C C 和 C ∗ C^* C∗ 都是由 k k k 个中心组成的,而且 C ∗ C^* C∗ 是最优的一组中心,所以它不能有多余的中心。这意味着每个 c i ∗ c_i^* ci∗​ 都必须被一个球包含,否则它就不会覆盖任何 site,从而导致 r ( C ∗ ) r(C^*) r(C∗) 增大。因此,每个球至多有一个 c i ∗ c_i^* ci∗​。

定理:贪心算法是 Center selection problem 的 2-近似 算法。

注意:贪心算法总是将中心放置在 site 上,但仍在 允许在任何位置放置中心的最佳解决方案 的 2 倍以内。

pricing method:Weighted vertex cover

Weighted vertex cover 最小权顶点覆盖

Definition. 给定一个图 G = ( V , E ) G = (V, E) G=(V,E),一个顶点覆盖是一个集合 S ⊆ V S ⊆ V S⊆V,使得 E E E 中的每条边都至少有一端在 S S S 中。

Weighted vertex cover. 给定一个带有顶点权重的图 G G G,找到一个 权重最小的顶点覆盖。

在这里插入图片描述

在这里插入图片描述

可以理解为,顶点覆盖就是 用顶点去覆盖所有的边。

  • 比如,左上角的顶点覆盖了边 Edge 1, 3, 4;右下角的顶点覆盖了边 Edge 2, 3, 5。至此,所有的边均被覆盖。左下角和右上角的顶点没有覆盖任何边。

如果单看一条边,就要满足每条边都至少有一个眼睛可以“保护”。

  • 比如,只看 Edge 1,左上角的顶点保护(覆盖)了这条边。

下图顶点覆盖包含 2 个顶点,覆盖了所有的边:

在这里插入图片描述

Pricing method 定价法

Pricing method. 每条边都必须被某个顶点覆盖。边 e = ( i , j ) e=(i,j) e=(i,j) 为同时使用顶点 i i i 和 j j j 而付出的代价 p e ≥ 0 p_e≥0 pe​≥0。

  • 把顶点 i i i 的权看作保护费 w i w_i wi​,每一条边必须为覆盖它的顶点支付“一份”保护费,即顶点 i i i 覆盖的边一起支付保护费 w i w_i wi​。

理解:并不是所有的边都会出钱,因为顶点一旦具备保护(覆盖)能力后,与其相邻的所有边均被保护(覆盖)。

公平性:入射到顶点 i i i 的边应总共付出代价 ≤ w i ≤w_i ≤wi​。

在这里插入图片描述

  • 选择一个顶点 i i i 覆盖所有与 i i i 关联的边,因此要这些边支付总和多于顶点 i i i 的费用是“不公平的”。
  • 如果对每一个顶点 i i i,所有与 i i i 关联的边不必支付多于顶点 i i i 的费用,即 ∑ e = ( i , j ) p e ≤ w i \displaystyle \sum_{e=(i,j)} p_e ≤ w_i e=(i,j)∑​pe​≤wi​,则称价格 p e p_e pe​ 是公平的。

在这里插入图片描述

  • 如上图所示,对于左上角顶点, E d g e 1 + E d g e 3 + E d g e 4 Edge1+Edge3+Edge4 Edge1+Edge3+Edge4 所支付的费用和 ⩽ 2 \leqslant 2 ⩽2;
  • 对于右下角顶点, E d g e 2 + E d g e 3 + E d g e 5 Edge2+Edge3+Edge5 Edge2+Edge3+Edge5 所支付的费用和 ⩽ 9 \leqslant 9 ⩽9。
  • 注意,左上角和右下角的顶点所连接的边 E d g e 3 Edge3 Edge3 贡献了两次 p e p_e pe​。

每一个顶点 i ∈ V i \in V i∈V 有一个权 w i ≥ 0 w_i≥0 wi​≥0,顶点集合 S S S 的权记作 w ( S ) = ∑ i ∈ S w i w(S) =\displaystyle \sum_{i \in S}w_i w(S)=i∈S∑​wi​。

公平性引理:对于任何顶点覆盖 S S S 和任何公平价格 p e p_e pe​, ∑ e ∈ E p e ⩽ w ( S ) \displaystyle \sum_{e \in E} p_e \leqslant w(S) e∈E∑​pe​⩽w(S)。

证明:

考虑顶点覆盖 S S S,

根据公平性的定义,对每一个顶点 i ∈ S i \in S i∈S, ∑ e = ( i , j ) p e ⩽ w i \displaystyle \sum_{e=(i,j)} p_e \leqslant w_i e=(i,j)∑​pe​⩽wi​ ,对 S S S 的所有顶点将这些不等式相加,得到:
∑ i ∈ S ∑ e = ( i , j ) p e ⩽ ∑ i ∈ S w i = w ( S ) \displaystyle \sum_{i \in S} \sum_{e=(i,j)} p_e \leqslant \sum_{i \in S}w_i = w(S) i∈S∑​e=(i,j)∑​pe​⩽i∈S∑​wi​=w(S)
因为 S S S 是一个顶点覆盖,故每一条边对 ∑ i ∈ S ∑ e = ( i , j ) p e \displaystyle \sum_{i \in S} \sum_{e=(i,j)} p_e i∈S∑​e=(i,j)∑​pe​ 至少贡献一个 p e p_e pe​,可能贡献两个 p e p_e pe​,因为一条边的两个端点可能都在 S S S 中,而价格是非负的,所以
∑ e ∈ E p e ⩽ ∑ i ∈ S ∑ e = ( i , j ) p e \displaystyle \sum_{e\in E}p_e \leqslant \sum_{i \in S}\sum_{e=(i,j)}p_e e∈E∑​pe​⩽i∈S∑​e=(i,j)∑​pe​
由这两个表达式,得到
∑ e ∈ E p e ⩽ w ( S ) \displaystyle \sum_{e \in E} p_e \leqslant w(S) e∈E∑​pe​⩽w(S)
可证。

下面举个例子说明:

在这里插入图片描述

S = { a , b , d } S=\{a,b,d\} S={a,b,d} 是一个顶点覆盖,边的价格 p e p_e pe​ 标注在边的旁边,顶点的权值 w i w_i wi​ 在顶点中给出,

  • ∑ e ∈ E p e = 3 + 0 + 1 + 0 + 2 = 6 \displaystyle \sum_{e \in E} p_e = 3 + 0 + 1 + 0 + 2 = 6 e∈E∑​pe​=3+0+1+0+2=6 (所有边权之和 p ( a , b ) + p ( a , c ) + p ( a , d ) + p ( b , c ) + p ( c , d ) p_{(a,b)}+p_{(a,c)}+p_{(a,d)}+p_{(b,c)}+p_{(c,d)} p(a,b)​+p(a,c)​+p(a,d)​+p(b,c)​+p(c,d)​)
  • ∑ i ∈ S ∑ e = ( i , j ) p e = ( 3 + 0 + 1 ) + ( 3 + 0 ) + ( 1 + 2 ) = 10 \displaystyle \sum_{i \in S} \sum_{e=(i,j)}p_e = (3+0+1) + (3+0)+(1+2) = 10 i∈S∑​e=(i,j)∑​pe​=(3+0+1)+(3+0)+(1+2)=10 (在 S S S 中的顶点 a , b , c a,b,c a,b,c 的关联的边的和,其中 p ( a , b ) p_{(a,b)} p(a,b)​ 和 p ( a , d ) p_{(a,d)} p(a,d)​ 加了两次,因为边 ( a , b ) (a,b) (a,b) 和 ( a , d ) (a,d) (a,d) 的两个端点都在 S S S 中)
  • ∑ i ∈ S w i = 4 + 3 + 3 = 10 \displaystyle \sum_{i \in S}w_i = 4 + 3 + 3 = 10 i∈S∑​wi​=4+3+3=10 (在 S S S 中的顶点 a , b , c a,b,c a,b,c 的权值之和 w a + w b + w c w_a+w_b+w_c wa​+wb​+wc​)

综上, ∑ e ∈ E p e ⩽ ∑ i ∈ S ∑ e = ( i , j ) p e ⩽ ∑ i ∈ S w i = w ( S ) \displaystyle \sum_{e \in E} p_e \leqslant \displaystyle \sum_{i \in S} \sum_{e=(i,j)}p_e \leqslant \displaystyle \sum_{i \in S}w_i = w(S) e∈E∑​pe​⩽i∈S∑​e=(i,j)∑​pe​⩽i∈S∑​wi​=w(S)

定价法近似算法

近似算法的目标是:找到一个顶点覆盖 & 同时确定价格。

  • 认为算法 在如何确定价格方面是贪心的,然后用这些价格选择顶点覆盖的顶点。

定价法/竞价法 简单理解为:

  • 边给相邻的点支付保护费,以保证自己能被至少一个点保护(覆盖);
  • 而点收到来自各条相邻边支付的保护费之和刚好是它的权值,才能保护它们。
  • 这样,那些收到保护费刚好是自身权值的点构成一个顶点覆盖。

算法过程:

  • 选出还未被保护的边,提最少的价使得其相邻点至少有一个能保护它,这些能保护(覆盖)临近边的点称其为紧(tight)的,将其加入点覆盖集合。
  • 循环操作,直至所有边都能被保护。

如果 ∑ e = ( i , j ) p e = w i \displaystyle \sum_{e=(i,j)}p_e = w_i e=(i,j)∑​pe​=wi​,则称顶点 i i i 是紧的(或“付清的”)。

在这里插入图片描述

定价法近似算法例子

在这里插入图片描述

  • 开始时没有一个顶点是紧的,算法决定选择边 ( a , b ) (a,b) (a,b),可以把 ( a , b ) (a,b) (a,b) 支付的价格提高到 3,这时顶点 b b b 变成紧的,不能再提高了。
  • 然后算法选择边 ( a , d ) (a,d) (a,d),只能把它的价格提高到 1,因为这时顶点 a a a 变成紧的( a a a 的权等于 4,它还与一条支付 3 的边关联)。
  • 最后,算法选择边 ( c , d ) (c,d) (c,d),可以把它支付的价格提高到 2,这时顶点 d d d 变成紧的。
  • 现在所有的边都至少有一个端点是紧的,因此算法终止。
  • 紧的顶点是 { a , b , d } \{a,b,d\} {a,b,d} ,这是得到的顶点覆盖(注意这不是最小顶点覆盖,选择 a a a 和 c c c 可以得到最小权顶点覆盖)。

注意:如果边 e e e 的两个端点都在这个顶点覆盖中,那么 e e e 可能不得不为两个顶点支付。如,边 ( a , b ) (a,b) (a,b) 和边 ( a , d ) (a,d) (a,d)。

  • 但是,每一条边最多被要求支付两次它的价格(每个端点一次)。

Theorem. 近似算法返回的集合 S S S 和价格 p p p 满足不等式 w ( S ) ⩽ 2 ∑ e ∈ E p e w(S) \leqslant 2 \displaystyle \sum_{e \in E} p_e w(S)⩽2e∈E∑​pe​。

证明:

因为 S S S 中的所有顶点都是紧的,故对所有的 i ∈ S i \in S i∈S, ∑ e = ( i , j ) p e = w i \displaystyle \sum_{e=(i,j)}p_e = w_i e=(i,j)∑​pe​=wi​。

对 S S S 中的所有顶点求和得到:
w ( S ) = ∑ i ∈ S w i = ∑ i ∈ S ∑ e = ( i , j ) p e w(S) = \displaystyle \sum_{i \in S}w_i = \sum_{i \in S} \sum_{e=(i,j)} p_e w(S)=i∈S∑​wi​=i∈S∑​e=(i,j)∑​pe​
∑ i ∈ S ∑ e = ( i , j ) p e \displaystyle \sum_{i \in S} \sum_{e=(i,j)} p_e i∈S∑​e=(i,j)∑​pe​ 中一条边 e = ( i , j ) e=(i,j) e=(i,j) 最多可以被包含两次(如果 i i i 和 j j j 都在 S S S 中),所以
w ( S ) = ∑ i ∈ S ∑ e = ( i , j ) p e ⩽ 2 ∑ e ∈ E p e w(S)=\sum_{i \in S} \sum_{e=(i,j)} p_e \leqslant 2\sum_{e\in E}p_e w(S)=i∈S∑​e=(i,j)∑​pe​⩽2e∈E∑​pe​

定价法近似算法分析

Theorem. 定价法近似算法是 WEIGHTED-VERTEX-COVER 的 2-近似 算法。即近似算法返回的集合 S S S 是一个顶点覆盖,它的费用不超过顶点覆盖最小费用的 2 倍。

证明:

由于 while 循环的每次迭代后至少有一个新节点变紧,因此算法终止。

近似算法返回的 S S S 的确是一个顶点覆盖。否则,假设 S S S 不覆盖边 e = ( i , j ) e=(i,j) e=(i,j),则顶点 i i i 和 j j j 都不是紧的,这与算法中 while 循环终止矛盾。

设 S ∗ S^* S∗ 是一个最优顶点覆盖,

由 w ( S ) ⩽ 2 ∑ e ∈ E p e w(S) \leqslant 2 \displaystyle \sum_{e \in E} p_e w(S)⩽2e∈E∑​pe​ ,再由公平性引理有 ∑ e ∈ E p e ⩽ w ( S ∗ ) \displaystyle \sum_{e \in E} p_e \leqslant w(S^*) e∈E∑​pe​⩽w(S∗),则
w ( S ) ⩽ 2 ∑ e ∈ E p e ⩽ 2 w ( S ∗ ) w(S) \leqslant 2 \displaystyle \sum_{e \in E} p_e \leqslant 2w(S^*) w(S)⩽2e∈E∑​pe​⩽2w(S∗)
可证。

LP rounding: weighted vertex cover

weighted vertex cover

给定一个带有顶点权重 w i ≥ 0 w_i ≥ 0 wi​≥0 的图 G = ( V , E ) G = (V, E) G=(V,E),找到一个权重最小的顶点子集 S ⊆ V S ⊆ V S⊆V,使得每条边都至少有一个顶点在 S S S 中。

在这里插入图片描述

Weighted vertex cover: ILP formulation

Integer linear programming formulation. 整数线性规划建模

  • 使用 0/1 变量 x i x_i xi​ 来建模每个顶点 i i i 的包含:

x i = { 0 , 顶点 i 不在顶点覆盖中 1 , 顶点 i 在顶点覆盖中 x_i = \begin{cases} 0, 顶点 i 不在顶点覆盖中\\ 1, 顶点 i 在顶点覆盖中 \end{cases} xi​={0,顶点i不在顶点覆盖中1,顶点i在顶点覆盖中​

顶点覆盖与 0/1 赋值一一对应: S = { i ∈ V : x i = 1 } S = \{ i ∈ V : x_i = 1 \} S={i∈V:xi​=1}

  • 目标函数:最小化 ∑ i w i x i \displaystyle \sum_i w_i x_i i∑​wi​xi​。

  • 约束条件:对于每条边 ( i , j ) (i, j) (i,j),必须取顶点 i i i 或 j j j (或两者都取): x i + x j ≥ 1 x_i + x_j ≥ 1 xi​+xj​≥1。

在这里插入图片描述

Observation. 如果 x ∗ x^* x∗ 是 I L P ILP ILP 的最优解,那么 S = { i ∈ V : x i ∗ = 1 } S = \{ i ∈ V : x_i^* = 1 \} S={i∈V:xi∗​=1} 是一个最小权重的顶点覆盖。

给定整数 a i j , b i a_{ij}, b_i aij​,bi​ 和 c j c_j cj​,找到满足以下条件的 整数 x j x_j xj​:

在这里插入图片描述

Observation. 顶点覆盖的公式证明了整数规划是一个 NP-难 的优化问题。

给定整数 a i j , b i a_{ij}, b_i aij​,bi​ 和 c j c_j cj​,找到满足以下条件的 实数 x j x_j xj​:

在这里插入图片描述

LP 可行域

下图是一个简单的线性规划可行域:

在这里插入图片描述

观察:LP 的最优值 ≤ ILP的最优值。

证明:LP 具有较少的约束(可以不是整数)。

注意:LP 解 x ∗ x^* x∗可能不对应于顶点覆盖。(即使所有权重都是 1)

在这里插入图片描述

Q:求解 LP 如何帮助我们找到一个低权重的顶点覆盖?
A:求解 LP 并舍入 x ∗ x^* x∗ 中的分数值。

引理:如果 x ∗ x^* x∗ 是最优的 LP 解,那么 S = { i ∈ V : x i ∗ ⩾ 1 / 2 } S=\{ i \in V: x_i^* \geqslant 1/2\} S={i∈V:xi∗​⩾1/2} 是一个顶点覆盖,并且权值最多是最小权值的两倍。

证明:

先证 S S S 是一个顶点覆盖:考虑任意一条边 ( i , j ) ∈ E (i,j)\in E (i,j)∈E,由于 x i ∗ + x j ∗ ⩾ 1 x_i^* + x_j^* \geqslant 1 xi∗​+xj∗​⩾1,则 x i ∗ ⩾ 1 / 2 x_i^* \geqslant 1/2 xi∗​⩾1/2 或者 x j ∗ ⩾ 1 / 2 x_j^* \geqslant 1/2 xj∗​⩾1/2 或者两者都,那么 ( i , j ) (i,j) (i,j) 被覆盖。

再证 S S S 有期望的权值:设 S ∗ S^* S∗ 是最优的顶点覆盖,那么
∑ i ∈ S ∗ w i ⩾ ∑ i ∈ S w i x i ∗ ⩾ 1 2 ∑ i ∈ S w i \displaystyle \sum_{i \in S^*}w_i \geqslant \sum_{i \in S}w_i x_i^* \geqslant \frac{1}{2} \sum_{i \in S}w_i i∈S∗∑​wi​⩾i∈S∑​wi​xi∗​⩾21​i∈S∑​wi​

  • 第一个不等号是因为 LP 的最优值 ≤ ILP的最优值,这是因为 LP 具有更少的约束。
  • 第二个不等号是因为 x i ∗ ⩾ 1 / 2 x_i^* \geqslant 1/2 xi∗​⩾1/2。

定理:舍入算法 是一种 2-近似 算法。
证明:引理 + LP 可以在多项式时间内求解的事实。

Poly-time reductions

Reduction

假设我们能在多项式时间内解决问题 Y Y Y,那么在多项式时间还能解决什么呢?

Reduction. 如果问题 X X X 的任意实例可以使用以下公式求解,则 问题 X X X 的多项式时间可 归约 为问题 Y Y Y:

  • 标准计算步骤的多项式数,
  • 解决问题 Y Y Y 的对 oracle 的多项式调用数。(oracle 是由特殊硬件补充的计算模型,可在一步中解决 Y Y Y 的实例)

在这里插入图片描述

符号: X ≤ P Y X≤_P Y X≤P​Y。
注意:我们花时间写下发送到 oracle 的 Y Y Y 的实例必须是多项式大小。
新手易错:混淆 X ≤ P Y X≤_P Y X≤P​Y 与 Y ≤ P X Y≤_P X Y≤P​X。

Design algorithms. 如果 X ≤ P Y X≤_P Y X≤P​Y ,且 Y Y Y 可以在多项式时间内求解,那么 X X X 可以在多项式时间内求解。

建立不可解性:如果 X ≤ P Y X≤_P Y X≤P​Y ,且 X X X 不能在多项式时间内求解,则 Y Y Y 不能在多项式时间内求解。

建立等价性:如果 X ≤ P Y X ≤_P Y X≤P​Y 且 Y ≤ P X Y ≤_P X Y≤P​X,我们使用符号 X ≡ P Y X ≡_P Y X≡P​Y。在这种情况下, X X X 可以在多项式时间内解决当且仅当 Y Y Y 也可以。

结论:归约可以根据问题的相对难度进行分类。

Independent set

Independent-Set. 给定一个图 G = ( V , E ) G=(V, E) G=(V,E) 和一个整数 k k k,是否存在 k k k(或更多)顶点的子集,使得子集中的 任意两个顶点都不相邻?

在这里插入图片描述

Vertex cover

Vertex-Cover. 给定一个图 G = ( V , E ) G=(V, E) G=(V,E) 和一个整数 k k k,是否存在 k k k(或更少)顶点的子集,使得每条边都入射到子集中 至少有一个顶点?

在这里插入图片描述

Vertex cover and independent set reduce to one another

定理: I n d e p e n d e n t − S e t ≡ P V e r t e x − C o v e r Independent-Set \ ≡_P \ Vertex-Cover Independent−Set ≡P​ Vertex−Cover.

证明:我们证明 S S S 是大小为 k k k 的独立集,当且仅当 V − S V−S V−S 是大小为 n – k n–k n–k 的顶点覆盖。

  • 充分性证明

设 S S S 是一个大小为 k k k 的独立集, V − S V − S V−S 的大小为 n – k n – k n–k。

考虑任意一条边 ( u , v ) ∈ E (u, v) ∈ E (u,v)∈E,

S S S 独立 ⇒ u ∉ S u ∉ S u∈/S 或 v ∉ S v ∉ S v∈/S 或两者都不在 S S S 中 ⇒ u ∈ V − S u ∈ V − S u∈V−S 或 v ∈ V − S v ∈ V − S v∈V−S 或两者都在 V − S V − S V−S 中。 因此, V − S V − S V−S 覆盖了 ( u , v ) (u, v) (u,v)。

  • 必要性证明

设 V − S V − S V−S 是一个大小为 n – k n – k n–k 的顶点覆盖, S S S 的大小为 k k k。

考虑任意一条边 ( u , v ) ∈ E (u, v) ∈ E (u,v)∈E,

V − S V − S V−S 是一个顶点覆盖 ⇒ u ∈ V − S u ∈ V − S u∈V−S 或 v ∈ V − S v ∈ V − S v∈V−S 或两者都在 V − S V − S V−S 中 ⇒ u ∉ S u ∉ S u∈/S 或 v ∉ S v ∉ S v∈/S 或两者都不在 S S S 中。

因此, S S S 是一个独立集。

Set-Cover 集合覆盖

Set-Cover. 给定一个元素集合 U U U,一个 U U U 的子集合的集合 S S S,和一个整数 k k k,是否存在 ≤ k ≤ k ≤k 个这样的子集合,它们的 并集等于 U U U?

举个例子, m m m 个可用的软件,我们希望我们的系统具有的 n n n 个功能的集合 U U U。第 i i i 个软件提供了 U U U 的子集 S i S_i Si​ 的功能。目标:使用最少的软件实现所有 n n n 个功能。

在这里插入图片描述

Vertex cover reduces to set cover

定理: V e r t e x − C o v e r ≤ P S e t − C o v e r Vertex-Cover \ ≤_P \ Set-Cover Vertex−Cover ≤P​ Set−Cover.

证明:给定一个顶点覆盖问题的实例 G = ( V , E ) G = (V, E) G=(V,E) 和 k k k,我们构造一个集合覆盖问题的实例 ( U , S , k ) (U, S, k) (U,S,k),使得 U U U 有大小为 k k k 的集合覆盖当且仅当 G G G 有大小为 k k k 的顶点覆盖。

构造方法:全集 U = E U = E U=E。 对于每个结点 v ∈ V v ∈ V v∈V,包含一个子集 S v = { e ∈ E : e 与 v 相邻 } S_v = \{e ∈ E : e 与 v 相邻 \} Sv​={e∈E:e与v相邻}。

在这里插入图片描述

在这里插入图片描述

引理:如果 G = ( V , E ) G = (V, E) G=(V,E) 包含一个大小为 k k k 的顶点覆盖,那么 ( U , S , k ) (U, S, k) (U,S,k) 包含一个大小为 k k k 的集合覆盖,反之亦然。

证明:

  • 充分性证明

设 X ⊆ V X ⊆ V X⊆V 是 G G G 中的一个大小为 k k k 的顶点覆盖。 那么 Y = { S v : v ∈ X } Y = \{ S_v : v ∈ X \} Y={Sv​:v∈X} 是一个大小为 k k k 的集合覆盖。

  • 必要性证明

设 Y ⊆ S Y ⊆ S Y⊆S 是 ( U , S , k ) (U, S, k) (U,S,k) 中的一个大小为 k k k 的集合覆盖。 那么 X = { v : S v ∈ Y } X = \{ v : S_v ∈ Y \} X={v:Sv​∈Y} 是 G 中的一个大小为 k k k 的顶点覆盖。

Satisfiability

在这里插入图片描述

SAT. 给定一个合取范式(CNF)公式 Φ \Phi Φ ,它是否有一个满足的真值赋值?

3 − S A T 3-SAT 3−SAT 是一个特殊的 SAT 问题,其中每个子句恰好包含 3 个文字(并且每个文字对应于不同的变量)。

在这里插入图片描述

3-satisfiability reduces to independent set

定理: 3 − S a t ≤ P I n d e p e n d e n t − S e t 3-Sat \ ≤_P \ Independent-Set 3−Sat ≤P​ Independent−Set.

证明:

给定一个 3 − S A T 3-SAT 3−SAT 问题的实例 Φ \Phi Φ,我们构造一个独立集问题的实例 ( G , k ) (G, k) (G,k) ,使得 G G G 有一个大小为 $k = \left| \Phi \right| $ 的独立集当且仅当 Φ \Phi Φ 是可满足的。

构造方法:

・ G G G 包含每个子句的 3 个结点,每个结点对应一个文字。

・将一个子句中的 3 个文字用三角形连接起来。

・将每个文字和它的否定连接起来。

在这里插入图片描述

引理:如果 Φ \Phi Φ 是可满足的,那么 G G G 包含一个大小为 k = ∣ Φ ∣ k = \left| \Phi \right| k=∣Φ∣ 的独立集,反之亦然。

证明:

  • 充分性证明

考虑 Φ \Phi Φ 的任意一个满足的真值赋值。 从每个子句/三角形中选择一个真值为真的文字。 这是一个大小为 k = ∣ Φ ∣ k = \left| \Phi \right| k=∣Φ∣ 的独立集。

  • 必要性证明

设 S S S 是一个大小为 k k k 的独立集。 S S S 必须在每个三角形中包含恰好一个结点。 将这些文字设为真(并且保持剩余文字的一致性)。 Φ Φ Φ 中的所有子句都被满足。

Review

基本的归约策略:

简单等价:独立集问题与顶点覆盖问题多项式等价, I n d e p e n d e n t − S e t ≡ P V e r t e x − C o v e r Independent-Set \ ≡_P \ Vertex-Cover Independent−Set ≡P​ Vertex−Cover

特殊情况到一般情况:顶点覆盖问题多项式归约到集合覆盖问题, V e r t e x − C o v e r ≤ P S e t − C o v e r Vertex-Cover \ ≤_P \ Set-Cover Vertex−Cover ≤P​ Set−Cover

利用小构件进行编码:3-SAT问题多项式归约到独立集问题, 3 − S a t ≤ P I n d e p e n d e n t − S e t 3-Sat \ ≤_P \ Independent-Set 3−Sat ≤P​ Independent−Set

传递性:如果 X ≤ P Y X ≤_P Y X≤P​Y 并且 Y ≤ P Z Y ≤_P Z Y≤P​Z,那么 X ≤ P Z X ≤_P Z X≤P​Z。

证明思路:将两个算法组合起来。

Ex. 3 − S a t ≤ P I n d e p e n d e n t − S e t ≤ P V e r t e x − C o v e r ≤ P S e t − C o v e r 3-Sat \ ≤_P \ Independent-Set \ ≤_P \ Vertex-Cover \ ≤_P \ Set-Cover 3−Sat ≤P​ Independent−Set ≤P​ Vertex−Cover ≤P​ Set−Cover

Hamilton

Hamilton cycle

HAMILTON-CYCLE.(哈密顿回路) 给定一个无向图 G = ( V , E ) G = (V, E) G=(V,E),是否存在一个循环 $ \Gamma$,它恰好访问每个结点一次?

在这里插入图片描述

在这里插入图片描述

DIRECTED-HAMILTON-CYCLE. (有向哈密顿回路) 给定一个有向图 G = ( V , E ) G = (V, E) G=(V,E),是否存在一个有向循环 Γ \Gamma Γ,它恰好访问图中的每个结点一次?

定理:DIRECTED-HAMILTON-CYCLE ≤ P ≤_P ≤P​ HAMILTON-CYCLE

证明:给定一个有向图 G = ( V , E ) G = (V, E) G=(V,E),构造一个有 3 n 3n 3n 个结点的图 G ʹ G^ʹ Gʹ。

在这里插入图片描述

Directed Hamilton cycle reduces to Hamilton cycle

引理: G G G 有一个有向哈密尔顿回路 当且仅当 G ʹ G^ʹ Gʹ 有一个哈密尔顿回路。

  • 哈密尔顿回路是指一个 图中的一个回路,它恰好经过图中的每个顶点一次。

  • 有向哈密尔顿回路是指一个 有向图中的一个有向回路,它恰好经过有向图中的每个顶点一次。

3-satisfiability reduces to directed Hamilton cycle

定理:3-SAT ≤ P ≤_P ≤P​ DIRECTED-HAMILTON-CYCLE.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/pingmian/37821.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c#网络Tcp和udp

TCP 通信 TCP 服务端 Socket tcpServer new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ipAddress new IPAddress(new byte[] { 192, 168, 1, 5 }); IPEndPoint ipEndPoint new IPEndPoint(ipAddress, 7788); tcpServer.Bind(ip…

AI大模型的制造业场景,一文读懂

导读 如何认识这一轮AI技术发展影响的深度和广度?如何判断这一轮AI技术变革的性质? AI大模型是通用人工智能发展的重要里程碑。中央会议关于人工智能发展提出三个第一次:第一次提出“通用人工智能”,第一次提出“产业智能化”&a…

武汉星起航:激发中国卖家潜力,亚马逊减免政策共筑电商辉煌

在全球化电子商务的浪潮中,亚马逊作为全球领先的电商平台,一直致力于为卖家提供卓越的服务和支持。特别是对于中国卖家而言,亚马逊的减免优惠政策无疑是一股强大的助力,帮助他们在不断发展的市场中脱颖而出,实现业务的…

设计模式 - Observer Pattern 观察者模式

文章目录 定义观察者模式的实现构成构成UML图 观察者模式的代码实现场景代码实现 总结优点缺点应用场景 其他设计模式文章: 定义 观察者模式是行为型模式的一种,它定义对象间的一种一对多的依赖关系,使得每当一个对象改变状态,它…

重温react-08(createContext使用方式)

react中的createContext使用方式 简介一下,就是组件之间可以互相通信的比较好用的传值方式,话不多说直接上代码。 以下介绍的是类组件中的方式,在函数组件中不是如此使用的。 定义一个通用的方法 import { createContext } from "react…

MathType7.6专业数学公式编辑器!与Word、PPT等常用软件无缝对接。

MathType,一款专业的数学公式编辑器,以其强大的功能和友好的用户界面,在科研、教学等领域广受欢迎。它支持丰富的数学符号和公式模板,满足不同用户的需求。同时,MathType还提供了多种输出格式,方便与其他文…

基于YOLOv9+pyside的安检仪x光危险物物品检测(有ui)

安全检查在公共场所确保人身安全的关键环节,不可或缺。X光安检机作为必要工具,在此过程中发挥着重要作用。然而,其依赖人工监控和判断成像的特性限制了其应用效能。本文以此为出发点,探索了基于Torch框架的YOLO算法在安检X光图像中…

在linux 下交叉编译gdb 8.1.1 ,生成 windows下的exe程序

在Linux环境下进行交叉编译,生成适用于Windows的可执行程序(.exe),需要使用交叉编译工具链。对于特定的GDB版本(如8.1.1),你需要确保有适用于目标平台(Windows)的交叉编译工具链。以下是一些基本步骤和考虑因素: 获取GDB源码:首先,需要下载GDB 8.1.1的源码包。你可…

《数据结构与算法基础 by王卓老师》学习笔记——类C语言有关操作补充

1.元素类型说明 2.数组定义 3.C语言的内存动态分配 4..C中的参数传递 5.传值方式 6.传地址方式 例子

【计算机网络】期末复习(2)

目录 第一章:概述 第二章:物理层 第三章:数据链路层 第四章:网络层 第五章:传输层 第一章:概述 三大类网络 (1)电信网络 (2)有线电视网络 &#xff0…

快速了解GPT-4o和GPT-4区别

GPT-4o简介 在5月14日的OpenAI举行春季发布会上,OpenAI在活动中发布了新旗舰模型“GPT-4o”!据OpenAI首席技术官穆里穆拉蒂(Muri Murati)介绍,GPT-4o在继承GPT-4强大智能的同时,进一步提升了文本、图像及语…

px、em、rem、rpx 作用和用法详解

px px像素(Pixel)。相对长度单位。像素px是相对于显示器屏幕分辨率而言的。 PX特点 IE无法调整那些使用px作为单位的字体大小; 国外的大部分网站能够调整的原因在于其使用了em或rem作为字体单位; Firefox能够调整px和em&#xff…

JVM原理(四):JVM垃圾收集算法与分代收集理论

从如何判定消亡的角度出发,垃圾收集算法可以划分为“引用计数式垃圾收集”和“追踪式垃圾收集”两大类。 本文主要介绍的是追踪式垃圾收集。 1. 分代收集理论 当代垃圾收集器大多遵循“分代收集”的理论进行设计,它建立在两个假说之上: 弱分…

C++11中如何创建线程

在C11中&#xff0c;创建线程变得非常简单和标准化&#xff0c;因为C11引入了线程库&#xff08;<thread>&#xff09;。这个库提供了std::thread类&#xff0c;使得创建和管理线程变得更加直接和方便。 以下是如何在C11中创建线程的基本步骤&#xff1a; 包含线程库&a…

重建控制文件

----------------------------------------------------以下是单节点--------------------------------------------------- 一、现象 1、某次测试环境数据库重启&#xff0c;报如下错误 ORA-38760: This database instance failed to turn on flashback database 启动到mo…

C# 特性 Attribute 反射 Reflection 元数据 Metadata 未完

在C#中&#xff0c;元数据&#xff08;Metadata&#xff09;是指与程序代码本身相关的数据&#xff0c;这些数据提供了代码的额外信息&#xff0c;但并不直接影响代码的执行。元数据在.NET框架中扮演着重要的角色&#xff0c;以下是一些常见的元数据类型和它们的用途&#xff1…

vue插槽的简单使用

默认插槽 1.在Category中创建插槽 <slot>默认值<slot/> 2.在App中使用 <Category tittle"美食"> <ul ><li v-for"(l,index) in foods" :key"index">{{l}}</li></ul> </Category> 3.运行后的…

【IC验证】UVM实验lab05

1. 寄存器建模的要点和顺序 1.1 寄存器创建 定义单个uvm_reg&#xff0c;各个域的确定&#xff0c;并利用configure函数来配置属性&#xff1b; class ctrl_reg extends uvm_reg;uvm_object_utils(ctrl_reg)/*uvm_reg;uvm_mem;uvm_reg_map;uvm_reg_block都继承于uvm_object类…

八、浏览器同源策略

上一篇&#x1f449;: 浏览器垃圾回收机制 文章目录 浏览器同源策略1.同源策略的定义2.同源策略的作用3.同源策略的限制范围4.解决跨域方案汇总1.CORS&#xff08;跨源资源共享&#xff09;2.JSONP3.postMessage 跨域4.Nginx代理跨域5.Node.js中间件代理跨域6.document.domain…

【教学类65-04】20240625秘密花园涂色书04(通义万相)(图纸16:9,A4横板1张,一大168张纸168份)

背景需求 【教学类65-01】20240622秘密花园涂色书01&#xff08;通义万相&#xff09;&#xff08;A4横版2张&#xff0c;一大3小 38张纸76份&#xff09;-CSDN博客文章浏览阅读118次。【教学类65-01】20240622秘密花园涂色书01&#xff08;通义万相&#xff09;&#xff08;A…