多项式规约与 NP 完全性的基础

中文 | English

多项式规约(Polynomial-Time Reduction)

在复杂度理论中,“规约”是研究问题难度最重要的工具。

首先在这里先搞定规约是什么意思。

我们经常说:

如果问题 X 至少和问题 Y 一样难,意味着:如果我们能解决 X,就能顺便解决 Y。

这个是很好理解的。

形式化定义为多项式规约(Reduction):

YpX \ Y 可以用一个多项式时间的算法,加上若干次调用 X 的黑盒来解决。

直观理解:

规约可以帮助我们比较问题的难度。

理解方法:

Independent Set v.s. Vertex Cover: 最经典的互相规约

为了直观理解规约,我们先从两个简单且密切相关的问题开始。

Independent Set Problem and Vertex Cover Set Problem

这两个问题的描述,已经在前两章讲述过了,这里不再赘述。

Important FACT

非常重要:

在一个图 G=(V,E) 中:S 是独立集 ⇔ VS 是点覆盖

直觉:

反之亦然。

这个互补关系可以自然地导出规约。

两者互相规约

Independent SetpVertex Cover

问题:G 是否存在独立集 ≥ k?

转换为:

问:G 是否存在点覆盖 ≤ n − k?

理由:

因此,只要问黑盒:

“是否有点覆盖大小 ≤ n−k?”

如果黑盒回答 YES,则 Independent Set 答案也是 YES。


Vertex CoverpIndependent Set

同理:

判断“VC ≤ k” 等价于判断 “IS ≥ n−k”。

这两个规约,是已知结论,可以直接使用。

Set Cover: Vertex Cover 更一般化的形式

Set Cover 的定义:

给定一个元素集合 U,以及若干个“子集” S1,...,Sm,问是否可以选 k 个集合覆盖所有元素?

Vertex Cover 可以规约到 Set Cover:

因此:

Vertex CoverpSet Cover

所以 Set Cover 至少和 Vertex Cover 一样难。

使用 Gadgets 的规约(从 SAT 到图)

接下来进入复杂度理论中的“gadget 构造”。 gadget 是一种小型结构,用来模拟逻辑关系。

本节目标:

这部分是 NP 完全性的核心技巧。

clause(子句)与 literal(文字)

其实这个概念前面是讲过的,当时提到SAT问题的时候。

x1¬x3x4

赋值什么时候满足子句?只要有一个 literal 为真,该子句就满足。

SAT 与 3-SAT

SAT 问题:

是否存在对变量的赋值使所有子句都为真?

比如现在有若干子句: C1,C2,...,Ck

现在要找到一个变量赋值,使得所有的子句都为真。

3-SAT 是特例:每个子句恰好 3 个 literal。

规约: 3-SATpIndependent Set

这是 NP 完全理论最经典的规约之一。

(1) 为每个子句创建一个三角形 gadget

例如子句:xy¬z

三角形保证:

这表示:

“一个子句里至少选择一个为真”

(2) 禁止 x 与 ¬x 同时被选(加入冲突边)

如果 literal a 表示 “x=真”,literal b 表示 “x=假” → 不能两者都选入独立集 → 在它们之间连一条边即可

两个方向证明规约正确性

A. 如果 3-SAT 可满足 → 存在大小 = 子句数 的独立集

对每个子句选一个为真的 literal:

B. 如果存在大小 = 子句数 的独立集 → 可以构造可满足赋值

因为:

→ 每个子句都选了一个 literal \ → 将被选 literal 赋为真 → 得到满足赋值

NP-hard 与 NP-complete

NP-hard 定义(至少这么难)

一个问题 X 是 NP-hard,如果:

NP 中所有问题 Y 都可以规约到 X(YpX)。

NP-hard 不要求:

例子:停机问题(Halting Problem)

NP-complete 定义

(重要定义)一个问题 X 是 NP-complete,当且仅当:

  1. X ∈ NP(可验证)

  2. 对所有 Y ∈ NP,Y ≤ₚ X(最难)

性质:

则所有 NP 问题都能 poly-time 解决 \ 则P = NP

规约的传递性

非常关键:

如果 Z ≤ₚ Y 且 Y ≤ₚ X,则 Z ≤ₚ X。

所以:

SAT 是第一个被证明 NP-complete 的问题(Cook-Levin 定理), 因此 SAT 成为所有 NP 完全证明的“起点”。

如何证明一个问题 X 是 NP-complete?

最经典的三步法:

步骤 1: 证明 X ∈ NP

给出 certificate 和 certifier。

步骤 2:选择一个已知 NP-complete 的问题 Y

例如:

步骤 3: 证明 Y ≤ₚ X

也就是:

把实例 Y 编码成实例 X 并证明两个方向的正确性(YES→YES,NO→NO)

完成以上三步 → X 是 NP-complete。

证明例子合集

这里整理了一系列证明题目,里面包含了一系列常用的构造方法。