Appearance
P, NP, NP-Completeness, and Reductions
这一讲进入计算复杂性理论的核心主题:P、NP、NP-hard、NP-complete,以及 polynomial-time reduction。
主线是:
- 先把问题限制为 decision problem;
- 用 Turing Machine 给“多项式时间算法”一个形式化模型;
- 定义复杂度类 P 和 NP;
- 用 Karp reduction 比较问题难度;
- 证明 SAT、3SAT、Independent Set、Vertex Cover 等问题之间的关系;
- 理解 Cook-Levin Theorem 和 NP-completeness 的意义。
Famous Hard Problems
很多组合优化问题看起来都很自然,但目前没有已知的多项式时间算法。课件先列出几个典型 NP-hard / NP-complete 问题。
SAT
SAT 是 Boolean Satisfiability Problem。
一个 Boolean formula 由变量、括号和逻辑运算构成:
- AND:
- OR:
- NOT:
一个公式是 CNF (conjunctive normal form),如果它是若干个 clause 的 AND;每个 clause 是若干 literal 的 OR。
literal 指:
- 变量
; - 或变量的否定
。
例如:
是 CNF formula。
SAT Problem:
给定一个 CNF formula
,判断是否存在一组变量赋值,使得 为 true。
Vertex Cover
给定无向图:
一个点集
Vertex Cover Problem:
给定无向图
和整数 ,判断 是否存在大小为 的 vertex cover。
更常见的 decision 版本也会写成“大小至多为
Independent Set
给定无向图
Independent Set Problem:
给定无向图
和整数 ,判断 是否存在大小为 的 independent set。
Subset Sum
Subset Sum Problem:
给定整数集合
和目标值 ,判断是否存在子集 ,使得
例如:
是 yes instance,因为:
但同一个
Hamiltonian Path
给定无向图
Hamiltonian Path Problem:
给定无向图
,判断图中是否存在 Hamiltonian path。
Decision Problems
这一讲只讨论两类事情:
- 输出 yes/no 的 decision problem;
- polynomial time 和非 polynomial time 的区分。
不再关心
Formal Definition
一个 decision problem 是函数:
其中:
是 alphabet,比如 ; 是长度为 的所有字符串; 是所有有限长度字符串; 是一个 instance。
如果:
则
如果:
则
例如 Vertex Cover 中,一个字符串
- 如果
有大小为 的 vertex cover,则 ; - 否则
。
Turing Machine
为了形式化“算法”和“多项式时间”,课件使用 Turing Machine。
在这门课里,可以把 Turing Machine 理解成一种理想化的计算机程序。它和普通程序在多项式时间计算能力上等价:
能被普通算法在 polynomial time 内计算的东西,也能被 Turing Machine 在 polynomial time 内计算。
Basic Components
一个 Turing Machine 包含:
| 组成 | 含义 |
|---|---|
| tape | 无限长纸带,由许多 cell 组成,每个 cell 存一个 alphabet |
| head | 指向当前读写位置,可以左移或右移 |
| states | 有限个状态,表示机器当前处在哪一步 |
| transition function | 根据当前状态和读到的符号,决定写什么、去哪个状态、向左还是向右移动 |
形式上可写成:
其中:
Start and Halt
Turing Machine 从特殊状态
它有两个特殊 halting states:
:accept; :reject。
当机器进入 halting state 时停止。
Polynomial Time TM
一个 Turing Machine
步以内停机。
这里
The Complexity Class P
P 是 polynomial-time decidable problems 的集合。
形式化定义:
一个 decision problem
属于 P,如果存在 polynomial time Turing Machine ,使得:
- 当
时, accepts ; - 当
时, rejects 。
也就是说,P 中的问题是我们认为“efficiently solvable”的问题。
Examples in P
PATH
PATH:
给定图
和两个点 ,判断是否存在从 到 的 path。
算法:从
所以:
k-FLOW
k-FLOW:
给定有向图
、源点 、汇点 、容量函数 和目标值 ,判断是否存在 value 至少为 的 flow。
可以用 Edmonds-Karp、Dinic 等最大流算法求最大流,再和
所以:
PRIME
PRIME:
给定一个以二进制编码的正整数
,判断 是否为素数。
Agrawal, Kayal and Saxena 在 2004 年给出 polynomial time primality test。
所以:
Searching Problems and Verification
很多算法课中的问题本质上是 searching problem:
- 给定 instance
; - 有很多可能的 solution
; - 如果存在一个正确的
,答案就是 yes; - 如果所有
都不正确,答案就是 no。
这类问题通常有两个任务:
| 任务 | 含义 |
|---|---|
| search | 找到一个正确解 |
| verify | 检查给定解是否正确 |
有些问题 search 容易,比如 shortest path、matching;有些问题 search 看起来很难,比如 Hamiltonian Path、Vertex Cover。
NP 试图刻画的是:
虽然不一定能快速找到解,但如果别人给你一个候选解,你能快速检查它是否正确。
The Complexity Class NP
NP 可以从 verifier 的角度定义。
形式化定义:
一个 decision problem
属于 NP,如果存在 polynomial time verifier ,使得:
- 如果
是 yes instance,则存在 polynomial size 的字符串 ,使得 accepts ; - 如果
是 no instance,则对所有 polynomial size 的字符串 , 都 rejects 。
这里的
直观理解:
- yes instance 必须有一个短证据;
- 证据给出来后,可以快速验证;
- no instance 不能有任何假证据骗过 verifier。
SAT、Vertex Cover、Independent Set、Subset Sum、Hamiltonian Path 都在 NP。
Verifier for Vertex Cover
对于 Vertex Cover:
- instance
; - certificate
是一个点集 。
verifier 做两件事:
- 检查
; - 检查每条边是否至少有一个端点在
中。
这显然可以在 polynomial time 内完成。
因此:
P Is Contained in NP
结论:
关键证明思路:
NP 只要求 yes instance 有一个短证据,并且这个证据可以在 polynomial time 内验证。
但如果一个问题已经在 P 中,那说明它有 polynomial time algorithm 可以直接判断 yes/no。 也就是说,它甚至不需要 certificate。
因此对任意
- 如果
是 yes instance,就取空证书 ,然后直接运行原来的 polynomial time algorithm,它会 accept; - 如果
是 no instance,不管给什么 certificate,原来的算法都会 reject。
所以 P 中的每个问题也满足 NP 的 verifier 定义:
因此:
P vs NP
核心开放问题:
换句话说:
如果一个答案可以快速验证,那么这个答案是否也可以快速找到?
目前大多数研究者相信:
直觉例子:
- 做一道难题可能很难;
- 但检查别人给出的完整解答是否正确,可能容易得多。
如果
Polynomial-Time Reduction
为了比较 NP 中不同问题的难度,需要 reduction。
核心思想:
如果我们能把问题
的任意 instance 快速转换成问题 的 instance,并且答案保持一致,那么只要会解 ,就会解 。
这时说:
读作:
也可以理解为:
至少和 一样难。
Formal Definition
decision problem
- 当输入
是 的 yes instance 时, 是 的 yes instance; - 当输入
是 的 no instance 时, 是 的 no instance。
等价地:
并且
注意:
- yes 必须变 yes;
- no 必须变 no;
- yes 变 no、no 变 yes 不是这里的 Karp reduction。
Reduction Gives Algorithms
如果:
且:
那么:
算法就是:
- 把
的输入 转成 的输入 ; - 用
的 polynomial time solver 求答案; - 输出同样的 yes/no。
Transitivity
Reduction 具有传递性:
如果:
并且:
那么:
原因是两个 polynomial time 转换可以串起来,polynomial 的复合仍然是 polynomial。
SAT Reduces to 3SAT
3SAT 是 SAT 的限制版本。
一个 CNF formula 是 3-CNF,如果每个 clause 至多包含 3 个 literals。
3SAT:
给定一个 3-CNF formula,判断是否存在变量赋值使公式为 true。
显然:
因为 3-CNF 也是 CNF。
更重要的是反方向:
这说明 SAT 和 3SAT 在多项式时间意义下“同样难”。
Idea
给定任意 CNF formula
并且构造过程是 polynomial time。
关键是把过长的 clause 拆成多个长度至多为 3 的 clause。
Breaking a Long Clause
例如四个 literal 的 clause:
可以引入新变量
这个改写保持 satisfiability:
- 如果原 clause 中前半部分有 true,可以令
; - 如果后半部分有 true,可以令
; - 如果原 clause 全 false,则两个新 clause 无法同时为 true。
更一般地,对一个长度为
可以引入新变量
如果某个
如果所有
所以:
3SAT Reduces to Independent Set
接下来证明:
Construction
给定一个 3SAT instance:
每个 clause 有 3 个 literals。
构造图
- 对每个 clause
,建立一个 triangle; - triangle 的三个点分别表示这个 clause 中的三个 literals;
- 同一个 triangle 内三个点两两相连;
- 如果两个点代表互相矛盾的 literals,例如
和 ,就在它们之间连边; - 设:
也就是 clause 的数量。
Why Yes Implies Yes
如果
从每个 triangle 中选一个值为 true 的 literal 对应的点,得到集合
因为:
- 每个 triangle 只选一个点,所以不会选到同一个 clause 内的相邻点;
- 一个 truth assignment 不可能同时让
和 为 true,所以不会选到互相矛盾的两个点;
因此
而且每个 clause 选一个点,所以:
所以 Independent Set instance 是 yes。
Why Yes in Independent Set Implies Yes in 3SAT
反过来,如果构造出的图
因为每个 triangle 内部是三角形,任意两个点相邻,所以一个 independent set 在每个 triangle 中最多选一个点。
但
根据被选中的 literal 设置变量为 true。由于 independent set 不能同时包含
未被赋值的变量可以任意赋值。
这样每个 clause 至少有一个被选中的 literal 为 true,因此
所以:
NP-hard and NP-complete
现在可以定义“最难的 NP 问题”。
NP-hard
一个 decision problem
也就是说,NP 中所有问题都可以 polynomial-time reduce 到
直观理解:
如果你会高效解决
,你就会高效解决 NP 中所有问题。
NP-complete
一个 decision problem
; 是 NP-hard。
也就是:
NP-complete 问题是 NP 里面最难的一批问题。