Appearance
More NP-Complete Problems
这一讲继续 NP-completeness,重点不是重新定义 P、NP,而是练习如何写 reduction proof,以及如何从已有 NP-complete 问题推出更多 NP-complete problems。
这份笔记先补充课件中的 reduction graph,再补上一个很常用的基本归约:
Reduction Graph
课件中的 reduction graph 表达的是:从已经知道的 NP-complete 问题出发,沿着 Karp reduction 的箭头,可以证明更多问题 NP-complete。
可以直接看课件中的 reduction graph:

这里每条箭头:
表示:
也就是:如果能在多项式时间内解决
结合 Cook-Levin Theorem:
以及 reduction 的传递性,就能得到图中后续问题的 NP-hardness。若再证明目标问题本身在 NP 中,就得到 NP-completeness。
常见主线包括:
以及 Hamiltonian path / cycle 相关归约。
How to Prove NP-completeness
证明一个问题
- 证明
。 - 选一个已知 NP-complete 问题
。 - 给出多项式时间归约:
- 证明 yes/no instance 被正确保持:
一个常见错误是把方向写反。要证明
Independent Set Reduces to Vertex Cover
这一节补充:
Problems
Independent Set:
给定无向图
和整数 ,判断 中是否存在大小为 的 independent set。
一个点集
Vertex Cover:
给定无向图
和整数 ,判断 中是否存在大小为 的 vertex cover。
一个点集
Key Observation
核心观察是:
直观解释:
- 如果
是 independent set,那么 内部没有边; - 所以任意一条边不可能两个端点都落在
; - 因此每条边至少有一个端点在
; - 这正说明
是 vertex cover。
反过来,如果
Reduction
给定 Independent Set instance:
构造 Vertex Cover instance:
也就是说,图不变,只把参数从
这个构造显然可以在多项式时间内完成。
Correctness
先证 yes instance 会变成 yes instance。
如果
是 vertex cover,并且大小是:
所以构造出的 Vertex Cover instance:
是 yes instance。
再证反方向。
如果构造出的 Vertex Cover instance 是 yes,也就是
是 independent set,并且大小是:
所以原来的 Independent Set instance:
也是 yes instance。
因此 no instance 也会变成 no instance。
反证:如果原来的 Independent Set instance
所以:
因此:
即:
Why This Proves Vertex Cover Is NP-complete
上一讲已经有:
并且
现在又有:
因此
还需要证明:
certificate 可以是一个点集
; - 对每条边
,检查是否 或 。
这可以在多项式时间内完成。
所以:
Independent Set Reduces to Clique
证明:
Clique
给定无向图
和整数 ,判断 是否存在大小为 的 clique。
clique 指任意两个点之间都有边的点集。
Key Observation
令
中有边的点对,在 中没有边; 中没有边的点对,在 中有边。
那么:
Reduction
给定 Independent Set instance:
构造 Clique instance:
Correctness
先证 yes instance 会变成 yes instance。
如果
因此:
再证 no instance 会变成 no instance。
反证:假设
因为
这说明
所以:
综上:
因此:
如果 Clique 也在 NP,那么 Clique 是 NP-complete。
Vertex Cover Reduces to Dominating Set
证明:
这里使用常见的 decision 版本:判断是否存在大小 至多 为
如果
Dominating Set
Dominating Set Problem:
给定无向图
和整数 ,判断 是否存在大小至多为 的 dominating set。
一个点集
换句话说,
Construction
给定 Vertex Cover instance:
构造一个 Dominating Set instance:
其中
- 保留
中的每个原始点 ; - 把所有原始点
两两相连,使它们形成一个 clique; - 对
中每条边 ,新增一个点 ; - 只把
连到这条边的两个端点 和 。
也就是说:
并且每个新增点
这个构造显然可以在多项式时间内完成。
Key Observation
核心观察是:
- 原始点
被做成了 clique,所以只要选中任意一个原始点,就能 dominate 所有原始点; - 每个新增点
只能被 、 或它自己 dominate; - 如果 dominating set 里选了某个新增点
,可以把它换成 ,不会让 domination 变差。
因此,如果
在这种情况下,要 dominate 每个新增点
这正是 vertex cover 的条件。
Correctness
先证正方向。
如果
- 在非平凡情形下
非空;因为 ,而 在 中是 clique,所以 dominate 所有原始点; - 对每个新增点
,因为 是 vertex cover,所以 至少有一个在 中,因此 也被 dominate。
所以:
再证反方向。
如果
由于
因此
所以:
因此 no instance 也会变成 no instance。
反证:如果原来的 Vertex Cover instance
所以:
综上:
即:
由于
Take Home Messages
- Reduction graph 的箭头方向表示
,即 至少和 一样难。 - 证明目标问题 NP-complete 时,必须从已知 NP-complete 问题归约到目标问题。
的核心是补集关系:
- 输入转换非常简单:
- 由于
是 NP-complete,且 ,所以 也是 NP-complete。 的核心是:给每条边新增一个点,逼迫 dominating set 至少选择这条边的一个端点。
Cook-Levin Theorem
Cook-Levin Theorem:
SAT is NP-complete.
也就是说:
; - 对任意
,都有:
Proof Sketch
已经知道
设
对于 instance
- 如果
是 yes instance,则存在 polynomial length certificate ,使得 accepts; - 如果
是 no instance,则所有 都不能让 accepts。
Cook-Levin 的核心想法:
用一个 Boolean formula 模拟 verifier
在输入 上的整段计算过程。
可以把 Turing Machine 的计算过程写成 tableau:
| 时间步 | tape 内容 | head 位置 | state |
|---|---|---|---|
| step 0 | 输入 | 初始位置 | start |
| step 1 | 下一步 tape | 新位置 | 新状态 |
| final step | 最终 tape | 最终位置 | accept/reject |
然后为 tableau 中的每个 cell、每个时间步、每个状态建立 Boolean variables,并用 CNF 约束表达:
- step 0 中固定了输入
; - certificate
可以自由选择; - final step 必须是 accept;
- 每一步到下一步必须符合
的 transition function。
这些约束可以在 polynomial size 内写成 CNF formula。
于是构造出的 formula 可满足,当且仅当存在 certificate
因此:
这给出了:
因为
More NP-complete Problems
有了 Cook-Levin Theorem 和 reduction 传递性,可以证明大量问题都是 NP-complete。
课件中涉及的典型关系:
还包括:
以及:
因为 SAT 是 NP-complete,如果我们能从 SAT 一路 reduce 到某个问题
3SAT Reduces to Hamiltonian Path
目标是证明:
课件里常用一个中间问题:
Directed Hamiltonian Path
Directed Hamiltonian Path:
给定有向图
、source 和 sink ,判断是否存在一条从 到 的 directed path,恰好经过每个顶点一次。
Step 1: 3SAT to Directed Hamiltonian Path
给定一个 3SAT instance:
变量为:
我们构造一个有向图,使得:
构造包含两类 gadget。
Variable Gadget
对每个变量
这个 gadget 有一个 entrance 和一个 exit,中间放
每个 clause
具体连边可以这样做。 设这个 gadget 的 entrance 是
gadget 的作用是让 Hamiltonian path 在其中只有两种自然走法:
- 从左到右走,表示
; - 从右到左走,表示
。
然后把所有 variable gadget 串起来:
所以一条从
Clause Gadget
对每个 clause
如果 literal
这个 detour 只能在从左到右走时使用,也就是当
如果 literal
这个 detour 只能在从右到左走时使用,也就是当
直观上:
clause vertex
只有在某个让 为 true 的 literal 处,才能被 Hamiltonian path 顺路访问。
构造的顶点数和边数都是
Correctness: 3SAT to Directed Hamiltonian Path
先证 yes instance 会变成 yes instance。
如果
- 若
,就从左到右穿过 ; - 若
,就从右到左穿过 。
每个 clause
这样路径:
- 从
走到 ; - 每个 variable gadget 的中间顶点都访问一次;
- 每个 clause vertex
也通过某个 true literal 的 detour 访问一次。
所以
再证 no instance 会变成 no instance。
反证:假设
这条路径必须依次穿过所有 variable gadget。 在每个 variable gadget 中,它只能选择一种方向:
- 左到右,记为
; - 右到左,记为
。
于是 Hamiltonian path 给出了一个变量赋值。
又因为这条路径是 Hamiltonian path,所以每个 clause vertex
所以每个 clause
因此:
综上:
Step 2: Directed Hamiltonian Path to Hamiltonian Path
现在把有向版本 reduce 到普通的无向 Hamiltonian Path。
给定 Directed Hamiltonian Path instance:
先删掉所有进入
对每个有向图中的顶点
并加入两条无向边:
对每条有向边:
在无向图中加入一条边:
得到无向图
这个构造也是多项式时间的。
Correctness: Directed to Undirected
先证 yes instance 会变成 yes instance。
如果原图中有 directed Hamiltonian path:
那么在
这是一条经过
再证 no instance 会变成 no instance。
反证:假设
注意
在每个 vertex gadget 里,
又因为整条 path 从
而不同 gadget 之间的边只连接某个
于是整条 path 的结构只能是:
而 gadget 之间的边都是由原来的 directed edge 产生的:
因此,把每个三点 gadget 收缩回一个顶点,就得到原有向图中一条从
所以如果
因此:
Conclusion
已经知道:
并且:
所以 Hamiltonian Path 是 NP-hard。
另一方面,Hamiltonian Path 在 NP 中:certificate 是一个顶点序列,verifier 只需要检查它是否每个顶点恰好出现一次,并且相邻顶点之间都有边。 这个检查可以在多项式时间内完成。
因此:
Consequence of NP-completeness
重要定理:
如果
是 NP-complete,并且 ,那么 。
证明:
对任意
如果
因此任意
而本来就有:
所以:
这就是为什么只要证明一个 NP-complete 问题有 polynomial-time algorithm,就会解决整个 P vs NP 问题。
NP-intermediate
如果:
Ladner's Theorem 说明:存在一些 NP 问题既不在 P 中,也不是 NP-complete。
这些问题称为 NP-intermediate。
常见候选包括:
- Graph Isomorphism;
- Factoring。
注意:它们只是常见候选,不等于已经证明为 NP-intermediate。
NP-hard vs NP-complete
NP-hard 和 NP-complete 的区别:
| 概念 | 要求 | 是否必须在 NP 中 |
|---|---|---|
| NP-hard | 所有 NP 问题都能 reduce 到它 | 不必须 |
| NP-complete | NP-hard 且自身在 NP 中 | 必须 |
所以:
NP-hard 可以用于 optimization problem,例如:
- Maximum Independent Set is NP-hard;
- Minimum Vertex Cover is NP-hard;
- Max-3SAT is NP-hard;
- Finding a longest simple path is NP-hard。
这些 optimization problem 不一定本身是 decision problem,因此通常说 NP-hard,而不是直接说 NP-complete。
How to Prove a Problem Is NP-complete
证明一个新问题
- 证明
: - 给出 certificate;
- 说明 verifier 可以 polynomial time 检查。
- 选择一个已知 NP-complete 问题
。 - 构造 polynomial-time reduction:
- 证明 yes/no 保持一致:
注意方向非常重要:
要证明
难,需要把已知难问题 reduce 到 ,不是把 reduce 到已知难问题。
Take Home Messages
这一讲最重要的是几组定义和归约方向。
- P 是 polynomial time 可解的 decision problems。
- NP 是 yes instance 有 polynomial size certificate,并且可以 polynomial time verify 的 decision problems。
,但是否 仍然未知。 - Karp reduction
表示:会解 就会解 ,所以 至少和 一样难。 - SAT 是 NP-complete,这是 Cook-Levin Theorem。
- 通过 reduction 和传递性,可以证明 3SAT、Independent Set、Vertex Cover、Clique、Subset Sum、Hamiltonian Path 等问题都是 NP-complete。
- 证明 NP-complete 的标准套路是:先证明在 NP,再从一个已知 NP-complete 问题归约过来。
- 如果任何一个 NP-complete 问题属于 P,那么
。 - NP-hard 不要求问题本身在 NP 中;NP-complete 必须同时是 NP-hard 且在 NP 中。