【笔记】复杂性理论
上接 可计算理论
相比可解性,我们还关注一些可解问题的效率——是否存在一个“高效”算法?
计算复杂性理论关注问题是否“实际可解”
时间复杂性度量
Def. 时间复杂度 time complexity
确定型:设 \(M\) 是一个在所有输入上都停机的确定型图灵机。\(M\) 的“运行时间”或者“时间复杂度”是一个函数 \(f:\N→\N\),\(f(n)\) 是 \(M\) 在所有长度为 \(n\) 的输入上运行时所经过的最大步数。
对应地,称 \(M\) 在时间 \(f(n)\) 内运行,\(M\) 是 \(f(n)\) 时间的图灵机。
非确定型:设 \(N\) 是一个非确定型图灵机,并且是个判定机。\(N\) 的运行时间是函数 \(f:\N\to\N\),其中 \(f(n)\) 是在任何长度为 \(n\) 的输入上所有计算分支中的最大步数。
进一步地,考虑称为“渐进分析”的估计方法
Def. 渐进上界(\(O,o\))
设函数 \(f,g:\N→\R^+\)。称 \(f(n)=O(g(n))\),若存在正整数 \(c, n _0\),使得对所有 \(n\ge n _0\),有
则称 \(g(n)\) 是 \(f(n)\) 的上界(upper bound),或更准确地说,\(g(n)\) 是 \(f(n)\) 的渐近上界(asymptotic upper bound),以强调没有考虑常数因子。
这种大 \(O\) 记法表示了函数渐进地不大于某个函数;此外还有小 \(o\) 记法,表示函数渐进地小于某个函数:
设函数 \(f,g:\N→\R^+\)。若
则称 \(f(n)=o(g(n))\)。换言之,意味着对于任何实数 \(c>0\),存在一个数 \(n _0\),使得对所有 \(n≥n _0\),\(f(n)<cg(n)\)
例如:\(\sqrt{n}=o(n),f(n)=O(f(n)),f(n)\ne o(f(n))\)
此外,还有一些渐进分析的记号:
Def. \(\Omega\) 记号
设函数 \(f,g:\N→\R^+\)。称 \(f(n)=\Omega(g(n))\),若存在正整数 \(c, n _0\),使得对所有 \(n\ge n _0\),有
Def. \(\Theta\) 记号
设函数 \(f,g:\N→\R^+\)。称 \(f(n)=\Theta(g(n))\),若同时有 \(f(n)=O(g(n)), f(n)=\Omega(g(n))\),即存在正整数 \(c _1, c _2, n _0\),使得对所有 \(n\ge n _0\),有
例如,\(2 ^{\Theta(\log n)}\),等价于 \(2 ^{c _1\log n}\le 2 ^{\Theta(\log n)}\le 2 ^{c _2\log n}\),等价于 \(n ^{c _1}\le 2 ^{\Theta(\log n)}\le n ^{c _2}\),等价于 \(n ^{\Theta(1)}\)
进一步地,用图灵机运行的时间复杂度给语言分类:
Def. 时间复杂性类
设函数 \(t:\N→\R^+\)。定义时间复杂性类(time complexity class)\(\text{TIME}(t(n))\) 为由 \(O(t(n))\) 时间的图灵机判定的所有语言的集合
例题:语言 \(A=\{0 ^n1 ^n|n\in\N\}\)
单带图灵机最优可以在 \(O(n\log n)\) 时间判定 \(A\),从而 \(A\in\text{TIME}(n\log n)\);而多带图灵机就可以 \(O(n)\) 判别;
它们区别在于模型的复杂度,因此我们先考虑一下计算模型的选择如何影响语言的时间复杂度
Th. 模型间的时间复杂度
设函数 \(t(n)\),\(t(n)≥n\)。则每一个 \(t(n)\) 时间的多带图灵机都和某一个 \(O(t ^2(n))\) 时间的单带图灵机等价。
设函数 \(t(n)\),\(t(n)≥n\)。则每一个 \(t(n)\) 时间的非确定型单带图灵机都与某一个 \(2 ^{O(t(n))}\) 时间的确定型单带图灵机等价。
这些都是技术上的事,不多讲述
P 类
Def. P 类(Polynomial time)
\(P\) 是确定型单带图灵机在多项式时间内可判定的语言类:
在理论中,P 类的重要性在于:
- 对于所有与确定型单带图灵机多项式等价的计算模型来说,P 是不变的
- P 大致对应于在计算机上实际可解的那一类问题;当然还是包含了一些复杂度太高的算法
例题:\(\{\lang x,y\rang:\gcd(x,y)=1\}\in P\)
构造子程序 \(E\) 为(欧几里得算法):
\(E=“\) 对输入 \(\lang x,y\rang\),\(x\) 和 \(y\) 是二进制表示的自然数:
\(\quad\) 1. 重复下面的操作,直到 \(y=0\)
\(\quad\) 2. \(\quad\) 赋值 \(x←x\text{ mod } y\)
\(\quad\) 3. \(\quad\) 交换 \(x,y\)
\(\quad\) 4. 输出 \(x\ ”\)
从而求解该问题的算法 \(R\) 为
\(R=“\) 对输入 \(\lang x,y\rang\),\(x\) 和 \(y\) 是二进制表示的自然数:
\(\quad\) 1. 在 \(\lang x,y\rang\) 上运行 \(E\)
\(\quad\) 2. 若结果为 \(1\),就接受;否则,就拒绝 \(”\)
复杂度分析:表示长度为 \(O(\log x+\log y)\),运行时间也为 \(O(\log x+\log y)\),故执行步数为 \(O(n)\);\(E\) 的每一步也是消耗多项式时间,故总体运行时间是多项式的
例题:
Th. 每一个上下文无关语言都是 P 的成员
可以用动态规划解决,这是证明 P 常见的方法
NP 类
有些问题的多项式时间算法还没找到。但是,关于该问题的一个不寻常的发现是,许多问题的复杂性是联系在一起的:发现其中一个问题的多项式时间算法就可以用来解决整类问题
为了阐述这个发现,现在我们先从几个例子出发,观察它们具有的某种共性
例题(哈密顿路径):\(\text{HAMPATH}=\{ \lang G,s,t \rang| G 是包含 s 到 t 的哈密顿路径的有向图\}\)
尽管不确定是否有多项式时间算法,但是显然找到路径后,就很容易让人相信其存在。换言之,验证存在性比确定存在性要容易
例题(合数):\(\text{COMPOSITES}=\{\lang x\rang|x=pq\wedge p,q>1\}\)
尽管不确定是否有多项式时间算法,但是显然只需给出该数的一个因子,就能验证之
对于上述关于验证的直觉,形式化定义如下:
Def. 验证机
语言 \(A\) 的验证机(verifier)是一个算法 \(V\),从而
若 \(V\) 在 \(w\) 的长度的多项式时间内运行,则称为多项式时间验证机(polynomial time verifier);若语言 \(A\) 有一个多项式时间验证机,则称它为多项式可验证的(polynomially verifiable)
其中,\(c\) 是验证机 \(V\) 验证 \(w\in A\) 使用的额外信息,也称为 \(A\) 的证书(certificate)或证明(proof);对于多项式时间验证机,证书具有(\(w\) 的)多项式长度,因为验证机在多项式时间内只能访问 \(c\) 的多项式长度的信息
Def. NP 类(Nondeterministic polynomial time)
\(NP\) 是具有多项式时间验证机的语言类
所谓 NP(非确定型多项式时间,nondeterministic polynomial time)来源于非确定型多项式图灵机,这是因为只需构造多项式时间的 NTM,通过猜想证书即可模拟验证机
Th. 一个语言在 NP 中,当且仅当它能被某个非确定型多项式时间图灵机判定
Def. NP 类,等价定义
\(NP\) 是能被不确定型图灵机在多项式时间判定的语言类
例题(团):\(\text{CLIQUE}=\{ \lang G,k\rang|G是包含k团的无向图 \}\in NP\)
其中 \(k\) 团指 \(k\) 个节点的完全子图。证明思路,团就是证书;或者也可以从非确定型多项式图灵机的等价角度来证明,构造对应的 NTM 即可
例题(子集和):\(\text{SUBSET-SUM}=\{ \lang s,t\rang|s=\{x _i\} _{i=1}^{k} \wedge \exist \{y _j\} _{j=1} ^l,\sum _j y_j=t \}\in NP\)
其中 \(\{x _i\} _{i=1}^{k},\{y _j\} _{j=1} ^l\) 为多重集。证明思路,子集就是证书。
NPC 类
显然 \(P\sube NP\),但是目前还不知道是否 \(NP\sube? P\)。
但是,Stephen Cook 和 Leonid Levin 发现 NP 中某些问题的复杂性和整个 NP 类相关联:这些问题中任何一个如果存在多项式时间算法,那么所有 NP 问题都是多项式时间可解的。这些问题称为 NP 完全的(NP-complete, NPC)。试图证明 P 等于 NP 只需为一个 NP 完全问题找到多项式时间算法就可以了
一个 NPC 问题为可满足问题(satisfiability problem, SAT),后面会进行说明
现在先让我们考虑下,什么叫做“一个多项式可解、另一个就可解”?引入“多项式时间可规约”:
Def. 多项式时间可计算函数
若存在多项式时间图灵机 \(M\),使得在任何输入 \(w\) 上,\(M\) 停机时 \(f(w)\) 恰好在带子上,则称函数 \(f:\Sigma ^ * → \Sigma ^{ * }\) 为多项式时间可计算函数(polynomial time computable function)
Def. 多项式时间可规约
语言 \(A\) 称为多项式时间(映射)可归约(polynomial time (mapping) reducible)到语言 \(B\),记为 \(A≤ _P B\),若存在多项式时间可计算函数 \(f:\Sigma ^ * →\Sigma ^{ * }\),对于每一个 \(w\),有
函数 \(f\) 称为 \(A\) 到 \(B\) 的多项式时间归约(polynomial time reduction)
它的含义就是将对 \(w\in A\) 的判定有效地转化成对 \(f(w)\in B\) 的判定。它和 \(\le _m\) 的区别就是受到“多项式时间”的约束
显然有定理:
Th. 多项式时间规约的性质
- 若 \(A\le _P B, B\le _P C\),则 \(A\le _P C\)
- 若 \(A\le _P B,B\in P\),则 \(A\in P\)
- 若 \(A\le _P B,A\notin P\),则 \(B\notin P\)
- 若 \(A\le _P B,B\in NP\),则 \(A\in NP\)
- 若 \(A\le _P B,A\notin NP\),则 \(B\notin NP\)
现在可以利用多项式时间可规约,对 NP 完全做一个定义
Def. NP 完全(NP-complete, NPC)
如果语言 \(B\) 满足下面两个条件,就称为 NP 完全:
- \(B\in NP\)
- \(NP\) 中的每个 \(A\) 都多项式时间可归约到 \(B\)
注意到,条件 2 并不能推出 1;因此还有 NP-Hard 问题的定义:
Def. NP 难问题(NP‐Hard)
问题 \(B\) 是 NP 难问题,当且仅当 \(NP\) 中的每个 \(A\) 都多项式时间可归约到 \(B\)
显然有如下定理
Th. 若 \(B\in NPC,B\in P\),则 \(P=NP\)
Th. 若 \(B\in NPC,B\le _P C, C\in NP\),则 \(C\in NPC\)
可见一个问题是 NPC 问题,说明它目前对我们来说很难,但还不足以说明它不存在多项式算法
总之,现在我们要找出第一个 NPC 问题了,它就是可满足问题 \(\text{SAT}\)
Def. 布尔表达式的一些术语,简要介绍
称布尔变量 \(x\) 或者其非 \(\bar{x}\) 为文字(literal)
令布尔表达式 \(φ\) 所有变量表示为 \(\text{var}(φ)\),则 \(φ\) 的赋值 \(\tau\) 是一个形如 \(\text{var}(φ)\to\{0, 1\}\) 的函数,\(\tau(φ)\) 表示表达式 \(φ\) 在赋值 \(\tau\) 下的取值
布尔表达式 \(φ\) 是可满足的当且仅当存在 \(\tau\) 使得 \(\tau(φ) = 1\)
Def. 可满足问题(satisfiability problem, SAT)
Th.(库克-列文定理) \(\text{SAT}\in NPC\)
Co. \(\text{SAT}\in P\),当且仅当 \(P=NP\)
如何证明呢?
TODO p193-195为了增加上这课的价值,我们来学一下方法
首先,很容易证明 \(\text{SAT}\in NP\),我们取非确定型图灵机猜测 \(\phi\) 的一个赋值,当赋值满足 \(\phi\) 时接受之
接下来,对应任意 \(A\in NP\),证明 \(A\le _P \text{SAT}\):假设 \(N\) 是在 \(n ^k\) 时间判定 \(A\) 的非确定型图灵机,我们将运行在 \(w\) 上的 \(N\) 的每一个计算分支都对应转化成一个“画面”:将从起始格局开始的每一个格局(形如 \(\#X _1 X _2\dotsb q X _i\dotsb X _m\#\))都逐行列成一个 \(n ^k\times n ^k\) 的表格,若表格内某一行为接受格局,则称该画面为接受画面,从而接受等价于存在一个接受画面
现在描述 \(A\) 到 \(\text{SAT}\) 的多项式时间规约 \(f\):对于算法 \(A\) 的输入 \(w\),生成布尔表达式 \(\phi=f(w)\)。思想很简单,我们只需通过这个接受画面生成一个应当被满足的布尔表达式来刻画它,并且反之布尔表达式被满足也意味着存在对应的一个接受画面,我们就大功告成了
如何刻画?一个画面包括 \((n ^k) ^2\) 个格子,每个格子分别是 \(\{Q, \Gamma, \#\}\) 的一个元素,因此,定义变量 \(x _{i,j,s}\),其中 \(i,j\in[2 ^k], s\in \{Q, \Gamma, \#\}\),从而 \(x _{i,j,s}=1\) 意味着格子 \([i,j]\) 为符号 \(s\)
现在利用这些变量刻画一个合法的接受画面——也就是构造一个被满足时与接受画面等价的布尔表达式 \(\phi\)
\(\phi\) 由四个部分组成,为:\(\phi = \phi _{cell}\wedge \phi _{start}\wedge \phi _{accept}\wedge\phi _{move}\),分别刻画了一个合法的接受画面需要满足的四个方面:
\(\phi _{cell}\) 刻画:每个格子有且只有一个符号,如下:\[\phi _{cell} = \bigwedge _{1\le i,j\le n ^k}\Big[ \big(\vee _{s} x _{i,j,s}\big)\wedge \big(\wedge _{s\ne t} (\overline{x _{i,j,x}}\vee\overline{x _{i,j,t}})\big)\Big] \]\(\phi _{start}\) 刻画:第一行是起始格局,如下:
\[\phi _{start} = x _{1,1,\#}\wedge x _{1,2,q _0}\wedge x _{1,3,w _1}\wedge x _{1,4,w _2}\wedge \dotsb\wedge x _{1,n +2,w _n}\wedge x _{1,n+3, \_}\wedge\dotsb\wedge x _{1,n ^k-1, \_}\wedge x _{1,n ^k, \#} \]\(\phi _{accept}\) 刻画:接受格局在画面中,如下:
\[\phi _{accept} = \bigvee _{1\le i,j\le n ^k} x _{i,j,q _{accept}} \]\(\phi _{move}\) 刻画:每一步转移都是合法的;事实上相邻两行的转移只体现在某个 \(2\times 3\) 的格子里,事实上枚举一下可以知道对于每个 \(2\times 3\) 的格子,合法的形式有限(如果实在不放心,\(2\times 4\) 也行),所以这一部分是可以刻画出来的
综上,这个规约是多项式时间的,且存在接受画面和可满足性是等价的,得证
现在,若我们试图证明某个 \(A\) 为 NPC,就可以证明 \(\text{SAT}\le _P A, A\in NP\);当然,我们可以使用更简单的 \(\text{3SAT}\) 完成这个过程
考虑 \(\text{SAT}\) 的特殊情况 \(\text{CNF-SAT, 3SAT}\)
Def. \(\text{CNF-SAT, 3SAT}\)
称布尔变量 \(x\) 或者其非 \(\bar{x}\) 为文字,称由 \(\vee\) 连接的若干文字为子句,称由 \(\wedge\) 连接的若干子句为合取范式(cnf 公式);特别地,若所有子句都只有三个文字,则称为 3cnf 公式
Th. \(\text{CNF-SAT}\in NPC\)
Th. \(\text{3SAT}\in NPC\)
证明,可以通过 \(\text{SAT}\le _P \text{CNF-SAT}\le _P\text{3SAT}\)
或者直接证明 \(\forall A\in NP, A\le _P \text{CNF-SAT, 3SAT}\),可以利用库克-列文定理的证明
总之,只需稍加修改令布尔表达式 \(\phi\) 转化为 \(cnf,3cnf\),然后沿用该证明即可
转化成 \(cnf\) 简单,就是布尔表达式的等价运算
转化成 \(3cnf\) 也不难,事实上我们在 \(cnf\) 的基础上,有如下方式等价地填充/拆开一个子句 \(x _1\vee x _2\vee\dotsb\vee x _k\):
- 填充:\(x _1\vee x _2\vee\dotsb \vee x _k \vee x _k\)
- 拆开:\((x _1\vee x _2\vee\dotsb\vee x _{k-1}\vee z)\wedge(x _k \vee \bar{z})\)
现在开始我们的第一个比较跳跃的规约:
Def. 团 \(\text{CLIQUE}=\{ \lang G,k\rang|G是包含k团的无向图 \}\)
Th. \(\text{3SAT}\le _P \text{CLIQUE}\)
Th. \(\text{CLIQUE}\in NPC\)
证明思路,也就是要找到一个多项式时间规约 \(f\):对于 \(\phi=(a _1\vee b _1\vee c _1)\wedge\dotsb\wedge(a _k\vee b _k\vee c _k)\),规约 \(f\) 生成 \(\lang G,k\rang\),其中将 \(\text{3SAT}\) 的每个子句对应生成三个节点,称为一个三元组;然后将组间不是互补文字的节点连边
接下来要证明 \(\phi\in\text{3SAT}\lrArr f(\phi)= \lang G,k\rang\in \text{CLIQUE}\)
前推后,即每个子句里都至少有一个为真,任取其一,在图 \(G\) 里对应的子图显然是 \(k\) 团;后推前,这个 \(k\) 团的每个节点必定分别属于一个三元组,令其对应的文字赋值为真即可,这显然可以做到
在构造从 \(\text{3SAT}\) 到一个语言的多项式时间归约时,我们寻找这个语言中能模拟布尔公式的变量和子句的结构,这种结构有时称为构件(gadget),设计之需要一定的技巧
NP 完全性现象是很广泛的,众多领域中都有 NP 完全问题。由于某些没有被深入认识的原因,多数自然出现的 NP 问题不是 P 类就是 NP 完全的。所以,如果在为一个新的 NP 问题寻找多项式时间算法,付出部分精力尝试证明它是 NP 完全的是一种明智的做法,从而使得最后又归于 P=NP 这个问题上
现在进一步介绍几个 NPC 问题,也可以从它们出发证明更多的 NPC 问题
Def. 顶点覆盖问题 \(\text{VERTEX-COVER} = \{ \lang G,k\rang | G 是具有 k 个节点的顶点覆盖的无向图 \}\)
其中,无向图 \(G\) 的顶点覆盖是节点的一个子集,使得对于 \(G\) 的每条边,都存在子集中某个节点与其关联
Th. \(\text{3SAT}\le _P\text{VERTEX-COVER}\)
Th. \(\text{VERTEX-COVER}\in NPC\)
证明,为布尔表达式 \(\phi\) 构造刻画它的 \(\lang G, k\rang\),思路为,首先每个变量对应的 0/1 赋值对应到图中的变量构件——令其为两个被边连接的节点,这样两个节点之一一定会出现在覆盖中;其次对于子句构件,要寻找这样的结构:它使得顶点覆盖所包含的变量构件结点中,至少有一个结点对应着该子句中至少一个取值为真的文字;子句构建包含三个节点以及于其相连的边。
构造如下:归约 \(f\) 把布尔公式 \(\phi\) 映射为一个图 \(G\) 和值 \(k\)。对于 \(\phi\) 中的每个变量 \(x\),产生一条连接着两个结点的边,把这个构件中的两个结点标记为 \(x, \bar{x}\)。把 \(x\) 赋值为 1 对应于顶点覆盖选择该边的 \(x\) 结点,否则反之。
每个子句的构件是用该子句的三个文字标记的结点组成的三元组。这三个结点互相连接,并且与变量构件中具有相同标记的结点相连接。
因此出现在 \(G\) 中的结点总数是 \(2m+3l\),其中 \(\phi\) 有 \(m\) 个变量和 \(l\) 个子句。令 \(k\) 等于 \(m+2l\)。
接下来证明归约满足要求。
前推后,从一个满足赋值开始,首先把变量构件中对应于赋值中真文字的结点放入顶点覆盖中。然后,在每个子句中挑选一个真文字,把每个子句构件中剩下的两个结点放人顶点覆盖中。
后推前,如果 \(G\) 有 \(k\) 个结点的顶点覆盖,为了
覆盖变量构件的边和子句构件的三条边,顶点覆盖必须包含每个变量构件的一个结点以及每个子句构件的两个结点。这就占用了全部顶点覆盖的结点,没有剩余的份额。选取变量
构件中在顶点覆盖中的结点,把相应的文字赋值为真。这个赋值满足 \(\phi\),因为每个子句构件连接到变量构件的三条边都被覆盖了,其中必有一条边被变量构件中的一个结点覆盖,因此赋值满足相应的子句。
Def. 哈密顿路径 \(\text{HAMPATH}=\{ \lang G,s,t \rang| G 是包含 s 到 t 的哈密顿路径的有向图\}\)
Th. \(\text{3SAT}\le _P\text{HAMPATH}\)
Th. \(\text{HAMPATH}\in NPC\)
证明 TODO p198
Th. \(\text{UNHAMPATH}\in NPC\)
其中 \(\text{UNHAMPATH}\) 为无向图的哈密顿路径问题
证明 TODO p200
Def. 子集和 \(\text{SUBSET-SUM}=\{ \lang s,t\rang|s=\{x _i\} _{i=1}^{k} \wedge \exist \{y _j\} _{j=1} ^l,\sum _j y_j=t \}\)
其中 \(\{x _i\} _{i=1}^{k},\{y _j\} _{j=1} ^l\) 为多重集
Th. \(\text{3SAT}\le _P\text{SUBSET-SUM}\)
Th. \(\text{SUBSET-SUM}\in NPC\)
证明 TODO p201
空间复杂性度量
Def. 图灵机的空间复杂性(Space complexity)
给定 \(k\) 带图灵机 \(M\)(1 条输入带,\(k-1\) 条存储带),若对每个长度为 \(𝑛\) 的输入,\(M\) 在每条存储带上都至多扫描 \(S(n)\) 个单元格,那么 \(M\) 是 \(S(n)\) 空间代价图灵机,\(M\) 的空间复杂性为 \(S(n)\)