Archipelago

Lec 19计算复杂性

讲义完成更新于 2026-09-16
后续

当前课程暂无后续已收录内容。

Lec 19 计算复杂性

资料依据:课程视频与 transcript · Lecture notes

TL;DR

  • 复杂性理论常把问题写成是否问题,以统一讨论可判定性、验证器和多项式时间。
  • PP 包含可在多项式时间求解的判定问题;NPNP 包含给定一个多项式长度证书后可在多项式时间验证的问题。
  • 多项式时间规约把一个问题的实例转换为另一个问题的实例,并保持答案;它是比较问题难度和建立 NP 完全性的主要工具。

决策问题

决策问题是将输入分为YES (1) 或 NO (0)的任务。例如,“s-t 最短路径问题”是一个典型的决策问题,它询问给定图 G 中是否存在从节点 s 到节点 t 的权重不超过某个值 d 的路径。

更多例子:

  • s-t 最短路径问题: 是否存在一条从 s 到 t 的路径,其权重小于等于 d?
  • 负权重环问题: 图 G 中是否存在一个负权重环?
  • 最长简单路径问题: 图 G 中是否存在一条简单路径,其权重大于等于 d?
  • 子集和问题: 给定整数集合 A,是否存在一个子集使得它们的和等于 S?
  • 俄罗斯方块问题: 给定的方块序列和棋盘,是否可以存活下来?
  • 国际象棋问题: 给定的棋盘状态下,玩家是否可以强制赢得比赛?
  • 停机问题: 给定一个计算机程序和输入,程序是否会终止?

算法/程序的定义: 解决问题的程序是有限长度的代码,能在**字长为Ω(log n)**的计算机模型上运行,并对每一个输入给出正确的输出。

可判定(decidable)问题: 如果存在一个程序能在有限时间内解决某个问题,则称这个问题是可判定的。

判定与不可判定性

决策问题的定义:一个函数,将输入→\rightarrow {YES, NO},而输入本质上≈\approx 一串无限比特,或者说是一个数字 ,是不可数的(对应实数集 R)。

程序是一个有限长度的比特串,虽然程序的数量是可数的(对应自然数集 N)。这意味着没有足够的程序来解决所有问题, 所以大多数问题是不可判定的。

例子: 停机问题(Halting Problem)是不可判定(∉R\notin R)的,不能通过任何程序在有限时间内解决。这类不可判定性可以通过康托尔的对角线论证方法证明。

P, NP, EXP, R 问题

  • P = { 能够在多项式时间解决(或者叫多项式时间可判定)的问题 }

    • 时间复杂度nO(1)n^{O(1)}, n 是问题输入规模
  • NP = { 通过“幸运“算法,能够在多项式时间解决的决策问题 }

    • 正式的说是, 非确定性多项式时间
    • 非正式说,算法可以做出决策,并且决策总是幸运的命中最佳的一个
  • EXP = { 在指数时间可解决的问题 }

    • 时间复杂度2nO(1)2^{n^{O(1)}}
    • 大部分问题在这个层面
  • R = { 能够在有限时间完成的问题 }

    • R 来自 recursive languages

计算复杂性图示 1

非确定性多项式时间(NP)

  • P 是这样一类决策问题的集合:对于每一个大小为 n 的输入 I,存在一个算法 A,使得 A 在输入 I 上的运行时间是多项式级别的 poly(n) ,并且能够正确解决问题 I。

  • NP 是这样一类决策问题的集合:存在一个验证(verification)算法 V,这个算法接受两个输入,输入问题的实例 I ,和证书(certificate) c ,该算法满足以下条件:

    • V 对于输入大小 I 的问题,总是以多项式时间运行;

      • 不会随着输入大小急剧增加
    • 如果 I 是一个 "YES" 输入(这个问题有解),那么存在某个证书 c,使得当验证算法 V 接受输入 (I,c)(I, c) 时,会输出“YES”。

    • 如果 I 是一个 "NO" 输入(即这个问题无解),那么无论选择什么证书 c,使得当验证算法 V 接受输入 (I,c)(I, c) 时,总是输出 "NO"。

  • 你可以将这个证书看作是证明 I 是 "YES" 输入的证明。 如果 I 实际上是一个 "NO" 输入,那么任何证明都不应该起作用。

P ⊆ NP: 对于 P 类问题,验证算法 V 可以直接忽略证书并解决问题实例。

NP ⊆ EXP: 尝试所有可能的证书!最多有 2nO(1)2^{n^{O(1)}} 个证书,运行验证算法 V 来验证所有这些证书。

悬而未决的问题:P = NP 吗?NP = EXP 吗?

大多数人认为P⊂NP⊂EXPP \subset NP \subset EXP,即生成解比验证解要难得多。

我们为什么关心这个问题? 如果能证明某个问题是 NP 中最难的问题,那么如果 P≠NPP \neq NP,该问题在多项式时间内就无法被解决。

我们如何比较问题的难度? 通过“归约”(reductions)!

规约

假设你想解决问题 A, 一种解决方法是将问题 A 转化为你知道如何解决的另一个问题 B, 使用解决问题 B 的算法,然后用它来计算问题 A 的解,这叫做从问题 A 到问题 B 的归约(A → B),因为可以用 B 来解决 A,所以 B 至少和 A 一样难(A ≤ B)

通常的算法策略是:将问题归约为你知道如何解决的问题。

问题 A 是**NP 难(NP-hard)**的,如果每个 NP 问题都能多项式时间归约到问题 A, 即,A 至少和 NP 中的每个问题一样难(对任意X∈NPX \in NP , X≤AX \leq AX≤A)

NP 完全(NP-complete) = NP∩NP-hardNP \cap NP\text{-}hardNP∩NP-hard

所有 NP 完全问题都是等价的,即可以互相归约

第一个 NP 完全问题?每个决策问题都可以归约到满足逻辑电路的问题,这个问题叫做“电路可满足性问题(Circuit SAT)”。

最长简单路径和俄罗斯方块是 NP 完全问题,所以如果 NP 中的某个问题不属于 P,那么这些问题也是。

国际象棋是 EXP 完全(EXP-complete):属于 EXP,并且可以从 EXP 中的每个问题归约过来(所以它不属于 P)。

我的理解

我的理解

规约的方向容易写反:要证明新问题 BB 至少与已知难问题 AA 一样难,需要构造 AleqpBAleq_p B。这表示如果能快速求解 BB,就会同时快速求解 AA。