MathLabs

应用与计算数学

计算复杂性:P与NP

根据求解所需时间的增长方式对问题分类,核心问题是P是否等于NP。

直观为何有些谜题验证容易而求解困难

从头解一个数独谜题可能要花很长时间,一个可能性接一个可能性地尝试。但如果朋友递给你一个已填好的方格并声称它解开了谜题,验证这个说法却很快:只需扫描每一行、每一列、每个小方块是否有重复数字。打乱的一副扑克牌排序则不同——用任何排序方法几遍就能求解,验证也同样快。计算复杂性理论把这种日常的区分——「求解容易」与仅仅「验证一个解容易」——变得在数学上精确,并追问这种区分究竟是真实存在还是虚幻的。

一个由边连接顶点组成的网络,其中一部分边被高亮,构成一条恰好经过每个顶点一次的单一环路。
在这个图中我们要问:是否存在一条恰好访问每个顶点一次的环(哈密顿环)?从头寻找这样的环似乎需要搜索许多种顶点排列方式,但高亮显示的候选环只需一遍扫描就能验证:只需确认每对相邻顶点确实由一条边相连,并且每个顶点恰好出现一次。

中学度量运行时间:多项式增长与指数增长

算法的运行时间通常用输入规模 nn 的函数来度量,使用大O记号:T(n)=O(f(n))T(n) = O(f(n)) 表示当 nn 足够大时,运行时间的增长不会快于 f(n)f(n) 的某个常数倍。对包含 nn 个元素的未排序列表逐一查找需要 O(n)O(n) 步;对包含 nn 个元素的已排序列表进行二分查找只需 O(log⁡n)O(\log n) 步。两者关于 nn 都是多项式的(实际上是次线性或线性的)。相比之下,尝试 nn 个元素的每一个子集需要 O(2n)O(2^n) 步——关于 nn 是指数级的,一旦 nn 超过几十,速度就会慢得多。

不同增长速率如何随输入规模 nn 变化
增长速率n=10n=10n=20n=20n=50n=50
O(n)O(n)101020205050
O(n2)O(n^2)1001004004002,5002{,}500
O(2n)O(2^n)1,0241{,}024≈1.05×106\approx 1.05\times 10^6≈1.13×1015\approx 1.13\times 10^{15}

大学类 P 与 NP

定义: 类 P

P(多项式时间)是标准计算机能够在输入规模 nn 的某个多项式所界定的时间内——即对某个固定常数 kk 在 O(nk)O(n^k) 时间内——求解的是/否问题的集合。排序、素性检验以及图中最短路径的求解都属于 P。

定义: 类 NP

NP(非确定性多项式时间)是这样一类是/否问题的集合:对于提出的「是」这一答案,都伴随着一个证书(见证,例如上面的哈密顿环或某公式的一个满足赋值),能够在多项式时间内被验证其正确性,尽管一般而言并不知道有多项式时间的方法能找到这样的证书。P 中的每个问题也都属于 NP(若能快速求解,验证自然也快速),因此 P⊆NPP \subseteq NP;反向包含是否成立正是 P 与 NP 问题的核心。

P=⋃k≥1TIME(nk)P = \bigcup_{k \ge 1} \mathrm{TIME}(n^k)

形式化地说,语言 LL 属于 NP,是指存在一个多项式 pp 和一个多项式时间验证器 VV,使得 x∈Lx \in L 当且仅当存在证书 yy 满足 ∣y∣≤p(∣x∣)|y| \le p(|x|) 且 V(x,y)V(x,y) 接受。这种基于验证器的定义与更常见的「非确定性图灵机」定义等价,在实践中通常也更容易推理。

x∈L  ⟺  ∃ y, ∣y∣≤p(∣x∣), V(x,y)=acceptx \in L \iff \exists\, y,\ |y| \le p(|x|),\ V(x,y) = \text{accept}

大学多项式时间归约与NP完全性

定义: 多项式时间归约

问题 AA 在多项式时间内归约到问题 BB,记作 A≤pBA \le_p B,是指存在一个可在多项式时间内计算的函数 ff,把 AA 的任意实例 xx 变换为 BB 的实例 f(x)f(x),使得 xx 是 AA 的「是」实例当且仅当 f(x)f(x) 是 BB 的「是」实例。直观地说,A≤pBA \le_p B 意味着「BB 至少和 AA 一样难」:只要有 BB 的快速算法,通过变换后调用它就立即得到 AA 的快速算法。

定义: NP完全

问题 BB 是NP完全的,是指 B∈NPB \in NP 且每个问题 A∈NPA \in NP 都满足 A≤pBA \le_p B。NP完全问题是 NP 中「最难」的问题:其中任何一个问题若有高效算法,通过归约就能转化为 NP 中每一个问题的高效算法。

布尔可满足性问题(SAT)——给定关于变量 x1,…,xmx_1,\dots,x_m 的布尔公式,判断是否存在某种真/假赋值使其为真——是NP完全的。

为什么成立?

SAT显然属于NP:一个满足赋值就是一个证书,只需代入数值就能在多项式时间内验证。深刻之处在于证明每个NP问题都归约到SAT——这之所以成立,是因为布尔公式的表达能力足以逐步、逐格、逐时刻地描述任意多项式时间验证器的整个运行过程,于是「是否存在证书」就变成了「这个庞大的公式是否可满足」。

证明

设 A∈NPA \in NP,其多项式时间验证器 VV 在长度为 nn 的输入配合长度至多为 nkn^k 的证书上运行时间至多为 nkn^k。固定一个长度为 nn 的输入 xx;我们构造一个布尔公式 ϕx\phi_x,使其可满足当且仅当存在某个证书能让 VV 接受。

设想 VV 在 (x,y)(x,y) 上的整个计算过程(对未知证书 yy)被排列成一个表格(tableau):一个 nk×nkn^k \times n^k 的网格,第 tt 行记录验证器在时刻 tt 的完整带内容与读写头位置。为每个(单元格、时刻、可能符号)三元组引入一个布尔变量,记录该时刻该单元格所放的符号——由于网格的单元格数与时刻数都是多项式量级,这只是多项式数量的变量。

公式 ϕx\phi_x 构造为若干子句的合取(AND),这些子句强制四个局部的、易于检验的条件:(1) 每个时刻每个单元格恰好持有一个符号;(2) 第 00 行正确编码了固定输入 xx,其后跟着尚待猜测的证书 yy 的空白占位;(3) 相邻两个时刻之间每个小窗口内的相邻单元格都与 VV 的转移规则一致(正是在这里,第 00 行中自由的证书比特得以影响之后的计算);(4) 最终时刻的某个单元格记录接受状态。

这些条件中的每一个都只约束变量的一个小的、固定大小的邻域,因此每个条件都转化为常数个子句,而需要约束的邻域个数也只是多项式个——所以 ϕx\phi_x 的规模是多项式的,并且能从 xx 在多项式时间内计算出来。按此构造,ϕx\phi_x 可满足当且仅当存在一个一致的表格,也就是当且仅当存在某个证书 yy 使 V(x,y)V(x,y) 接受,也就是当且仅当 x∈Ax \in A。这就展示了对任意 A∈NPA \in NP 的归约 A≤pSATA \le_p \text{SAT},结合前面证明的 SAT∈NP\text{SAT} \in NP,就证明了SAT是NP完全的。

若 BB 是NP完全的且 B∈PB \in P,则 P=NPP = NP。

为什么成立?

BB 的NP完全性意味着每个NP问题都可以在多项式时间内被改写为 BB 的一个实例。若 BB 本身能在多项式时间内求解,将改写步骤与求解步骤串联起来,就同样能在多项式时间内解出原来的NP问题——因此,只要有一个可行的(易解的)NP完全问题,就会把所有NP问题一起拖入P。

证明

设 BB 是NP完全的,且存在一个在时间 O(nk1)O(n^{k_1}) 内求解 BB 的算法。任取 A∈NPA \in NP;由 BB 的NP完全性可知 A≤pBA \le_p B,即存在一个在时间 O(nk2)O(n^{k_2}) 内可计算的归约函数 ff,把 AA 的实例映射为 BB 的实例,同时保持是/否答案不变。

对 AA 的一个长度为 nn 的输入 xx,先计算 f(x)f(x):这需要时间 O(nk2)O(n^{k_2}),特别地输出 f(x)f(x) 的长度至多为 O(nk2)O(n^{k_2})(多项式时间算法写出的输出不能比其运行时间更长)。然后在 f(x)f(x) 上运行求解 BB 的多项式时间算法:由于 ∣f(x)∣=O(nk2)|f(x)| = O(n^{k_2}),这需要时间 O((nk2)k1)=O(nk1k2)O\big((n^{k_2})^{k_1}\big) = O(n^{k_1 k_2})。

总运行时间为 O(nk2)+O(nk1k2)=O(nk1k2)O(n^{k_2}) + O(n^{k_1 k_2}) = O(n^{k_1 k_2}),仍是关于 nn 的多项式(两个多项式的复合仍是多项式)。由归约的正确性,xx 是 AA 的「是」实例当且仅当 f(x)f(x) 是 BB 的「是」实例,因此这一组合过程能在多项式时间内正确判定 AA。

由于 A∈NPA \in NP 是任意的,每个NP问题都有多项式时间算法,即 NP⊆PNP \subseteq P。结合恒成立的包含关系 P⊆NPP \subseteq NP,即得 P=NPP = NP。

一些著名问题的复杂性状态
问题已知状态
对列表排序属于P:O(nlog⁡n)O(n\log n) 次比较即可
素性检验自2002年起属于P(AKS算法)
布尔可满足性(3-SAT)NP完全(库克–列文,1971年)
旅行商问题(判定版)NP完全
图同构属于NP;自2015年起有拟多项式算法(Babai);尚不知是否属于P或NP完全
整数分解属于NP且属于co-NP;尚不知是否属于P——RSA安全性所依赖的困难性假设

大学实际应用与典型例题

认识到一个问题是NP完全的具有立竿见影的实用价值:它告诉工程师应停止寻找精确且始终快速的算法,转而采用启发式方法、近似算法或利用特殊结构。这也是现代密码学(RSA的安全性依赖于分解因数很难)、物流与调度(车辆路径规划、考试排期)、生物信息学(蛋白质结构预测、各种序列比对变体)以及编译器优化(寄存器分配就是图着色问题,是NP完全的)的基础。

例题: 把顶点覆盖转化为独立集合

考虑 55 个顶点 {1,2,3,4,5}\{1,2,3,4,5\} 上的路径图,边为 (1,2),(2,3),(3,4),(4,5)(1,2), (2,3), (3,4), (4,5)。利用「具有 nn 个顶点的图 GG 有大小为 kk 的顶点覆盖当且仅当它有大小为 n−kn-k 的独立集合」这一事实,并已知 {1,3,5}\{1,3,5\} 是该图的一个最大独立集合,求最小顶点覆盖的大小。

解答

首先验证 {1,3,5}\{1,3,5\} 确实是独立集:边 (1,2),(2,3),(3,4),(4,5)(1,2), (2,3), (3,4), (4,5) 中没有一条边的两个端点都在 {1,3,5}\{1,3,5\} 中,因此所选的任意两个顶点都不相邻,确认这是一个大小为 33 的有效独立集;它是最大的,因为一条 55 顶点的路径不可能有 44 个两两不相邻的顶点(沿着唯一的一条路径,总会有两个顶点相邻)。

以 n=5n=5、独立集大小为 33 应用归约公式:最小顶点覆盖大小 =n−3=5−3=2= n - 3 = 5 - 3 = 2。

直接验证:补集 {2,4}\{2,4\} 应该是一个顶点覆盖。检查每条边是否至少有一个端点在 {2,4}\{2,4\} 中:边 (1,2)(1,2) 触及 22;边 (2,3)(2,3) 触及 22;边 (3,4)(3,4) 触及 44;边 (4,5)(4,5) 触及 44。全部四条边仅用 22 个顶点就被覆盖,验证了答案。

顶点覆盖与独立集之间的这种等价关系,正是上文所讨论的那种多项式时间归约(实际上这里是一种非常简单、可在线性时间内计算且可逆的归约):顶点覆盖和独立集都是NP完全的判定问题,这个归约表明它们在精确意义上是同一个问题从两个不同角度的呈现。

例题: 为何暴力搜索在中等规模下就会失败

对于具有 nn 个布尔变量的可满足性问题,一个暴力算法会检查所有 2n2^n 种可能的真/假赋值,在一台快速计算机上每个赋值大约花费 10−910^{-9} 秒(一纳秒)。请估计,精确到最接近的十的幂,当 n=50n=50 个变量时,这种暴力搜索需要多少秒。

解答

需要检查的赋值数为 2502^{50}。由于 210=1024≈1032^{10} = 1024 \approx 10^3,我们有 250=(210)5≈(103)5=10152^{50} = (2^{10})^5 \approx (10^3)^5 = 10^{15};更精确地说 250≈1.1259×10152^{50} \approx 1.1259 \times 10^{15}。

乘以每个赋值 10−910^{-9} 秒的开销,总时间约为 1.1259×1015×10−9=1.1259×1061.1259 \times 10^{15} \times 10^{-9} = 1.1259 \times 10^{6} 秒。

精确到最接近的十的幂,约为 10610^{6} 秒——大约连续计算 1111 到 1313 天,而这仅仅是 n=50n=50 个变量,这在实际应用中被视为很小的规模(工业界的SAT实例经常有成千上万甚至数百万个变量)。

这正是为什么多项式时间与指数时间的区分在实践中而不仅仅在理论上如此重要:一个假想的、比如在 n3n^3 步内运行的多项式算法只需要 503=125,00050^3 = 125{,}000 步——只是毫秒的一小部分——这说明了P与NP问题具有多么巨大的实际利害关系。

当 n=20n=20 时,n3n^3 与 2n2^n 哪个更大?

「NP」实际上代表什么?

根据库克–列文定理,哪个问题是史上第一个被证明为NP完全的问题?

如果有人为某个NP完全问题(例如SAT)发现了一个多项式时间算法,会得出什么结论?

参考文献

  1. Stephen A. Cook (1971). The Complexity of Theorem-Proving Procedures · DOI:10.1145/800157.805047
  2. Michael Sipser (2012). Introduction to the Theory of Computation
  3. Michael R. Garey, David S. Johnson (1979). Computers and Intractability: A Guide to the Theory of NP-Completeness
  4. Clay Mathematics Institute (2000). P vs NP Problem