目录
- [一、NP 完备问题概述](#一、NP 完备问题概述)
- [二、打包问题(Packing Problems)](#二、打包问题(Packing Problems))
- [1. SET-PACKING(集合打包问题)](#1. SET-PACKING(集合打包问题))
- [2. INDEPENDENT-SET(独立集问题)](#2. INDEPENDENT-SET(独立集问题))
- [三、覆盖问题(Covering Problems)](#三、覆盖问题(Covering Problems))
- [3. SET-COVER(集合覆盖问题)](#3. SET-COVER(集合覆盖问题))
- [4. VERTEX-COVER(顶点覆盖问题)](#4. VERTEX-COVER(顶点覆盖问题))
- [四、约束满足问题(Constraint Satisfaction Problems)](#四、约束满足问题(Constraint Satisfaction Problems))
- [5. SAT(布尔可满足性问题)](#5. SAT(布尔可满足性问题))
- [6. 3-SAT(三可满足性问题)](#6. 3-SAT(三可满足性问题))
- [五、排序与路径问题(Sequencing Problems)](#五、排序与路径问题(Sequencing Problems))
- [7. HAMILTONIAN-CYCLE(哈密顿回路问题)](#7. HAMILTONIAN-CYCLE(哈密顿回路问题))
- [8. TSP(旅行商问题)](#8. TSP(旅行商问题))
- [六、划分问题(Partitioning Problems)](#六、划分问题(Partitioning Problems))
- [9. 3D-MATCHING(三维匹配问题)](#9. 3D-MATCHING(三维匹配问题))
- [10. 3-COLOR(三着色问题)](#10. 3-COLOR(三着色问题))
- [七、数值问题(Numerical Problems)](#七、数值问题(Numerical Problems))
- [11. SUBSET-SUM(子集和问题)](#11. SUBSET-SUM(子集和问题))
- [12. KNAPSACK(背包问题)](#12. KNAPSACK(背包问题))
- [八、12 个经典 NP 完备问题速记表](#八、12 个经典 NP 完备问题速记表)
- 九、三个值得了解的复杂性问题
- 十、考试重点总结
- 总结
常见 NP-Complete 问题总结
一、NP 完备问题概述
NP 完备问题(NP-Complete Problem,简称 NPC)是计算复杂性理论中的一类重要问题。
一个判定问题是 NP 完备问题,需要满足两个条件:
- 属于 NP 类:给定一个候选解,能够在多项式时间内验证其正确性。
- 属于 NP-Hard 类:所有 NP 问题都可以在多项式时间内归约到该问题。
即:
NP-Complete = NP ∩ NP-Hard \boxed{\text{NP-Complete}=\text{NP}\cap\text{NP-Hard}} NP-Complete=NP∩NP-Hard
注意:NP 完备问题讨论的是判定版本,即判断是否存在满足条件的解,答案通常为 YES 或 NO。
例如:
- 优化问题:寻找一条总距离最短的旅行路线。
- 判定问题:是否存在一条总距离不超过 K K K 的旅行路线?
下面介绍 6 大类、12 个经典 NP 完备问题。
二、打包问题(Packing Problems)
核心思想:选择若干彼此不冲突的对象。
1. SET-PACKING(集合打包问题)
问题定义
给定一个集合族:
S = { S 1 , S 2 , ... , S n } \mathcal{S}=\{S_1,S_2,\ldots,S_n\} S={S1,S2,...,Sn}
以及正整数 k k k。
问:能否从中选出至少 k k k 个集合,使这些集合两两不相交?
即对于任意两个选中的不同集合:
S i ∩ S j = ∅ S_i\cap S_j=\varnothing Si∩Sj=∅
举例
已知:
S 1 = { 1 , 2 } , S 2 = { 3 , 4 } , S 3 = { 2 , 5 } S_1=\{1,2\},\quad S_2=\{3,4\},\quad S_3=\{2,5\} S1={1,2},S2={3,4},S3={2,5}
要求选出 k = 2 k=2 k=2 个互不相交的集合。
可以选择:
S 1 = { 1 , 2 } , S 2 = { 3 , 4 } S_1=\{1,2\},\quad S_2=\{3,4\} S1={1,2},S2={3,4}
由于:
S 1 ∩ S 2 = ∅ S_1\cap S_2=\varnothing S1∩S2=∅
所以答案为 YES。
记忆:选集合,选中的集合之间不能有公共元素。
2. INDEPENDENT-SET(独立集问题)
问题定义
给定无向图:
G = ( V , E ) G=(V,E) G=(V,E)
以及正整数 k k k。
问:能否选出至少 k k k 个顶点,使任意两个被选中的顶点之间都没有边?
即寻找顶点集合 S ⊆ V S\subseteq V S⊆V,满足:
∣ S ∣ ≥ k |S|\geq k ∣S∣≥k
并且:
∀ u , v ∈ S , u ≠ v ⇒ ( u , v ) ∉ E \forall u,v\in S,\ u\neq v\Rightarrow (u,v)\notin E ∀u,v∈S, u=v⇒(u,v)∈/E
举例
假设图中存在边:
E = { ( A , B ) , ( B , C ) } E=\{(A,B),(B,C)\} E={(A,B),(B,C)}
可以选择顶点 A A A 和 C C C。
因为 A A A 与 C C C 之间没有边,所以:
S = { A , C } S=\{A,C\} S={A,C}
是一个大小为 2 的独立集。
记忆:选顶点,选中的顶点之间不能有边。
三、覆盖问题(Covering Problems)
核心思想:选择有限数量的对象,覆盖所有目标。
3. SET-COVER(集合覆盖问题)
问题定义
给定全集:
U = { u 1 , u 2 , ... , u m } U=\{u_1,u_2,\ldots,u_m\} U={u1,u2,...,um}
以及若干子集:
S = { S 1 , S 2 , ... , S n } \mathcal{S}=\{S_1,S_2,\ldots,S_n\} S={S1,S2,...,Sn}
和正整数 k k k。
问:能否选择至多 k k k 个子集,使它们的并集等于全集 U U U?
即:
⋃ S i ∈ C S i = U , ∣ C ∣ ≤ k \bigcup_{S_i\in C}S_i=U,\qquad |C|\leq k Si∈C⋃Si=U,∣C∣≤k
其中 C C C 表示选中的子集集合。
举例
已知:
U = { 1 , 2 , 3 , 4 } U=\{1,2,3,4\} U={1,2,3,4}
S 1 = { 1 , 2 } , S 2 = { 3 , 4 } , S 3 = { 2 , 3 } S_1=\{1,2\},\quad S_2=\{3,4\},\quad S_3=\{2,3\} S1={1,2},S2={3,4},S3={2,3}
要求至多选择 k = 2 k=2 k=2 个集合覆盖全集。
选择:
S 1 ∪ S 2 = { 1 , 2 , 3 , 4 } = U S_1\cup S_2=\{1,2,3,4\}=U S1∪S2={1,2,3,4}=U
因此答案为 YES。
记忆:选集合,用尽量少的集合覆盖所有元素。
4. VERTEX-COVER(顶点覆盖问题)
问题定义
给定无向图:
G = ( V , E ) G=(V,E) G=(V,E)
以及正整数 k k k。
问:能否选出至多 k k k 个顶点,使图中的每条边至少有一个端点被选中?
即寻找 S ⊆ V S\subseteq V S⊆V,满足:
∣ S ∣ ≤ k |S|\leq k ∣S∣≤k
并且:
∀ ( u , v ) ∈ E , u ∈ S ∨ v ∈ S \forall (u,v)\in E,\quad u\in S\lor v\in S ∀(u,v)∈E,u∈S∨v∈S
举例
假设图为:
text
A ----- B ----- C
选择中间顶点 B B B,即可同时覆盖:
( A , B ) , ( B , C ) (A,B),\quad (B,C) (A,B),(B,C)
因此,存在大小为 1 的顶点覆盖。
记忆:选顶点,保证每条边至少有一个端点被选中。
INDEPENDENT-SET 与 VERTEX-COVER 的区别
| 问题 | 选择对象 | 要求 |
|---|---|---|
| INDEPENDENT-SET | 顶点 | 选中的顶点之间没有边 |
| VERTEX-COVER | 顶点 | 每条边至少有一个端点被选中 |
两者有一个重要关系:
S 是独立集 ⟺ V ∖ S 是顶点覆盖 S\text{ 是独立集}\iff V\setminus S\text{ 是顶点覆盖} S 是独立集⟺V∖S 是顶点覆盖
因此:
α ( G ) + τ ( G ) = ∣ V ∣ \alpha(G)+\tau(G)=|V| α(G)+τ(G)=∣V∣
其中:
- α ( G ) \alpha(G) α(G):最大独立集大小。
- τ ( G ) \tau(G) τ(G):最小顶点覆盖大小。
四、约束满足问题(Constraint Satisfaction Problems)
核心思想:判断是否存在一种变量赋值,使全部逻辑约束同时成立。
5. SAT(布尔可满足性问题)
SAT 的英文全称是 Boolean Satisfiability Problem。
问题定义
给定一个布尔逻辑公式:
F ( x 1 , x 2 , ... , x n ) F(x_1,x_2,\ldots,x_n) F(x1,x2,...,xn)
问:是否存在一组 True/False 赋值,使整个公式为 True?
常见逻辑符号:
| 符号 | 含义 |
|---|---|
| ∧ \land ∧ | AND,逻辑与 |
| ∨ \lor ∨ | OR,逻辑或 |
| ¬ \neg ¬ | NOT,逻辑非 |
举例
给定:
F = ( x 1 ∨ x 2 ) ∧ ( ¬ x 1 ∨ x 3 ) F=(x_1\lor x_2)\land(\neg x_1\lor x_3) F=(x1∨x2)∧(¬x1∨x3)
如果令:
x 1 = True , x 3 = True x_1=\text{True},\qquad x_3=\text{True} x1=True,x3=True
那么两个括号都为 True,整个公式也为 True。
所以答案为 YES。
记忆:给布尔变量赋真假,使整个逻辑公式成立。
SAT 是第一个被证明为 NP-Complete 的问题,相关结果称为 Cook-Levin 定理。
6. 3-SAT(三可满足性问题)
问题定义
3-SAT 是 SAT 的一种特殊形式。
给定一个合取范式(CNF),每个子句恰好包含 3 个文字。
问:是否存在一组布尔变量赋值,使整个公式为 True?
其中:
- 子句内部使用 OR。
- 子句之间使用 AND。
- 每个子句有 3 个文字。
- 文字可以是变量,也可以是变量的否定。
举例
F = ( x 1 ∨ x 2 ∨ x 3 ) ∧ ( ¬ x 1 ∨ x 2 ∨ ¬ x 3 ) F=(x_1\lor x_2\lor x_3) \land (\neg x_1\lor x_2\lor\neg x_3) F=(x1∨x2∨x3)∧(¬x1∨x2∨¬x3)
每个括号中有 3 个文字。
如果令:
x 2 = True x_2=\text{True} x2=True
则两个子句都成立,因此整个公式成立。
记忆:3-SAT 就是每个子句恰好有 3 个文字的 SAT。
SAT 与 3-SAT 的区别
| 问题 | 核心要求 |
|---|---|
| SAT | 一般布尔公式是否可满足 |
| 3-SAT | 每个子句恰好包含 3 个文字的 CNF 是否可满足 |
注意:这里说的 3-SAT 是经典的 NP-Complete 版本,不要与限制更强的特殊变体混淆。
五、排序与路径问题(Sequencing Problems)
核心思想:寻找满足要求的顶点访问顺序或路径。
7. HAMILTONIAN-CYCLE(哈密顿回路问题)
问题定义
给定图:
G = ( V , E ) G=(V,E) G=(V,E)
问:是否存在一个回路,经过图中每个顶点恰好一次,并最终回到起点?
举例
假设存在:
A → B → C → D → A A\rightarrow B\rightarrow C\rightarrow D\rightarrow A A→B→C→D→A
如果这条回路经过全部顶点,而且除起点与终点重合外,没有重复顶点,那么它就是哈密顿回路。
两种常见版本
有向哈密顿回路:DIR-HAM-CYCLE
必须沿着有向边的方向行走。
无向哈密顿回路:HAM-CYCLE
图中的边没有方向。
两者都是 NP-Complete 问题,并且存在多项式时间归约:
DIR-HAM-CYCLE ≤ p HAM-CYCLE \text{DIR-HAM-CYCLE}\leq_p\text{HAM-CYCLE} DIR-HAM-CYCLE≤pHAM-CYCLE
记忆:每个顶点恰好经过一次,最后返回起点。
8. TSP(旅行商问题)
TSP 的英文全称是 Travelling Salesperson Problem。
问题定义
给定若干城市、城市之间的距离,以及一个距离上限 K K K。
问:是否存在一条路线,经过每个城市恰好一次,最后返回出发城市,并使总距离不超过 K K K?
设路线为:
v 1 , v 2 , ... , v n , v 1 v_1,v_2,\ldots,v_n,v_1 v1,v2,...,vn,v1
要求:
∑ i = 1 n − 1 d ( v i , v i + 1 ) + d ( v n , v 1 ) ≤ K \sum_{i=1}^{n-1}d(v_i,v_{i+1})+d(v_n,v_1)\leq K i=1∑n−1d(vi,vi+1)+d(vn,v1)≤K
举例
假设:
d ( A , B ) = 3 d(A,B)=3 d(A,B)=3
d ( B , C ) = 4 d(B,C)=4 d(B,C)=4
d ( C , A ) = 5 d(C,A)=5 d(C,A)=5
选择路线:
A → B → C → A A\rightarrow B\rightarrow C\rightarrow A A→B→C→A
总距离为:
3 + 4 + 5 = 12 3+4+5=12 3+4+5=12
如果:
K = 15 K=15 K=15
则答案为 YES。
记忆:访问所有城市并返回,总路程不能超过指定值。
HAMILTONIAN-CYCLE 与 TSP 的区别
| 问题 | 要求 |
|---|---|
| HAMILTONIAN-CYCLE | 是否存在经过全部顶点的回路 |
| TSP | 是否存在经过全部城市且总费用不超过 K K K 的回路 |
注意:TSP 的判定版本是 NP-Complete 问题,而寻找最短路线的优化版本是 NP-Hard 问题。
六、划分问题(Partitioning Problems)
核心思想:将对象划分或分配到不同组中,使其满足特定约束。
9. 3D-MATCHING(三维匹配问题)
3D-MATCHING 的英文全称是 Three-Dimensional Matching。
问题定义
给定三个两两不相交、大小相等的集合:
X , Y , Z X,\quad Y,\quad Z X,Y,Z
以及允许选择的三元组集合:
T ⊆ X × Y × Z T\subseteq X\times Y\times Z T⊆X×Y×Z
问:能否从 T T T 中选出若干三元组,使每个元素恰好出现一次?
也就是说:
- 每个三元组分别从 X , Y , Z X,Y,Z X,Y,Z 中取一个元素。
- 不同三元组不能共享元素。
- 三个集合中的所有元素都恰好使用一次。
举例
X = { x 1 , x 2 } X=\{x_1,x_2\} X={x1,x2}
Y = { y 1 , y 2 } Y=\{y_1,y_2\} Y={y1,y2}
Z = { z 1 , z 2 } Z=\{z_1,z_2\} Z={z1,z2}
假设允许的三元组包括:
( x 1 , y 1 , z 1 ) (x_1,y_1,z_1) (x1,y1,z1)
( x 2 , y 2 , z 2 ) (x_2,y_2,z_2) (x2,y2,z2)
选择这两个三元组后,每个元素都恰好出现一次。
因此答案为 YES。
记忆:三个集合,每次各取一个元素组成三元组,要求所有元素恰好匹配一次。
10. 3-COLOR(三着色问题)
问题定义
给定无向图:
G = ( V , E ) G=(V,E) G=(V,E)
问:能否使用最多 3 种颜色给所有顶点着色,使每条边连接的两个顶点颜色不同?
即构造着色函数:
c : V → { 1 , 2 , 3 } c:V\rightarrow\{1,2,3\} c:V→{1,2,3}
满足:
∀ ( u , v ) ∈ E , c ( u ) ≠ c ( v ) \forall (u,v)\in E,\quad c(u)\neq c(v) ∀(u,v)∈E,c(u)=c(v)
举例
假设图是一个三角形:
text
A(红)
/ \
/ \
B(蓝)-- C(绿)
三个顶点两两相邻,因此需要使用 3 种不同颜色。
所以该图可以进行三着色。
记忆:最多使用 3 种颜色,相邻顶点不能同色。
注意:最多用 3 种颜色,而不是要求每种颜色都必须使用。
七、数值问题(Numerical Problems)
核心思想:从数字或物品中进行选择,满足给定的数值约束。
11. SUBSET-SUM(子集和问题)
问题定义
给定一组整数:
S = { a 1 , a 2 , ... , a n } S=\{a_1,a_2,\ldots,a_n\} S={a1,a2,...,an}
以及目标值 T T T。
问:是否存在一个子集,使其中所有元素之和恰好等于 T T T?
即是否存在:
x i ∈ { 0 , 1 } x_i\in\{0,1\} xi∈{0,1}
使得:
∑ i = 1 n a i x i = T \sum_{i=1}^{n}a_ix_i=T i=1∑naixi=T
其中:
- x i = 1 x_i=1 xi=1:选择第 i i i 个数字。
- x i = 0 x_i=0 xi=0:不选择第 i i i 个数字。
举例
S = { 2 , 3 , 7 , 8 } S=\{2,3,7,8\} S={2,3,7,8}
目标值:
T = 10 T=10 T=10
选择:
2 + 8 = 10 2+8=10 2+8=10
因此答案为 YES。
记忆:选择若干数字,使它们的和恰好等于目标值。
12. KNAPSACK(背包问题)
这里讨论经典的 0-1 背包判定问题。
问题定义
给定 n n n 件物品,每件物品具有:
- 重量 w i w_i wi。
- 价值 v i v_i vi。
另外给定:
- 背包容量 W W W。
- 目标价值 K K K。
问:是否存在一种物品选择方案,使总重量不超过 W W W,同时总价值至少达到 K K K?
数学表达为:
∑ i = 1 n w i x i ≤ W \sum_{i=1}^{n}w_ix_i\leq W i=1∑nwixi≤W
∑ i = 1 n v i x i ≥ K \sum_{i=1}^{n}v_ix_i\geq K i=1∑nvixi≥K
其中:
x i ∈ { 0 , 1 } x_i\in\{0,1\} xi∈{0,1}
举例
| 物品 | 重量 | 价值 |
|---|---|---|
| A | 2 | 5 |
| B | 3 | 6 |
| C | 4 | 8 |
假设:
W = 5 , K = 10 W=5,\quad K=10 W=5,K=10
选择 A 和 B:
总重量 = 2 + 3 = 5 \text{总重量}=2+3=5 总重量=2+3=5
总价值 = 5 + 6 = 11 \text{总价值}=5+6=11 总价值=5+6=11
满足:
5 ≤ W , 11 ≥ K 5\leq W,\qquad 11\geq K 5≤W,11≥K
因此答案为 YES。
记忆:背包重量不能超限,物品总价值必须达到目标。
SUBSET-SUM 与 KNAPSACK 的区别
| 问题 | 核心要求 |
|---|---|
| SUBSET-SUM | 数字之和恰好等于目标值 |
| KNAPSACK | 总重量不超过上限,总价值至少达到目标 |
八、12 个经典 NP 完备问题速记表
| 类别 | 英文名称 | 中文名称 | 一句话记忆 |
|---|---|---|---|
| 打包 | SET-PACKING | 集合打包 | 选至少 k k k 个两两不相交的集合 |
| 打包 | INDEPENDENT-SET | 独立集 | 选至少 k k k 个互不相邻的顶点 |
| 覆盖 | SET-COVER | 集合覆盖 | 用至多 k k k 个集合覆盖全集 |
| 覆盖 | VERTEX-COVER | 顶点覆盖 | 用至多 k k k 个顶点覆盖所有边 |
| 约束满足 | SAT | 布尔可满足性 | 给变量赋真假,使公式成立 |
| 约束满足 | 3-SAT | 三可满足性 | 每个子句有 3 个文字的 SAT |
| 排序与路径 | HAMILTONIAN-CYCLE | 哈密顿回路 | 经过全部顶点恰好一次并返回 |
| 排序与路径 | TSP | 旅行商问题 | 访问所有城市,总路程不超过 K K K |
| 划分 | 3D-MATCHING | 三维匹配 | 选择互不冲突的三元组覆盖所有元素 |
| 划分 | 3-COLOR | 三着色 | 最多 3 种颜色,相邻顶点不同色 |
| 数值 | SUBSET-SUM | 子集和 | 选择若干数字,和恰好等于 T T T |
| 数值 | KNAPSACK | 背包问题 | 重量不超限,价值达到目标 |
九、三个值得了解的复杂性问题
1. Factoring(整数因式分解)
给定一个整数,研究如何寻找它的非平凡因子。
例如:
15 = 3 × 5 15=3\times5 15=3×5
需要注意:整数因式分解的搜索问题与其判定版本应当区分,不应直接称为 NP 完备问题。
2. Graph Isomorphism(图同构)
给定两个图:
G 1 , G 2 G_1,\quad G_2 G1,G2
判断它们是否具有相同的结构。
即:能否通过重新编号顶点,使两个图的顶点连接关系完全一致?
图同构问题属于 NP,但目前尚未证明它属于 P 或 NP 完备。
3. Nash Equilibrium(纳什均衡)
纳什均衡是博弈论中的重要概念。
如果在某种策略组合下,任何参与者都无法通过单方面改变自己的策略获得更高收益,那么该策略组合就是纳什均衡。
一般有限博弈中的纳什均衡计算属于 PPAD 相关的复杂性研究,与标准 NP 完备判定问题不同。
十、考试重点总结
1. 必须记住的三组易混淆问题
第一组:SET-PACKING 与 SET-COVER
- SET-PACKING:选出的集合不能重叠。
- SET-COVER:选出的集合必须覆盖全集。
第二组:INDEPENDENT-SET 与 VERTEX-COVER
- INDEPENDENT-SET:选中的顶点之间不能有边。
- VERTEX-COVER:每条边至少有一个端点被选中。
第三组:SUBSET-SUM 与 KNAPSACK
- SUBSET-SUM:选中数字之和必须恰好等于目标。
- KNAPSACK:重量不超过容量,价值至少达到目标。
2. NP 完备问题中的常见关键词
| 关键词 | 常见对应问题 |
|---|---|
| 两两不相交的集合 | SET-PACKING |
| 顶点互不相邻 | INDEPENDENT-SET |
| 覆盖所有元素 | SET-COVER |
| 每条边至少一个端点被选中 | VERTEX-COVER |
| 布尔公式可满足 | SAT |
| 每个子句有 3 个文字 | 3-SAT |
| 每个顶点访问一次并返回 | HAMILTONIAN-CYCLE |
| 最短旅行路线或费用限制 | TSP |
| 三元组、不重复匹配 | 3D-MATCHING |
| 相邻顶点颜色不同 | 3-COLOR |
| 数字之和恰好等于目标值 | SUBSET-SUM |
| 重量限制、价值要求 | KNAPSACK |
3. NP 完备性证明的基本步骤
如果要证明一个新问题 B B B 是 NP 完备的,通常需要:
第一步:证明 B ∈ N P B\in NP B∈NP。
说明给定一个候选解,可以在多项式时间内验证。
第二步:选择一个已知的 NP 完备问题 A A A。
第三步:构造多项式时间归约。
A ≤ p B A\leq_p B A≤pB
证明:
x ∈ A ⟺ f ( x ) ∈ B x\in A\iff f(x)\in B x∈A⟺f(x)∈B
其中 f f f 可以在多项式时间内计算。
这样就证明了 B B B 是 NP-Hard。
结合第一步,即可得到:
B 是 NP-Complete \boxed{B\text{ 是 NP-Complete}} B 是 NP-Complete
特别注意归约方向:要证明 B B B 是 NP 完备的,应当从一个已知 NP 完备问题 A A A 归约到 B B B,而不是反过来。
总结
六大类 NP 完备问题分别是:
- Packing(打包):选择互不冲突的对象。
- Covering(覆盖):用有限对象覆盖全部目标。
- Constraint Satisfaction(约束满足):寻找满足全部约束的变量赋值。
- Sequencing(排序与路径):寻找满足条件的访问顺序。
- Partitioning(划分):对对象进行合理分组或分配。
- Numerical(数值):选择数字或物品满足数值要求。
复习时应重点理解每个问题的:
- 输入是什么?
- 需要判断什么?
- 满足条件的解具有什么性质?