文章目录
要点9:理解 NP 完全问题的特性,能够证明一个判定型问题是否属于 NP 类问题,可以利用规约方法证明一个问题是否是 NP 完全问题
📌 适合对象:算法学习者、计算机科学学生
⏱️ 预计阅读时间:80-90分钟
🎯 学习目标:理解NP完全问题的特性,掌握如何证明一个判定型问题属于NP类,掌握如何用规约方法证明一个问题是否是NP完全问题
📚 参考PPT:第 13 章-PPT-N2(NP完全问题)- NP类、NP完全问题、多项式归约相关内容
📚 学习路线图
本文内容一览(快速理解)
- 判定型问题和优化型问题:判定型问题的答案只有是或否,优化型问题要求最优数值
- P类和NP类:P类是多项式时间可判定的问题,NP类是多项式时间可检验的问题
- NP完全问题:NP类中最难的问题,如果有一个NP完全问题有多项式算法,则P=NP
- 多项式归约:证明问题难度的工具,如果 π 1 ≤ p π 2 \pi_1 \leq_p \pi_2 π1≤pπ2,则 π 2 \pi_2 π2至少和 π 1 \pi_1 π1一样难
- 证明方法:如何证明一个问题属于NP类,如何用规约方法证明NP完全性
一、预备知识(Preliminaries):理解问题分类
这一章要建立的基础:理解判定型问题和优化型问题的区别,理解如何将优化型问题转化为判定型问题。
核心问题:如何对问题进行分类?判定型问题和优化型问题有什么关系?
[!NOTE]
📝 关键点总结:如果一个问题的答案只有两种,是(yes)或否(no),则称为一个判定型问题。一个问题被称为优化型问题,如果这个问题的解对应于一个最优的数值。在我们后续讨论P类、NP类以及NPC类问题时,我们限定所有被分类的问题都是判定型问题。
1.1 判定型问题和优化型问题(Decision vs Optimization Problems)
概念的本质:
判定型问题(Decision Problem):
- 答案只有两种:是(yes)或否(no)
- 例如:判断"一个图是否存在一条哈密尔顿回路"
优化型问题(Optimization Problem):
- 问题的解对应于一个最优的数值
- 通常要求找到最长、最短、最大、最小、最高、最低、最重、或最轻等
- 例如:在两点之间找一条最短路径
关系:
- 一个优化型问题往往可对应于一个判定型问题
- 如果判定型问题有多项式算法,那么其对应的优化型问题也往往有多项式算法
图解说明:
💡 说明:只限于判定型问题的讨论不会影响NPC理论的应用价值,因为一个优化型问题往往可对应于一个判定型问题。这一限制不仅简化了对NPC问题理论的讨论,并且突出了问题的本质。
实际例子:
优化型问题 → 判定型问题:
优化型问题:
给定有向图G(V, E)和两个顶点s和t,找出一条从s到t的简单路径,并使它含有的边数最多。
对应的判定型问题:
给定正整数k和有向图G(V, E),以及两个顶点s和t,是否存在一条包含至少k条边的从s到t的简单路径?
如果判定型问题有多项式算法A(G, s, t, k),则优化型问题的算法:
1. 用二分搜索找到最大的k,使得A(G, s, t, k) = yes
2. 逐步删除边,保持路径长度≥k,得到具体路径
1.2 判定型问题的形式语言表示(Formal Language Representation)
概念的本质:
字符集和语言:
- 给定字符集 Σ \Sigma Σ,它的所有字符串的集合,包括空串 λ \lambda λ,称之为 Σ \Sigma Σ的全语言,记为 Σ ∗ \Sigma^* Σ∗
- 例如: Σ = { 0 , 1 } \Sigma = \{0, 1\} Σ={0,1}, Σ ∗ = { λ , 0 , 1 , 00 , 01 , 10 , … } \Sigma^* = \{\lambda, 0, 1, 00, 01, 10, \ldots\} Σ∗={λ,0,1,00,01,10,…}
- 给定字符集 Σ \Sigma Σ,它的全语言的一个子集 L ⊆ Σ ∗ L \subseteq \Sigma^* L⊆Σ∗称为定义在 Σ \Sigma Σ之上的一种语言
判定型问题的语言表示:
- 一个判定型问题 π \pi π的实例可以用一个0和1组成的字符串 x x x表示
- 给定一个字符串
x
x
x,存在三种情况:
- x x x是问题 π \pi π的一个实例并且有答案yes: π ( x ) = 1 \pi(x) = 1 π(x)=1
- x x x是问题 π \pi π的一个实例并且有答案no: π ( x ) = 0 \pi(x) = 0 π(x)=0
- x x x不是问题 π \pi π的一个实例: π ( x ) = 0 \pi(x) = 0 π(x)=0
定义14.3:给定一个判定型问题 π \pi π,它对应的语言 L ( π ) L(\pi) L(π)是所有其答案均为yes的实例的字符串编码的集合,即 L ( π ) = { x ∣ x ∈ Σ ∗ and π ( x ) = 1 } L(\pi) = \{x | x \in \Sigma^* \text{ and } \pi(x) = 1\} L(π)={x∣x∈Σ∗ and π(x)=1}。
图解说明:
💡 说明:例如,哈密尔顿回路问题对应的语言可表示为: H a m i l t o n − C y c l e = { < G > ∣ G 含有哈密尔顿回路 } Hamilton-Cycle = \{<G> | G \text{ 含有哈密尔顿回路}\} Hamilton−Cycle={<G>∣G 含有哈密尔顿回路}。这里, < G > <G> <G>表示一个实例图的编码字符串。串的长度会随着顶点和边的个数增长而增长,但通常是线性的或低阶多项式的。
实际例子:
形式语言表示示例:
问题:判断图G是否有哈密尔顿回路
实例编码:
图G可以用邻接矩阵或邻接表编码为字符串<G>
语言:
L(Hamilton-Cycle) = {<G> | G含有哈密尔顿回路}
如果G有哈密尔顿回路:
<G> ∈ L(Hamilton-Cycle)
π(<G>) = 1
如果G没有哈密尔顿回路:
<G> ∉ L(Hamilton-Cycle)
π(<G>) = 0
1.3 多项式归约(Polynomial Reduction):问题难度的比较
概念的本质:
定义14.6:给定两个语言 L 1 L_1 L1和 L 2 L_2 L2,如果存在一个算法 f f f,它把 Σ ∗ \Sigma^* Σ∗中每一个字符串 x x x转换为另一个字符串 f ( x ) f(x) f(x),并且满足:
- x ∈ L 1 x \in L_1 x∈L1当且仅当 f ( x ) ∈ L 2 f(x) \in L_2 f(x)∈L2
- f f f是个多项式算法,即转换在 ∣ x ∣ c |x|^c ∣x∣c的时间内完成, c c c是一个正常数
那么,我们说 L 1 L_1 L1可多项式归约到 L 2 L_2 L2,记为 L 1 ≤ p L 2 L_1 \leq_p L_2 L1≤pL2,并称 f f f为多项式转换函数或算法。
定义14.7:假设问题 π 1 \pi_1 π1和 π 2 \pi_2 π2对应的语言是 L ( π 1 ) L(\pi_1) L(π1)和 L ( π 2 ) L(\pi_2) L(π2)。如果语言 L ( π 1 ) L(\pi_1) L(π1)可以多项式归约到语言 L ( π 2 ) L(\pi_2) L(π2),则称问题 π 1 \pi_1 π1可以多项式归约到问题 π 2 \pi_2 π2,记为 π 1 ≤ p π 2 \pi_1 \leq_p \pi_2 π1≤pπ2。
含义:
- 从问题的角度看, π 1 ≤ p π 2 \pi_1 \leq_p \pi_2 π1≤pπ2意味着 π 1 \pi_1 π1的任何实例 x x x被一个多项式转换算法 f f f变成 π 2 \pi_2 π2的一个实例 f ( x ) f(x) f(x),并且 π 1 ( x ) = y e s \pi_1(x) = yes π1(x)=yes当且仅当 π 2 ( f ( x ) ) = y e s \pi_2(f(x)) = yes π2(f(x))=yes
图解说明:
💡 说明:如果问题 π 1 \pi_1 π1可多项式归约到问题 π 2 \pi_2 π2,那么从多项式可解的角度看,可以认为,问题 π 2 \pi_2 π2比 π 1 \pi_1 π1更难,因为找到 π 2 \pi_2 π2的多项式算法就可以找到 π 1 \pi_1 π1的多项式算法。实际运用的时候,通常是把一个已知的NP完全问题规约到你所研究的问题上,从而证明你所研究的问题也是NP完全的。
实际例子:
多项式归约示例:
问题π₁:判断图G是否有三角形(3个顶点形成的完全子图)
问题π₂:判断图G是否有k团(k个顶点形成的完全子图)
归约:
f(G) = (G, k=3)
- 如果G有三角形,则(G, 3)有3团
- 如果G没有三角形,则(G, 3)没有3团
- 转换时间:O(1)
因此:π₁ ≤p π₂
二、P类和NP类(P and NP Classes):问题复杂度的分类
这一章要建立的基础:理解P类和NP类的定义,理解它们之间的关系。
核心问题:什么是P类问题?什么是NP类问题?它们有什么关系?
[!NOTE]
📝 关键点总结:P语言类(class P)是所有可以被一个算法在多项式时间内判定的语言的集合。NP语言类(class NP)是所有可以被非确定图灵机在多项式时间内接收的语言的集合。定理14.3: P ⊆ N P P \subseteq NP P⊆NP。
2.1 P类(Class P):多项式时间可判定
概念的本质:
定义14.8:P语言类(class P)是所有可以被一个算法在多项式时间内判定的语言的集合,即 P = { L ∣ L ⊆ Σ ∗ 可被一多项式算法所判定 } P = \{L | L \subseteq \Sigma^* \text{ 可被一多项式算法所判定}\} P={L∣L⊆Σ∗ 可被一多项式算法所判定}。
含义:
- 如果语言 L L L可以被一个算法在多项式时间内判定,那么 L L L被称为属于P类的一个语言
- 如果问题 π \pi π对应的语言 L ( π ) L(\pi) L(π)属于P类,那么问题 π \pi π也称为P类问题
定理14.2:如果语言 L L L可以被一个算法在多项式时间内接收,那么 L L L就一定可以被一个算法在多项式时间内判定。
图解说明:
💡 说明:P类问题通常被称为"可驾驭的"(tractable)问题,即有高效算法可以求解的问题。例如:排序问题、最短路径问题(Dijkstra算法)、最小生成树问题(Kruskal/Prim算法)等都属于P类。
实际例子:
P类问题示例:
1. 排序问题:
输入:n个数字
判定:是否存在排序后的序列?
算法:快速排序,O(n log n) ✓
2. 最短路径问题:
输入:图G,源点s,目标点t,距离k
判定:是否存在从s到t的路径长度≤k?
算法:Dijkstra算法,O(n²)或O(m log n) ✓
3. 最小生成树问题:
输入:图G,权值k
判定:是否存在生成树总权值≤k?
算法:Kruskal/Prim算法,O(m log n) ✓
2.2 NP类(Class NP):多项式时间可检验
概念的本质:
非确定图灵机(Non-Deterministic Turing Machine):
- 与确定的图灵机的唯一区别就是状态转移函数 δ \delta δ
- 在确定的图灵机中, δ \delta δ把 ( q , a ) (q, a) (q,a)映射到唯一的三元组 ( q ′ , a ′ , D ) (q', a', D) (q′,a′,D)
- 在非确定的图灵机中,转移函数 δ \delta δ把 ( q , a ) (q, a) (q,a)映射到有多个三元组的一个集合上
定义14.9:如果语言 L L L的每一个字符串 x ∈ L x \in L x∈L都可以被一个非确定图灵机 M M M在多项式时间内接收,即存在一个多项式长度( < ∣ x ∣ c <|x|^c <∣x∣c)的计算路径,那么语言 L L L称为是一个被非确定的图灵机在多项式时间内接收的语言。
定义14.10:NP语言类(class NP)是所有可以被非确定图灵机在多项式时间内接收的语言的集合,即 N P = { L ∣ L ⊆ Σ ∗ 可被一个非确定图灵机在多项式时间内接收 } NP = \{L | L \subseteq \Sigma^* \text{ 可被一个非确定图灵机在多项式时间内接收}\} NP={L∣L⊆Σ∗ 可被一个非确定图灵机在多项式时间内接收}。
图解说明:
💡 说明:需要注意的是,这里我们只要求一个NP类语言被一个非确定图灵机在多项式时间内接收,而不是判定。这是因为要判定 x ∉ L x \notin L x∈/L需要证明"不存在一条多项式长的计算路径,能进入接收状态",而这样的路径数目是 ∣ x ∣ = n |x| = n ∣x∣=n的指数函数。NP: Non-deterministic Polynomial,即:多项式复杂程度的非确定性问题。
实际例子:
NP类问题示例:
1. 哈密尔顿回路问题:
输入:图G
判定:是否存在哈密尔顿回路?
非确定算法:猜测一个顶点序列,验证是否是回路 ✓
2. 可满足性问题(SAT):
输入:布尔表达式
判定:是否存在赋值使得表达式为真?
非确定算法:猜测赋值,验证表达式值 ✓
3. 顶点覆盖问题:
输入:图G,整数k
判定:是否存在k个顶点的覆盖?
非确定算法:猜测k个顶点,验证是否覆盖所有边 ✓
2.3 多项式检验算法(Polynomial Verification Algorithm):NP类的等价定义
概念的本质:
定义14.11:一个语言 L L L称为一个多项式时间可检验的语言,如果存在一个(确定的)图灵机 T T T使得 x ∈ L x \in L x∈L当且仅当存在一个字符串 y y y, ∣ y ∣ ≤ ∣ x ∣ c |y| \leq |x|^c ∣y∣≤∣x∣c,使字符串 ( x , y ) (x, y) (x,y)被 T T T在多项式时间内所接收,即 T ( x , y ) = 1 T(x, y) = 1 T(x,y)=1。这里, c c c是一个正常数, y y y称为 x x x的证书,而 T T T称为 L L L的多项式检验机。
NP-算法(多项式检验算法):
- 如果存在一个算法 A A A使得 x ∈ L x \in L x∈L当且仅当存在一个字符串 y y y, ∣ y ∣ ≤ ∣ x ∣ c |y| \leq |x|^c ∣y∣≤∣x∣c,使字符串 ( x , y ) (x, y) (x,y)被算法 A A A在多项式时间内所接收,那么语言 L L L是一个多项式时间可检验的语言,算法 A A A称为 L L L的多项式检验算法,或NP-算法
等价性:
- 多项式检验机的计算模型与非确定图灵机等价
- 一个NP类语言 L L L也就是一个多项式时间可检验的语言,反之亦然
图解说明:
💡 说明:在证明一个问题 π \pi π是NP类问题时,可设计一个NP-算法 A A A,它检验 π \pi π的每一个实例 x x x,在这个实例有yes答案时,它在多项式时间内输出 A ( x , y ) = 1 A(x, y) = 1 A(x,y)=1。这里, y y y是能证明 π ( x ) = y e s \pi(x) = yes π(x)=yes的证书, ∣ y ∣ ≤ ∣ x ∣ c |y| \leq |x|^c ∣y∣≤∣x∣c。一个问题 π \pi π的NP-算法,不是它的多项式算(解)法,而是多项式检验算法。
实际例子:
多项式检验算法示例:
问题:判断有向图G(V, E)是否有哈密尔顿回路
证书:顶点序列p = (v₁, v₂, ..., vₙ)
检验算法:
Hamilton-Cycle-Verification(G(V, E), p)
1. 检查是否有|p| = |V|
2. 检查p中每个顶点是否属于集合V
3. 检查V中每个顶点是否在p中出现,并且只出现一次
4. 检查从p中每个顶点到下个顶点是否是E中一条边
5. 检查从p的最后一个顶点到p的第一个顶点是否是E中一条边
6. 如果第1步到第5步的答案都是yes,那么输出1
End
复杂度:O(n²),多项式时间 ✓
因此:哈密尔顿回路问题 ∈ NP
2.4 P和NP的关系(Relationship between P and NP)
概念的本质:
定理14.3: P ⊆ N P P \subseteq NP P⊆NP。
证明:因为一个确定的图灵机可看作一个非确定图灵机的一个特例,只是它的转移函数 δ ( q , a ) \delta(q, a) δ(q,a)是只含单个三元组的一个集合,所以有 P ⊆ N P P \subseteq NP P⊆NP。
P vs NP问题:
- 目前还不知道是否 P = N P P = NP P=NP或 P ≠ N P P \neq NP P=NP
- 这是计算机科学中最重要的未解决问题之一
- 大部分人相信 P ≠ N P P \neq NP P=NP,但有待证明
图解说明:
💡 说明:如果 P = N P P = NP P=NP,那么所有NP类问题都可以在多项式时间内求解,这意味着许多目前被认为困难的问题(如密码学、优化问题等)都可以高效求解。如果 P ≠ N P P \neq NP P=NP,那么NP完全问题没有多项式算法,只能使用近似算法或启发式算法。
实际例子:
P和NP的关系:
已知:
- P ⊆ NP(定理14.3)
- 许多问题已知属于P(排序、最短路径等)
- 许多问题已知属于NP但不知道是否属于P(哈密尔顿回路、SAT等)
未知:
- P = NP 还是 P ≠ NP?
- 如果P = NP,则所有NP问题都有多项式算法
- 如果P ≠ NP,则NP完全问题没有多项式算法
影响:
- 密码学:如果P = NP,许多加密算法可能不安全
- 优化问题:如果P = NP,许多优化问题可以高效求解
三、NP完全问题(NP-Complete Problems):NP类中最难的问题
这一章要建立的基础:理解NP完全问题的定义和特性,理解如何证明一个问题是否是NP完全的。
核心问题:什么是NP完全问题?如何证明一个问题是否是NP完全的?
[!NOTE]
📝 关键点总结:简单来讲,NP-完全问题就是NP类中最难的问题。如果有一个NP-完全问题有多项式算法可以求解,那么所有NP类问题都会有多项式算法。一个语言 L L L被称为NP-完全(NP-complete)语言,如果它满足以下两个条件:(1) L ∈ N P L \in NP L∈NP,(2) NP类中任何一个语言 L ′ L' L′都可以多项式归约到 L L L,即 L ′ ≤ p L L' \leq_p L L′≤pL。
3.1 NP完全问题的定义(Definition of NP-Complete)
概念的本质:
定义14.12:一个语言 L L L被称为NP-完全(NP-complete)语言,如果它满足以下两个条件:
- L ∈ N P L \in NP L∈NP
- NP类中任何一个语言 L ′ L' L′都可以多项式归约到 L L L,即 L ′ ≤ p L L' \leq_p L L′≤pL
NP-难(NP-hard):
- 如果一个语言 L L L只满足定义14.12中第2个条件,那么 L L L被称为一个NP-难(NP-hard)语言
- 如果一个问题 π \pi π所对应的语言 L ( π ) L(\pi) L(π)是NP-完全(或NP-难),那么问题 π \pi π则被称为是一个NP-完全问题(或NP-难问题)
- 一个NP-完全问题显然也是一个NP-难问题
定义14.13:NP-完全语言类是所有NP-完全语言的集合,简称为NPC类,即 N P C = { L ∣ L 是一个NP-完全语言 } NPC = \{L | L \text{ 是一个NP-完全语言}\} NPC={L∣L 是一个NP-完全语言}。
图解说明:
💡 说明:NP完全问题就是NP类中最难的问题。如果有一个NP完全问题有多项式算法可以求解,那么所有NP类问题都会有多项式算法。这是因为任何NP问题都可以多项式归约到NP完全问题,而NP完全问题有多项式算法,所以所有NP问题都有多项式算法。
实际例子:
NP完全问题示例:
1. 可满足性问题(SAT):
- 第一个被证明的NP完全问题(Cook定理,1971)
- 输入:布尔表达式
- 判定:是否存在赋值使得表达式为真?
2. 哈密尔顿回路问题:
- 输入:图G
- 判定:是否存在哈密尔顿回路?
- 证明:可以通过SAT归约证明
3. 顶点覆盖问题:
- 输入:图G,整数k
- 判定:是否存在k个顶点的覆盖?
- 证明:可以通过3-SAT归约证明
3.2 NP完全问题的重要性(Importance of NP-Complete Problems)
概念的本质:
定理14.4:任何一个NPC语言有多项式判定算法当且仅当 P = N P P = NP P=NP。
证明:
- 如果某个NPC语言 L L L有多项式算法来判定,那么 L ∈ P L \in P L∈P
- 又因为 L ∈ N P C L \in NPC L∈NPC,任何一个NP语言 L ′ L' L′可以多项式归约到 L L L,即 L ′ ≤ p L L' \leq_p L L′≤pL
- 由定理14.1, L ′ L' L′可以被一个多项式算法所判定,所以有 L ′ ∈ P L' \in P L′∈P
- 这就意味着 N P ⊆ P NP \subseteq P NP⊆P,但由定理14.3, P ⊆ N P P \subseteq NP P⊆NP,所以得到 P = N P P = NP P=NP
- 反之,如果 P = N P P = NP P=NP,那么因为 N P C ⊆ N P = P NPC \subseteq NP = P NPC⊆NP=P,所以任何一个NPC语言 L L L有多项式算法判定
推论14.5:如果一个NPC语言 L L L没有多项式算法,那么 P ∩ N P C = ∅ P \cap NPC = \emptyset P∩NPC=∅。
图解说明:
💡 说明:到目前为止,人们还不知道是否有一个NPC语言 L L L可以被一多项式算法所判定,也没有能够证明任何一个NPC语言 L L L不可能被一多项式算法所判定。因此,集合 P P P、 N P NP NP、和 N P C NPC NPC的关系有两种可能,但大部分人相信 P ≠ N P P \neq NP P=NP(即 P ⊂ N P P \subset NP P⊂NP, N P C ⊂ N P NPC \subset NP NPC⊂NP),但有待证明。
实际例子:
NP完全问题的重要性:
如果P = NP:
- 所有NP问题都有多项式算法
- 密码学可能不安全
- 许多优化问题可以高效求解
- 人工智能可能更容易
如果P ≠ NP(大多数人相信):
- NP完全问题没有多项式算法
- 只能使用近似算法或启发式算法
- 需要接受近似解或指数时间算法
- 这是当前计算复杂性理论的基础假设
3.3 如何证明一个问题属于NP类(How to Prove a Problem is in NP)
概念的本质:
证明步骤:
- 设计证书:为问题的每个yes实例设计一个证书 y y y, ∣ y ∣ ≤ ∣ x ∣ c |y| \leq |x|^c ∣y∣≤∣x∣c
- 设计检验算法:设计一个多项式时间的检验算法 A ( x , y ) A(x, y) A(x,y)
- 证明正确性:
- 如果 π ( x ) = y e s \pi(x) = yes π(x)=yes,则存在证书 y y y使得 A ( x , y ) = 1 A(x, y) = 1 A(x,y)=1
- 如果 π ( x ) = n o \pi(x) = no π(x)=no,则不存在证书 y y y使得 A ( x , y ) = 1 A(x, y) = 1 A(x,y)=1
- 证明复杂度:证明检验算法 A A A的时间复杂度是多项式的
图解说明:
💡 说明:在证明一个问题 π \pi π是NP类问题时,可设计一个NP-算法 A A A,它检验 π \pi π的每一个实例 x x x,在这个实例有yes答案时,它在多项式时间内输出 A ( x , y ) = 1 A(x, y) = 1 A(x,y)=1。这里, y y y是能证明 π ( x ) = y e s \pi(x) = yes π(x)=yes的证书, ∣ y ∣ ≤ ∣ x ∣ c |y| \leq |x|^c ∣y∣≤∣x∣c。
实际例子:
证明哈密尔顿回路问题属于NP类:
问题:判断有向图G(V, E)是否有哈密尔顿回路
步骤1:设计证书
- 证书y:顶点序列p = (v₁, v₂, ..., vₙ),其中n = |V|
- |y| = O(n),满足|y| ≤ |x|^c
步骤2:设计检验算法
Hamilton-Cycle-Verification(G(V, E), p)
1. 检查是否有|p| = |V|
2. 检查p中每个顶点是否属于集合V
3. 检查V中每个顶点是否在p中出现,并且只出现一次
4. 检查从p中每个顶点到下个顶点是否是E中一条边
5. 检查从p的最后一个顶点到p的第一个顶点是否是E中一条边
6. 如果第1步到第5步的答案都是yes,那么输出1
End
步骤3:证明正确性
- 如果G有哈密尔顿回路,则存在证书p使得算法输出1
- 如果G没有哈密尔顿回路,则不存在证书p使得算法输出1
步骤4:证明复杂度
- 步骤1:O(1)
- 步骤2:O(n)
- 步骤3:O(n)
- 步骤4:O(n)
- 步骤5:O(1)
- 总复杂度:O(n²),多项式时间 ✓
因此:哈密尔顿回路问题 ∈ NP
3.4 如何证明一个问题是否是NP完全的(How to Prove NP-Completeness)
概念的本质:
证明步骤:
- 证明属于NP类:证明问题 π \pi π属于NP类(见3.3节)
- 选择已知NPC问题:选择一个已知的NP完全问题 π ′ \pi' π′
- 构造归约:构造一个多项式时间的转换函数 f f f,将 π ′ \pi' π′的实例转换为 π \pi π的实例
- 证明归约正确性:
- 证明: π ′ ( x ) = y e s \pi'(x) = yes π′(x)=yes当且仅当 π ( f ( x ) ) = y e s \pi(f(x)) = yes π(f(x))=yes
- 证明:转换函数 f f f是多项式时间的
- 得出结论:由于 π ′ ≤ p π \pi' \leq_p \pi π′≤pπ且 π ′ \pi' π′是NP完全的,所以 π \pi π也是NP完全的
图解说明:
💡 说明:实际运用的时候,通常是把一个已知的NP完全问题规约到你所研究的问题上,从而证明你所研究的问题也是NP完全的。这是因为如果 π ′ ≤ p π \pi' \leq_p \pi π′≤pπ且 π ′ \pi' π′是NP完全的,那么对于任何NP问题 L L L,有 L ≤ p π ′ ≤ p π L \leq_p \pi' \leq_p \pi L≤pπ′≤pπ,所以 L ≤ p π L \leq_p \pi L≤pπ,因此 π \pi π也是NP完全的。
实际例子:
证明顶点覆盖问题是NP完全的:
步骤1:证明顶点覆盖问题 ∈ NP
- 证书:k个顶点的集合S
- 检验算法:检查S是否覆盖所有边
- 复杂度:O(m),多项式时间 ✓
步骤2:选择已知NPC问题
- 选择:3-SAT问题(已知是NP完全的)
步骤3:构造归约
- 给定3-SAT实例:布尔表达式φ,有m个子句
- 构造图G:
- 对每个变量xᵢ,创建两个顶点xᵢ和¬xᵢ
- 对每个子句Cⱼ = (l₁ ∨ l₂ ∨ l₃),创建3个顶点
- 连接边:子句顶点与对应文字顶点相连
- 设置k = m + 变量数
步骤4:证明归约正确性
- 如果3-SAT有解,则存在k个顶点的覆盖
- 如果图G有k个顶点的覆盖,则3-SAT有解
- 转换时间:O(m),多项式时间 ✓
步骤5:结论
- 顶点覆盖问题是NP完全的 ✓
📝 本章总结
核心要点回顾:
-
判定型问题和优化型问题:
- 判定型问题:答案只有是或否
- 优化型问题:要求最优数值
- 优化型问题可以转化为判定型问题
-
P类和NP类:
- P类:多项式时间可判定的问题
- NP类:多项式时间可检验的问题
- P ⊆ N P P \subseteq NP P⊆NP(定理14.3)
- 未知: P = N P P = NP P=NP还是 P ≠ N P P \neq NP P=NP?
-
NP完全问题:
- 定义: L ∈ N P L \in NP L∈NP且 ∀ L ′ ∈ N P , L ′ ≤ p L \forall L' \in NP, L' \leq_p L ∀L′∈NP,L′≤pL
- 特性:如果有一个NP完全问题有多项式算法,则 P = N P P = NP P=NP
- 重要性:NP类中最难的问题
-
证明方法:
- 证明属于NP类:设计证书和多项式检验算法
- 证明NP完全性:证明属于NP类 + 将已知NPC问题归约到该问题
-
多项式归约:
- 如果 π 1 ≤ p π 2 \pi_1 \leq_p \pi_2 π1≤pπ2,则 π 2 \pi_2 π2至少和 π 1 \pi_1 π1一样难
- 如果找到 π 2 \pi_2 π2的多项式算法,则 π 1 \pi_1 π1也有多项式算法
知识地图:
关键决策点:
- 如何证明问题属于NP类:设计证书和多项式检验算法
- 如何证明问题是NP完全的:证明属于NP类 + 将已知NPC问题归约到该问题
- 如何选择归约的源问题:选择与目标问题结构相似的已知NPC问题
- 如何构造归约:将源问题的实例转换为目标问题的实例,保持答案的一致性
💡 延伸学习:NP完全问题是计算复杂性理论的核心,掌握它们有助于我们:
- 理解问题的计算难度
- 选择合适的算法策略(精确算法 vs 近似算法 vs 启发式算法)
- 为研究新的计算问题提供理论基础
深入理解NP完全问题及证明方法
17

被折叠的 条评论
为什么被折叠?



