一、多项式规约
1、概念及性质
\quad 多项式时间归约:如果问题X和问题Y满足以下两条性质,那么问题X可以在多项式时间归约到问题Y。
- 问题X可以通过多项式时间的基本运算步骤转换为问题Y;
- 问题X多项式次调用求解问题Y的算法
记为 X ≤ P Y X\le_{P}Y X≤PY。三点性质: - 若 X ≤ P Y X\le_{P}Y X≤PY, Y Y Y能在多项式时间内求解,则 X X X也能在多项式时间内求解
- 若 X ≤ P Y X\le_{P}Y X≤PY, X X X不能在多项式时间内求解,则 Y Y Y也不能在多项式内求解
- 若 X ≤ P Y X\le_{P}Y X≤PY且 Y ≤ P X Y\le_{P}X Y≤PX,则 X , Y X,Y X,Y多项式等价,记为 X ≡ P Y X ≡_{P} Y X≡PY。 X , Y X,Y X,Y中一方能在多项式时间内求解则另一方也能在多项式时间内求解。
2、点独立集和点覆盖
\quad
点独立集:在图
G
G
G中选出若干个顶点,这些顶点之间没有边相连接,称为点独立集。一个图中所有点独立集中点数最多的集合称为图的最大点独立集。
\quad
点覆盖:在图
G
G
G中选出若干个顶点组成集合
S
S
S,使得图中每一条边的两个顶点都至少有一个顶点在
S
S
S中,则集合
S
S
S称为图的点覆盖集。一个图中所有的点覆盖集中点数最少的集合称为图的最小点覆盖。
证明: 点 独 立 集 ≡ P 点 覆 盖 点独立集 ≡_{P}点覆盖 点独立集≡P点覆盖
\quad
由
S
S
S是点独立集证明
V
−
S
V-S
V−S是点覆盖
\quad
证明:设
S
S
S是大小为
k
k
k的点独立集。则对于图中的任意一条边
(
u
,
v
)
∈
E
(u,v)\in E
(u,v)∈E,因为
S
S
S是点独立集,故
u
,
v
u,v
u,v不能全在
S
S
S中,即
u
,
v
u,v
u,v至少有一个在
V
−
S
V-S
V−S中。因此,集合
V
−
S
V-S
V−S能保证对于图中每一条边,该边都至少有一个顶点在
V
−
S
V-S
V−S中,
V
−
S
V-S
V−S是图的点覆盖。
\quad
由
V
−
S
V-S
V−S是点覆盖证明
S
S
S是点独立集
\quad
证明:设
V
−
S
V-S
V−S是大小为
n
−
k
n-k
n−k的点覆盖。则对于图中的任意一条边
(
u
,
v
)
∈
E
(u,v)\in E
(u,v)∈E,
(
u
,
v
)
(u,v)
(u,v)至少有一个顶点在
V
−
S
V-S
V−S中,故在
S
S
S中,
(
u
,
v
)
(u,v)
(u,v)最多有一个顶点在
S
S
S中。因此,
S
S
S是图的点独立集。
\quad
综上,
点
独
立
集
≡
P
点
覆
盖
点独立集 ≡_{P}点覆盖
点独立集≡P点覆盖。
3、集合覆盖问题和顶点覆盖问题
\quad
问题说明:给定一个集合
U
U
U和若干
U
U
U的子集合
S
n
S_n
Sn,问能否在
S
n
S_n
Sn中找出
k
k
k个集合,使得这
k
k
k个集合的并为
U
U
U。如下图所示,
集合
S
c
.
S
f
S_c.S_f
Sc.Sf的并为集合
U
U
U。
\quad
定义了集合覆盖问题,我们可以将顶点覆盖问题规约到这个问题上去。即证明
顶
点
覆
盖
≤
P
集
合
覆
盖
顶点覆盖 \le_{P} 集合覆盖
顶点覆盖≤P集合覆盖。证明这个问题只需证明对于每一个给定的顶点覆盖问题都可以在集合覆盖问题中找到对应的实例,证明二者等价即可,难点在于构造对应的实例。这个问题的证明可以通过如下构造来完成:
- 顶点覆盖问题即为对于给定的图 G = ( V , E ) G=(V,E) G=(V,E),能否找到 k k k个点,使得图中每条边都至少有一个点在这 k k k个点中。
- 对于顶点问题做如下转化:给定一个集合 U U U, U U U中元素为图中的每条边。对于图中每个顶点 i i i,我们都建立一个集合 S i S_i Si, S i S_i Si中元素为与顶点 i i i相连的边。这样,问题就转化成了在集合 S S S中能否找到 k k k个集合,使得这些集合的并为 U U U。
- 举个例子,下图是一个6个顶点,7条边的图。对于左边的图而言,当
k
=
2
k=2
k=2时,
c
,
f
{c,f}
c,f为图的点覆盖;对于右边转化后的集合而言,
S
c
,
S
f
S_c,S_f
Sc,Sf的并集为
U
U
U。
\quad 这样,就证明了顶点覆盖 可以多项式规约到集合覆盖。但集合覆盖问题能多项式规约到顶点覆盖问题吗?答案是否定的,因为对于任意的集合 S i S_i Si而言,每个元素出现次数可能不是偶数,对于图而言,每条边出现次数一定是偶数,故这种情况下无法通过构图来表示任意一种集合,因此集合覆盖无法规约到顶点覆盖。
4、可满足性问题(SAT)和3-SAT
\quad
可满足性问题定义:对于给定的由二元bool变量构成的表达式,例如
Φ
=
C
1
∧
C
2
∧
C
3
∧
C
4
,
C
i
=
x
1
∨
x
2
‾
∨
x
3
\Phi=C_1\wedge C_2 \wedge C_3 \wedge C_4,C_i=x_1\vee \overline{x_2} \vee x_3
Φ=C1∧C2∧C3∧C4,Ci=x1∨x2∨x3。
x
i
x_i
xi为bool变量,目的是求解合适的
x
i
x_i
xi的值,使得
Φ
=
t
r
u
e
\Phi=true
Φ=true。
∧
\wedge
∧表示“与”,
∨
\vee
∨表示"并",
x
‾
\overline{x}
x表示
x
x
x的非。由此可知,要使得
Φ
=
t
r
u
e
\Phi=true
Φ=true,那么每个
C
i
=
t
r
u
e
C_i=true
Ci=true,进而得到每个
C
i
C_i
Ci中二元变量
x
i
x_i
xi至少有一个为
t
r
u
e
true
true。
\quad
3-SAT:当每个
C
i
C_i
Ci包含3个bool变量时构成的逻辑表达式
Φ
\Phi
Φ,并求解各个bool变量使得
Φ
=
t
r
u
e
\Phi=true
Φ=true的问题称为3-SAT问题。如下图即为一个3-SAT问题及其的一个解。
证明: 3 − S A T ≤ P 点 独 立 集 问 题 3-SAT\le_{P}点独立集问题 3−SAT≤P点独立集问题
\quad
只需证明对于每一个给定的3-SAT问题,都能给出一个对应的图
G
G
G的实例,使得这个图有大小为
k
k
k的点独立集。
构造图的方法如下:
- 对于 Φ \Phi Φ中每一个 C i C_i Ci,都用三个顶点代表 C i C_i Ci中每个变量,并用边将这三个顶点两两连接
- 对于某个变量和该变量的取反,用边连接起来,表示这两个变量所对应的顶点不能在一个点独立集中
定理:
Φ
=
t
r
u
e
\Phi=true
Φ=true等价于
G
G
G有大小为
k
=
∣
Φ
∣
k=|\Phi|
k=∣Φ∣的点独立集。
证明:若
Φ
=
t
r
u
e
\Phi=true
Φ=true,则
G
G
G的每一个三个顶点构成的团里至少有一个顶点是点独立集中的一员,故
G
G
G有大小为
k
=
∣
Φ
∣
k=|\Phi|
k=∣Φ∣的点独立集。若
G
G
G的每一个三个顶点构成的团里至少有一个顶点是点独立集中的一员,则每个
Φ
\Phi
Φ中的每个
C
i
C_i
Ci至少一个变量为
t
r
u
e
true
true,即每个
C
i
=
t
r
u
e
C_i=true
Ci=true,进而
Φ
=
t
r
u
e
\Phi=true
Φ=true。
5、自规约问题
\quad 可自规约问题指的是该问题的优化问题可以多项式规约到该问题的决策问题的这一类问题。比如图的最小顶点覆盖问题可以多项式规约到图是否有小于 k k k个顶点的顶点覆盖。证明如下:
- 从1开始,依次查找该图有没有 k ∗ k^* k∗个顶点的顶点覆盖(这样得到的第一次满足的 k ∗ k^* k∗的值就是该图最小顶点覆盖的数目)
- 从图中选出一个点 v v v,若去除该点后图的顶点覆盖数目变为 k ∗ − 1 k^*-1 k∗−1,则 v v v是原图顶点覆盖中的一员,反之则不是
- 在 G − v G-{v} G−v中递归执行上述两步。
6、规约问题总结
\quad
规约的传递性:若
X
≤
P
Y
,
Y
≤
P
Z
X\le_{P}Y,Y\le_{P}Z
X≤PY,Y≤PZ,则
X
≤
P
Z
X\le_{P}Z
X≤PZ。
\quad
对上面规约问题做一个总结,我们已经证明了以下规约问题:
- 点 独 立 集 问 题 ≡ P 顶 点 覆 盖 问 题 点独立集问题≡_{P}顶点覆盖问题 点独立集问题≡P顶点覆盖问题
- 顶 点 覆 盖 问 题 ≤ P 集 合 覆 盖 问 题 顶点覆盖问题\le_{P}集合覆盖问题 顶点覆盖问题≤P集合覆盖问题
- 3 − S A T ≤ P 点 独 立 集 问 题 3-SAT\le_{P}点独立集问题 3−SAT≤P点独立集问题
- 3 − S A T ≤ P 点 独 立 集 问 题 ≤ P 顶 点 覆 盖 问 题 ≤ P 集 合 覆 盖 问 题 3-SAT\le_{P}点独立集问题\le_{P}顶点覆盖问题\le_{P}集合覆盖问题 3−SAT≤P点独立集问题≤P顶点覆盖问题≤P集合覆盖问题
- 某个大佬证明了 3 − S A T 3-SAT 3−SAT问题是NPC问题,因此上诉所有问题均为NPC问题
二、P,NP和NPC问题
1、P问题
\quad
能在多项式时间内解决的问题称为P问题。比如:素数问题。
素数问题:任意给定一个数字
s
s
s,求
s
s
s是否是素数的算法。AKS素数测试(又被称为 Agrawal–Kayal–Saxena素数测试 和 Cyclotomic AKS test)是一个决定型素数测试算法 ,由三个来自印度坎普尔理工学院的计算机科学家,Manindra Agrawal、Neeraj Kayal和Nitin Saxena,在2002年8月6日发表于一篇题为素数属于P的论文。
2、NP问题
\quad 能在多项式时间内验证的问题称为NP问题。比如:对于3-SAT问题,给出其中一个解法,让你判断这个解法是否是原问题的一个解。可见所有的P问题都可以在多项式时间内去验证,因此,P问题是NP问题的子集。
3、EXP问题
\quad 能在指数时间复杂度内解决的问题。NP问题是EXP问题的子集。
4、普遍认为 P ≠ N P P\neq NP P=NP
\quad
目前还不能证明
P
=
N
P
P=NP
P=NP或者
P
≠
N
P
P \neq NP
P=NP。
5、NPC问题
\quad
找出一个已被证明的NPC问题(SAT),所有能规约到这个NPC问题的问题统称为NPC问题。
\quad
定理:若
X
X
X是NPC问题,
Y
Y
Y是NP问题,
X
≤
P
Y
X \le_{P} Y
X≤PY,则
Y
Y
Y是NPC问题。
6、证明一个问题Y是NPC问题
- 证明Y是NP问题
- 找一个已知的NPC问题X,证明 X ≤ P Y X\le_{P}Y X≤PY,则Y是NPC问题
\quad
这几个大佬证明了下列常见问题可以多项式相互归约,因为cook证明了SAT问题是NPC问题,又由于归约的传递性,可得下列问题均为NPC问题。
7、一些有趣的tips
\quad 大部分NP问题不是P问题就是NPC问题,但有些NP问题既不是P问题也不是NPC问题,例如(因子分解,同构图等)。Lader在1975年证明了在 P ≠ N P P\neq NP P=NP的条件下,一定会存在某些NP问题既不是P问题也不是NPC问题。
三、经典的NPC问题
1、序列问题
\quad
在之前,我们已经证明了上图中最左边那一条线,现在我们要证明第二条路,即
3
−
S
A
T
≤
P
有
向
图
的
H
a
m
i
l
t
o
n
圈
≤
P
无
向
图
的
H
a
m
i
l
t
o
n
圈
≤
P
T
S
P
问
题
3-SAT \le_{P} 有向图的Hamilton圈 \le_{P} 无向图的Hamilton圈 \le_{P} TSP问题
3−SAT≤P有向图的Hamilton圈≤P无向图的Hamilton圈≤PTSP问题。
\quad
哈密尔顿圈:对于给定的图
G
G
G,问是否存在一条路,使得经过图
G
G
G所有顶点并且每个顶点只经过一次。
证明: 有 向 图 的 H a m i l t o n 圈 ≤ P 无 向 图 的 H a m i l t o n 圈 有向图的Hamilton圈 \le_{P} 无向图的Hamilton圈 有向图的Hamilton圈≤P无向图的Hamilton圈
step1:根据任意一个有向图
G
G
G,创建对应的无向图实例
G
′
G'
G′。创建方法如下:
step2:正向证明。假设
G
G
G中有Hamilton圈,则
G
′
G'
G′中也有Hamilton圈
step3:反向证明。假设
G
′
G'
G′中有Hamilton圈,则该Hamilton圈有两种序列模式:黑白绿黑白绿…;黑绿白黑绿白…。这两种模式中黑色顶点顺序对应原图Hamilton圈的正序或者逆序,因此
G
G
G也有Hamilton圈。
证明: 3 − S A T ≤ P 有 向 图 的 H a m i l t o n 圈 3-SAT \le_{P} 有向图的Hamilton圈 3−SAT≤P有向图的Hamilton圈
\quad 证明太难暂且放过。
证明: 无 向 图 的 H a m i l t o n 圈 ≤ P T S P 问 题 无向图的Hamilton圈 \le_{P} TSP问题 无向图的Hamilton圈≤PTSP问题
step1:构造实例。对于图 G = ( V , E ) G=(V,E) G=(V,E),创建 n = ∣ V ∣ n=|V| n=∣V∣个顶点的图 G ′ G' G′, G ′ G' G′中两两边之间的权重 d ( u , v ) d(u,v) d(u,v)如下:
- 若 ( u , v ) ∈ E (u,v)\in E (u,v)∈E,则 d ( u , v ) = 1 d(u,v)=1 d(u,v)=1
- 若 ( u , v ) ∉ E (u,v)\notin E (u,v)∈/E,则 d ( u , v ) = 2 d(u,v)=2 d(u,v)=2
step2:正向证明。如果
G
G
G中有Hamilton圈,则该圈即为
G
′
G'
G′中的TSP路径。
step3:反向证明。如果
G
′
G'
G′中有TSP路径,则该路径长度为n,该路径即为
G
G
G的Hamilton圈。
2、图着色问题
\quad 这是上图第三条路线的证明,包括 3 − S A T ≤ P 图 三 点 着 色 ≤ P 平 面 图 的 三 点 着 色 3-SAT \le_{P} 图三点着色 \le_{P}平面图的三点着色 3−SAT≤P图三点着色≤P平面图的三点着色。
证明: 3 − S A T ≤ P 图 三 点 着 色 3-SAT \le_{P} 图三点着色 3−SAT≤P图三点着色
\quad 此证明太难直接放弃
3、数字问题
\quad 上图中最右边那条线的证明,包括 3 − S A T ≤ P 子 数 组 和 ≤ P 调 度 问 题 3-SAT\le_{P}子数组和\le_{P}调度问题 3−SAT≤P子数组和≤P调度问题
证明: 3 − S A T ≤ P 子 数 组 和 3-SAT\le_{P}子数组和 3−SAT≤P子数组和
\quad 子数组和问题:给出一个有n个数的数组 { w 1 , w 2 , ⋯ , w n } \{w_1,w_2,\cdots,w_n\} {w1,w2,⋯,wn}和一个数 W W W,问存不存在该数组的子数组使得子数组和为 W W W。
证明: 子 数 组 和 问 题 ≤ P P a r t i t i o n 问 题 子数组和问题\le_{P}Partition问题 子数组和问题≤PPartition问题
\quad Partition问题:给出 m m m个数 { v 1 , v 2 , ⋯ , v m } \{v_1,v_2,\cdots,v_m\} {v1,v2,⋯,vm},能将这些数划分为两个子集,使得这两个子集中数的和相同。
- 构造实例:给出子数组和实例 { w 1 , w 2 , ⋯ , w n } \{w_1,w_2,\cdots,w_n\} {w1,w2,⋯,wn}和其相加的目标 W W W,我们可以这样构造Partition的实例:Partition实例包含 n = m + 2 n=m+2 n=m+2个元素, v 1 = w 1 , ⋯ , v n = w n , v n + 1 = 2 ∑ i ( w i ) − W , v n + 2 = ∑ i ( w i ) + W v_1=w_1,\cdots,v_n=w_n,v_{n+1}=2\sum_i(w_i)-W,v_{n+2}=\sum_i(w_i)+W v1=w1,⋯,vn=wn,vn+1=2∑i(wi)−W,vn+2=∑i(wi)+W。
- 正向证明:若子数组和问题中存在某个子数组subsetA的和为 W W W,则另一个数组subsetB和为 ∑ i ( w i ) − W \sum_i(w_i)-W ∑i(wi)−W。 s u b s e t A + v n + 1 = 2 ∑ i ( w i ) = s u b s e t B + v n + 2 subsetA+v_{n+1}=2\sum_i(w_i)=subsetB+v_{n+2} subsetA+vn+1=2∑i(wi)=subsetB+vn+2,故而Partition问题得到解决。
- 反向证明:若Partition问题实例能分为两个和相等的子集 s u b s e t A , s u b s e t B subsetA,subsetB subsetA,subsetB,则 v n + 1 v_{n+1} vn+1和 v n + 2 v_{n+2} vn+2一定分属于这两个子集,故而 s u b s e t A − v n + 1 = W subsetA-v_{n+1}=W subsetA−vn+1=W为原子数组和问题的解。
证明: 子 数 组 和 问 题 ≤ P 调 度 问 题 子数组和问题\le_{P}调度问题 子数组和问题≤P调度问题
\quad 调度问题:给出n个任务,每个任务 j j j包含可以开始处理的时间 r j r_j rj,处理任务所需时间 t j t_j tj,任务的截至时间 d j d_j dj。这些任务在一个机器上运行,且每个任务必须在连续的 t j t_j tj时间内运行,问是否存在一种安排方式使得这些任务都能在 [ r j , d j ] [r_j,d_j] [rj,dj]时间内完成。
- 构造实例:给出子数组和实例 { w 1 , w 2 , ⋯ , w n } \{w_1,w_2,\cdots,w_n\} {w1,w2,⋯,wn}和其相加的目标 W W W,我们可以这样构造调度问题的实例:创建n个任务的处理时间 t j = w j t_j=w_j tj=wj,开始时间 r j = 0 r_j=0 rj=0,没有截至时间 ( d j = 1 + ∑ j w j ) (d_j=1+\sum_jw_j) (dj=1+∑jwj)。再额外创建一个任务 0 0 0,这个任务开始时间为 t 0 = 1 t_0=1 t0=1,开始时间为 W W W,结束时间为 W + 1 W+1 W+1。
- 如果子数组和问题能找到解,即有一个 s u m ( s u b s e t ) = W sum(subset)=W sum(subset)=W,则对应调度问题一定有解,将任务0放在 [ W , W + 1 ] [W,W+1] [W,W+1]时间段内即可。
- 如果调度问题有解,那么任务0只能在 [ W , W + 1 ] [W,W+1] [W,W+1]时间段内完成,则有若干任务刚好覆盖 [ 0 , W ] [0,W] [0,W],即原子数组和问题一定有 s u m ( s u b s e t ) = W sum(subset)=W sum(subset)=W。