0%
✦
• 8 min read • 学习笔记

计算理论导论

本笔记包含了我学习计算理论导论中做的笔记。REFBOOK:Introduction to Theory of Computation, Micheal Sipser (MIT).

可计算理论

有限自动机

DFA

DFA(Deterministic Finite Automaton)是一种有限状态自动机,其中每个状态对于每个输入符号都有且仅有一个转移。DFA可以用来识别正则语言。

定义: DFA由一个五元组(Q,Σ,δ,q0,F)(Q, \Sigma, \delta, q_0, F)组成,其中:

  • QQ是状态集合
  • Σ\Sigma是输入符号集合
  • δ\delta是转移函数,定义为δ:Q×Σ→Q\delta: Q \times \Sigma \rightarrow Q
  • q0q_0是初始状态
  • FF是接受状态集合

接受: 一个字符串被DFA接受,如果从初始状态出发,按照输入符号进行状态转移,最终停在一个接受状态。

语言: 语言是所有被自动机接受的字符串集合。我们称DFA“识别”语言LL,如果LL是DFA接受的字符串集合。

注:

  • 空字符串ϵ\epsilon也可以被DFA接受,取决于初始状态是否为接受状态。
  • 空语言∅\emptyset表示没有任何字符串被接受。注意,空字符串不属于空语言,因为空语言没有任何字符串。、

语言的交集: 两个语言的交集是同时被两个自动机接受的字符串集合。对于两个DFA M1M_1和M2M_2,我们可以构造一个新的DFA MM,使得L(M)=L(M1)∩L(M2)L(M) = L(M_1) \cap L(M_2)。我们给出一个显式的构造:

  • 状态集合:Q=Q1×Q2Q = Q_1 \times Q_2,其中Q1Q_1和Q2Q_2分别是M1M_1和M2M_2的状态集合。
  • 输入符号集合:Σ\Sigma,与M1M_1和M2M_2相同。
  • 转移函数:δ((q1,q2),a)=(δ1(q1,a),δ2(q2,a))\delta((q_1, q_2), a) = (\delta_1(q_1, a), \delta_2(q_2, a)),其中δ1\delta_1和δ2\delta_2分别是M1M_1和M2M_2的转移函数。
  • 初始状态:q0=(q0,1,q0,2)q_0 = (q_{0,1}, q_{0,2}),其中q0,1q_{0,1}和q0,2q_{0,2}分别是M1M_1和M2M_2的初始状态。
  • 接受状态集合:F=F1×F2F = F_1 \times F_2,其中F1F_1和F2F_2分别是M1M_1和M2M_2的接受状态集合。

状态示意图往往类似于一个网格,其中每个状态(q1,q2)(q_1, q_2)表示M1M_1处于状态q1q_1,M2M_2处于状态q2q_2。

正则语言: 正则语言是可以被DFA识别的语言。正则语言也可以通过正则表达式来描述。

正则语言的定义非常简单,但是判定一个语言是否为正则语言却是一个复杂的问题。我们可以使用泵引理(Pumping Lemma)来证明某些语言不是正则语言。我们 将在后续章节中介绍泵引理。

NFA

NFA(Nondeterministic Finite Automaton)是一种非确定性有限自动机,其中每个状态对于每个输入符号可以有多个转移。NFA也可以用来识别正则语言。

NFA与DFA的区别在于,NFA允许多个转移,而DFA每个状态对于每个输入符号只能有一个转移。尽管NFA看起来更强大,但实际上它们与DFA等价,即它们识别相同的语言。我们可以想象,NFA在无限的线程上并行地处理输入字符串,而DFA则在单线程上处理输入字符串(不准确)。

定理: 任何NFA等价于一个DFA,即对于每个NFA NN,存在一个DFAMM使得L(M)=L(N)L(M) = L(N)。

这一点的证明略去。

我们下面陈述三个定理:

  • 正则语言关于并运算闭合。
  • 正则语言关于连接运算闭合。
  • 正则语言关于星闭包运算闭合。

我们分别构造对应的DFA或者NFA来证明这些定理:

正则表达式

正则表达式是一种描述正则语言的工具。它使用特定的符号和规则来构建字符串集合。正则表达式可以转换为DFA或NFA,从而识别相同的语言。我们使用归纳定义:

定义:

基础:∅\emptyset, ϵ\epsilon, a∈Σa \in \Sigma是正则表达式。

递归:如果R1R_1和R2R_2是正则表达式,那么以下也是正则表达式:

  • R1∪R2R_1 \cup R_2
  • R1∘R2R_1 \circ R_2
  • R∗R^*

下面证明所有的正则表达式都等价于为DFA:

定理: 对于每个正则表达式RR,存在一个DFA MM 使得L(M)=L(R)L(M) = L(R)。

证明:

我们通过对正则表达式的结构进行归纳证明。对于每个正则表达式RR,我们构造一个等价的NFA NN,然后利用NFA与DFA的等价性得到DFA。

基础情况:

  1. R=∅R = \emptyset:构造NFA N=({q0},Σ,δ,q0,∅)N = (\{q_0\}, \Sigma, \delta, q_0, \emptyset),不接受任何字符串。

  2. R=ϵR = \epsilon:构造NFA N=({q0},Σ,δ,q0,{q0})N = (\{q_0\}, \Sigma, \delta, q_0, \{q_0\}),其中δ\delta为空函数,只接受空字符串。

  3. R=aR = a(a∈Σa \in \Sigma):构造NFA N=({q0,q1},Σ,δ,q0,{q1})N = (\{q_0, q_1\}, \Sigma, \delta, q_0, \{q_1\}),其中δ(q0,a)={q1}\delta(q_0, a) = \{q_1\}。

归纳步骤:

假设R1R_1和R2R_2分别对应NFA N1N_1和N2N_2。

  1. 并运算 R1∪R2R_1 \cup R_2:

    • 新建初始状态qnewq_{new}
    • 添加ϵ\epsilon转移到N1N_1和N2N_2的初始状态
    • 接受状态为N1N_1和N2N_2接受状态的并集
  2. 连接运算 R1∘R2R_1 \circ R_2:

    • 将N1N_1的每个接受状态通过ϵ\epsilon转移连接到N2N_2的初始状态
    • N1N_1的接受状态变为非接受状态
    • 接受状态为N2N_2的接受状态
  3. 星闭包 R1∗R_1^*:

    • 新建初始状态qnewq_{new}作为接受状态
    • 添加ϵ\epsilon转移到原NFA的初始状态
    • 将原NFA的接受状态通过ϵ\epsilon转移连接到原初始状态(形成循环)
    • 保留原接受状态

通过上述构造,每个正则表达式都可以转换为等价的NFA,进而转换为DFA。证毕。

反向证明:对于每个DFA,我们首先构造其对应的GNFA。然后,对于任何一个状态qdeleteq_{delete},指向它的状态为qiq_i,它指向下一个状态qjq_j,其正则表达式分别为R1(i向d),R2(d向i),R3(d向j),R4(j向d),R5(i向j)R_1(i向d), R_2(d向i), R_3(d向j), R_4(j向d), R_5(i向j),qiq_i,指向自己的表达式为RiR_i,qdeleteq_{delete}指向自己的正则表达式为RdeleteR_{delete}。那么,qiq_i指向自己的箭头为Ri∪R1RdeleteR2R_i \cup R_1R_{delete}R_2,指向qjq_j的箭头就是R5∪R1Rdelete∗R3R_5 \cup R_1R_{delete}^*R_3,以此类推,我们就可以归纳消除到只有两个状态,这个箭头上的正则表达式就是DFA等价的正则表达式。

泵引理(Pumping Lemma)

泵引理是证明某个语言不是正则语言的重要工具。

泵引理(正则语言):设LL是一个正则语言,则存在一个泵长度p>0p > 0,使得对于任何长度不小于pp的字符串s∈Ls \in L,都可以被分解为s=xyzs = xyz,满足:

  1. ∣xy∣≤p|xy| \leq p
  2. ∣y∣>0|y| > 0
  3. 对于所有i≥0i \geq 0,有xyiz∈Lxy^iz \in L

直观理解:如果DFA有pp个状态,那么任何长度超过pp的字符串在DFA中运行时必然会重复经过某个状态。yy就是两次经过该状态之间的子串,可以”泵”(重复)任意次数。

证明思路:设DFA有pp个状态,考虑长度为n≥pn \geq p的字符串。根据鸽巢原理,前p+1p+1个状态(包括初始状态)中必有重复,设qi=qjq_i = q_j(i<j≤pi < j \leq p),则x=s[0..i−1]x = s[0..i-1],y=s[i..j−1]y = s[i..j-1],z=s[j..n−1]z = s[j..n-1]。

应用示例:证明L={0n1n∣n≥0}L = \{0^n1^n \mid n \geq 0\}不是正则语言。

证明:假设LL是正则语言,设泵长度为pp。考虑字符串s=0p1p∈Ls = 0^p1^p \in L。根据泵引理,s=xyzs = xyz,其中∣xy∣≤p|xy| \leq p,因此yy只包含0。设y=0ky = 0^k(k>0k > 0),则xy2z=0p+k1p∉Lxy^2z = 0^{p+k}1^p \notin L(0和1数量不等),矛盾!因此LL不是正则语言。

上下文无关语言

上下文无关语言(Context-Free Language, CFL)是比正则语言更丰富的语言类,可以用上下文无关文法(CFG)描述,也可以用下推自动机(PDA)识别。

上下文无关语法(CFG)

定义:上下文无关文法是一个四元组G=(V,Σ,R,S)G = (V, \Sigma, R, S),其中:

  • VV:变量(非终结符)的有限集合
  • Σ\Sigma:终结符的有限集合(与VV不相交)
  • RR:产生式规则集合,每条规则形如A→wA \rightarrow w,其中A∈VA \in V,w∈(V∪Σ)∗w \in (V \cup \Sigma)^*
  • S∈VS \in V:起始变量

派生:如果存在产生式A→wA \rightarrow w,则字符串uAvuAv可以一步派生为uwvuwv,记作uAv⇒uwvuAv \Rightarrow uwv。

语言:L(G)={w∈Σ∗∣S⇒∗w}L(G) = \{w \in \Sigma^* \mid S \stackrel{*}{\Rightarrow} w\},即从起始变量可以派生出的所有终结符串的集合。

示例:

  • 文法S→0S1∣ϵS \rightarrow 0S1 \mid \epsilon生成语言L={0n1n∣n≥0}L = \{0^n1^n \mid n \geq 0\}
  • 文法S→SS∣(S)∣ϵS \rightarrow SS \mid (S) \mid \epsilon生成平衡的括号串

歧义性:

  • 如果存在字符串w∈L(G)w \in L(G)有多个不同的最左派生(或语法树),则称GG是歧义的
  • 某些语言是固有歧义的(所有生成它的CFG都是歧义的)

Chomsky范式(CNF): 每个CFG都可以转换为等价的Chomsky范式,其中所有产生式形如:

  • A→BCA \rightarrow BC(两个变量)
  • A→aA \rightarrow a(单个终结符)
  • S→ϵS \rightarrow \epsilon(仅起始变量)

下推自动机(PDA)

PDA是在DFA基础上增加了一个栈(Stack)结构的自动机,可以识别上下文无关语言。

定义:PDA是一个六元组P=(Q,Σ,Γ,δ,q0,F)P = (Q, \Sigma, \Gamma, \delta, q_0, F),其中:

  • QQ:状态集合
  • Σ\Sigma:输入字母表
  • Γ\Gamma:栈字母表
  • δ\delta:转移函数,δ:Q×Σϵ×Γϵ→P(Q×Γϵ)\delta: Q \times \Sigma_\epsilon \times \Gamma_\epsilon \rightarrow \mathcal{P}(Q \times \Gamma_\epsilon)
  • q0q_0:初始状态
  • FF:接受状态集合

转移的含义:δ(q,a,x)={(p1,y1),(p2,y2),…}\delta(q, a, x) = \{(p_1, y_1), (p_2, y_2), \ldots\}表示在状态qq,读入输入aa(可以是ϵ\epsilon),栈顶为xx(可以是ϵ\epsilon)时,可以转移到状态pip_i,并将栈顶xx替换为yiy_i(弹出xx,压入yiy_i的字符)。

接受方式:

  1. 终态接受:读完输入后停在接受状态
  2. 空栈接受:读完输入后栈为空

这两种接受方式是等价的。

示例:识别{0n1n∣n≥0}\{0^n1^n \mid n \geq 0\}的PDA:

  • 读0时压栈
  • 读1时弹栈(检查栈顶是否为0)
  • 接受当且仅当输入读完且栈为空

上下文无关语言与PDA等价性

定理:一个语言是上下文无关的,当且仅当存在某个PDA识别它。

CFG → PDA: 给定CFG G=(V,Σ,R,S)G = (V, \Sigma, R, S),构造PDA PP:

  1. 将SS压入栈
  2. 如果栈顶是变量AA,非确定性地选择一条产生式A→wA \rightarrow w,将AA替换为ww
  3. 如果栈顶是终结符aa,读入输入并匹配
  4. 如果栈为空且输入读完,接受

PDA → CFG: 构造较复杂,核心思想是创建变量ApqA_{pq}表示从状态pp到状态qq且栈底不变(即开始时栈为空,结束时栈也为空)的派生。

首先对PDA进行简化:

  1. 引入新的唯一接受状态qacceptq_{accept};
  2. 确保接受时栈为空(通过添加状态逐个弹出栈中符号);
  3. 确保每次转移要么压入一个符号,要么弹出一个符号(不压不弹的转移可拆成两步)。

设简化后的PDA为P=(Q,Σ,Γ,δ,q0,{qaccept})P = (Q, \Sigma, \Gamma, \delta, q_0, \{q_{accept}\}),构造CFG G=(V,Σ,R,S)G = (V, \Sigma, R, S):

  • 变量集合:V={Apq∣p,q∈Q}V = \{A_{pq} \mid p, q \in Q\}
  • 起始变量:S=Aq0qacceptS = A_{q_0 q_{accept}}
  • 产生式规则RR如下表所示:
情况产生式条件
a)Apq→aArsbA_{pq} \to a A_{rs} b若δ(p,a,ϵ)\delta(p, a, \epsilon)包含(r,t)(r, t),且δ(s,b,t)\delta(s, b, t)包含(q,ϵ)(q, \epsilon),其中t∈Γt \in \Gamma,a,b∈Σϵa, b \in \Sigma_\epsilon
b)Apq→AprArqA_{pq} \to A_{pr} A_{rq}对任意中间状态r∈Qr \in Q
c)App→ϵA_{pp} \to \epsilon对任意状态p∈Qp \in Q

直观解释:

  • 情况a) 表示:从pp到qq且栈底不变的最短派生,可能先读入aa并在空栈上压入符号tt进入状态rr,然后从rr到ss保持栈底tt不变,最后从ss读入bb并弹出tt进入qq。
  • 情况b) 表示:从pp到qq的派生可以拆分为两段,先经过某个中间状态rr。
  • 情况c) 表示:不移动即可保持栈底不变,对应空串ϵ\epsilon。

CFG的泵引理

泵引理(上下文无关语言):设LL是上下文无关语言,则存在一个泵长度p>0p > 0,使得对于任何长度不小于pp的字符串s∈Ls \in L,都可以被分解为s=uvxyzs = uvxyz,满足:

  1. ∣vxy∣≤p|vxy| \leq p
  2. ∣vy∣>0|vy| > 0
  3. 对于所有i≥0i \geq 0,有uvixyiz∈Luv^ixy^iz \in L

直观理解:在足够长的派生中,某个变量会重复出现(在语法树的同一条路径上),形成可泵的部分。

应用示例:证明L={anbncn∣n≥0}L = \{a^nb^nc^n \mid n \geq 0\}不是上下文无关的。

证明:假设LL是CFL,设泵长度为pp。考虑s=apbpcps = a^pb^pc^p。根据泵引理,s=uvxyzs = uvxyz,其中∣vxy∣≤p|vxy| \leq p,因此vxyvxy不能同时包含aa、bb、cc三种字符(因为最多跨越两种字符的边界)。 pumping后,三种字符的数量将不再相等,矛盾!

Ogden引理:泵引理的强化版本,可以选择某些位置作为”标记”,确保泵的部分包含标记。

上下文无关语言的封闭性

运算是否封闭说明
并✓易构造
连接✓易构造
Kleene星✓易构造
交✗反例:{anbncm}∩{ambncn}\{a^nb^nc^m\} \cap \{a^mb^nc^n\}
补✗由不交补性得出
与正则语言的交✓PDA × DFA构造

可判定性问题

问题是否可判定复杂度
w∈L(G)w \in L(G)?✓O(n3)O(n^3)(CYK算法)
L(G)=∅L(G) = \emptyset?✓检查可达变量
L(G)=Σ∗L(G) = \Sigma^*?✗不可判定
GG是否歧义?✗不可判定
L(G1)=L(G2)L(G_1) = L(G_2)?✗不可判定

图灵机

图灵机(Turing Machine, TM)是计算理论中最强大的计算模型,由Alan Turing于1936年提出。它定义了”可计算”的直观概念。

定义

定义:图灵机是一个七元组M=(Q,Σ,Γ,δ,q0,qaccept,qreject)M = (Q, \Sigma, \Gamma, \delta, q_0, q_{accept}, q_{reject}),其中:

  • QQ:状态的有限集合
  • Σ\Sigma:输入字母表(不包括空白符⊔\sqcup)
  • Γ\Gamma:带字母表,Σ⊂Γ\Sigma \subset \Gamma且⊔∈Γ\sqcup \in \Gamma
  • δ\delta:转移函数,δ:Q×Γ→Q×Γ×{L,R}\delta: Q \times \Gamma \rightarrow Q \times \Gamma \times \{L, R\}(确定性TM)
  • q0∈Qq_0 \in Q:初始状态
  • qaccept∈Qq_{accept} \in Q:接受状态
  • qreject∈Qq_{reject} \in Q:拒绝状态(qreject≠qacceptq_{reject} \neq q_{accept})

工作方式:

  1. 输入写在无限长的纸带上(两端无限或单向无限)
  2. 读写头初始位于输入最左端
  3. 根据当前状态和读到的符号,按照δ\delta进行转移:改变状态、写入新符号、左移或右移
  4. 如果进入qacceptq_{accept}则接受,进入qrejectq_{reject}则拒绝
  5. 可能永不停机(loop)

格局(Configuration):描述TM某一时刻的完整状态,形如uqvuqv表示:

  • 纸带内容为uvuv(其余为空白)
  • 当前状态为qq
  • 读写头指向vv的第一个符号

识别与判定:

  • 识别(半判定):TM在输入ww上停机并接受 ⇔\Leftrightarrow w∈L(M)w \in L(M)
  • 判定:TM在所有输入上都停机,且正确接受或拒绝

图灵机的变体

变体描述等价性
多带图灵机有多个纸带和读写头等价于单带TM
非确定性TM(NTM)转移函数返回状态集合等价于确定性TM
枚举器输出语言的枚举等价于TM
无限纸带纸带双向无限等价于单向无限
下推自动机+队列栈替换为队列等价于TM

多带图灵机的单带模拟: 用单带存储多带内容,用特殊符号分隔,用额外的标记记录读写头位置。时间复杂度至多增加多项式倍。

丘奇-图灵论题(Church-Turing Thesis):

任何直观上可计算的函数都可以被图灵机计算。

这不是一个数学定理,而是一个关于”计算”本质的论题,被广泛接受。

停机问题

停机问题是计算机科学中最著名的不可判定问题。

停机问题:给定图灵机MM和输入ww,判定MM是否在输入ww上停机。

定理:停机问题是不可判定的。

证明(对角化法): 假设存在判定停机问题的TM HH,构造TM DD:

  • 输入为图灵机MM的描述⟨M⟩\langle M \rangle
  • 模拟HH在输入(⟨M⟩,⟨M⟩)(\langle M \rangle, \langle M \rangle)上的运行
  • 如果HH接受(MM在自身描述上停机),则DD进入无限循环
  • 如果HH拒绝(MM在自身描述上不停机),则DD接受

考虑DD在输入⟨D⟩\langle D \rangle上的行为:

  • 如果DD停机,则HH接受,则DD不停机,矛盾!
  • 如果DD不停机,则HH拒绝,则DD停机,矛盾!

因此HH不存在,停机问题不可判定。

可归约性与更多不可判定问题

可归约性:语言AA可归约到语言BB(A≤mBA \leq_m B),如果存在可计算函数ff,使得w∈A⇔f(w)∈Bw \in A \Leftrightarrow f(w) \in B。

性质:如果A≤mBA \leq_m B且BB可判定,则AA可判定。逆否命题:如果A≤mBA \leq_m B且AA不可判定,则BB不可判定。

其他不可判定问题:

问题描述
ATMA_{TM}{⟨M,w⟩∣M接受w}\{\langle M, w \rangle \mid M\text{接受}w\}
ETME_{TM}{⟨M⟩∣L(M)=∅}\{\langle M \rangle \mid L(M) = \emptyset\}
EQTMEQ_{TM}{⟨M1,M2⟩∣L(M1)=L(M2)}\{\langle M_1, M_2 \rangle \mid L(M_1) = L(M_2)\}
REGULARTMREGULAR_{TM}{⟨M⟩∣L(M)是正则语言}\{\langle M \rangle \mid L(M)\text{是正则语言}\}
HALTTMHALT_{TM}停机问题
Post对应问题(PCP)字符串匹配问题
群的字问题判定群论中的等式

Rice定理:任何关于图灵机识别语言的非平凡性质都是不可判定的。

形式化:设PP是关于语言的性质,PP是非平凡的(存在TM满足,存在TM不满足),则LP={⟨M⟩∣P(L(M))}L_P = \{\langle M \rangle \mid P(L(M))\}是不可判定的。

可计算性层次

类别定义示例
递归可枚举(r.e.)被某个TM识别ATMA_{TM}、停机问题
递归(可判定)被某个TM判定正则语言、上下文无关语言
co-r.e.补集是r.e.ATM‾\overline{A_{TM}}的补集

关系:可判定 = r.e. ∩ co-r.e.

复杂性理论

复杂性理论研究计算问题的资源需求(主要是时间和空间),将问题按照难度分类。

时间复杂度

时间复杂性类:

TIME(t(n))\text{TIME}(t(n)):由O(t(n))O(t(n))时间的确定性图灵机判定的语言类。

主要复杂性类:

类定义描述
P\mathbf{P}⋃kTIME(nk)\bigcup_k \text{TIME}(n^k)多项式时间可判定
EXP\mathbf{EXP}⋃kTIME(2nk)\bigcup_k \text{TIME}(2^{n^k})指数时间可判定
E\mathbf{E}TIME(2O(n))\text{TIME}(2^{O(n)})线性指数时间

P\mathbf{P}的意义:

  • 被认为是”易处理”(tractable)的问题类
  • 对模型变化鲁棒(多带、随机访问机等多项式相关)

类P\mathbf{P}

P\mathbf{P}类包含所有可以被确定性图灵机在多项式时间内判定的语言。

P\mathbf{P}中的问题:

  • 路径问题(PATH):图中有无ss到tt的路径(BFS/DFS)
  • 素数判定(PRIMES):2002年被证明属于P\mathbf{P}(AKS算法)
  • 线性规划
  • 上下文无关语言的成员判定

编码的影响: 问题的编码方式可能影响复杂性。通常假设合理编码(如数字用二进制而非一元表示)。

非确定性时间

NTIME(t(n))\text{NTIME}(t(n)):由O(t(n))O(t(n))时间的非确定性图灵机判定的语言类。

NP\mathbf{NP} = ⋃kNTIME(nk)\bigcup_k \text{NTIME}(n^k):非确定性多项式时间可判定的语言类。

NP\mathbf{NP}的等价定义:

  • 可以被多项式时间验证的解的语言
  • 存在多项式时间验证器VV,使得w∈Lw \in L当且仅当存在证书cc,∣c∣=∣w∣O(1)|c| = |w|^{O(1)},使得VV接受(w,c)(w, c)

NP\mathbf{NP}中的问题:

问题描述证书
SAT布尔公式可满足满足赋值
CLIQUE图中是否存在kk团团的顶点集
VERTEX-COVER是否存在大小为kk的顶点覆盖覆盖顶点集
HAMILTONIAN-PATH是否存在哈密顿路径路径顶点序列
SUBSET-SUM子集和等于目标值子集本身
TSP旅行商问题(判定版本)具体路径
GRAPH-COLORING图是否kk-可着色着色方案

NP完全问题与Cook-Levin定理

多项式时间归约:A≤pBA \leq_p B,如果存在多项式时间可计算函数ff,使得w∈A⇔f(w)∈Bw \in A \Leftrightarrow f(w) \in B。

NP难(NP-hard):语言BB是NP难的,如果对于所有A∈NPA \in \mathbf{NP},有A≤pBA \leq_p B。

NP完全(NP-complete):语言BB是NP完全的,如果:

  1. B∈NPB \in \mathbf{NP}
  2. BB是NP难的

Cook-Levin定理(1971):SAT是NP完全的。

证明思路:

  1. 显然SAT∈NP\text{SAT} \in \mathbf{NP}(给定赋值可多项式时间验证)
  2. 证明SAT是NP难的:对于任意NP\mathbf{NP}语言LL和输入ww,构造布尔公式ϕ\phi,使得ϕ\phi可满足当且仅当存在证书使w∈Lw \in L
  3. 构造模拟NTM计算的布尔电路,编码为CNF公式

经典NP完全问题归约链:

SAT≤p3SAT≤pCLIQUE≤pVERTEX-COVER≤pHAMILTONIAN-PATH≤pTSP\text{SAT} \leq_p \text{3SAT} \leq_p \text{CLIQUE} \leq_p \text{VERTEX-COVER} \leq_p \text{HAMILTONIAN-PATH} \leq_p \text{TSP}

NP完全问题的处理策略

面对NP完全问题,常用策略:

  1. 近似算法:在多项式时间内找到接近最优的解

    • 顶点覆盖:2-近似算法
    • TSP(满足三角不等式):2-近似(MST-based),1.5-近似(Christofides)
  2. 启发式算法:没有理论保证但实际效果好

    • 模拟退火
    • 遗传算法
    • 禁忌搜索
  3. 参数化算法:将复杂度与问题参数关联

    • 顶点覆盖:O(1.2738k+kn)O(1.2738^k + kn)算法
  4. 固定参数可追踪(FPT):时间复杂度为f(k)⋅nO(1)f(k) \cdot n^{O(1)}

  5. 随机算法:使用随机化获得好的期望性能

  6. 处理特殊情况:某些限制条件下问题可能变得易解

    • 2SAT(每个子句最多2个文字)属于P\mathbf{P}
    • 平面图上的3COLORING属于P\mathbf{P}

复杂性类的关系

基本包含关系:

P⊆NP⊆PSPACE⊆EXP\mathbf{P} \subseteq \mathbf{NP} \subseteq \mathbf{PSPACE} \subseteq \mathbf{EXP}

开放问题:

  • P=?NP\mathbf{P} \stackrel{?}{=} \mathbf{NP}:计算机科学最重要的未解决问题
  • 大多数人相信P≠NP\mathbf{P} \neq \mathbf{NP}
  • 证明难度:已知某些证明技术(相对化、自然证明)无法解决此问题

其他重要复杂性类:

类定义描述
coNP\mathbf{coNP}补集在NP\mathbf{NP}中全称验证
PSPACE\mathbf{PSPACE}多项式空间空间而非时间限制
NPSPACE\mathbf{NPSPACE}非确定性多项式空间等于PSPACE\mathbf{PSPACE}(Savitch定理)
L\mathbf{L}对数空间高度受限
NL\mathbf{NL}非确定性对数空间路径问题完备
BPP\mathbf{BPP}有界错误概率多项式时间随机算法
RP\mathbf{RP}单侧错误随机多项式时间无假阳性

NP问题举例

以下是一些著名的NP完全问题:

1. 布尔可满足性问题(SAT)

  • 输入:布尔公式ϕ\phi
  • 问题:是否存在赋值使ϕ\phi为真?
  • 3SAT限制:每个子句恰好3个文字,仍是NP完全

2. 团问题(CLIQUE)

  • 输入:图G=(V,E)G = (V, E),整数kk
  • 问题:GG是否包含大小为kk的完全子图?
  • 补问题:独立集问题(INDEPENDENT SET)

3. 顶点覆盖(VERTEX-COVER)

  • 输入:图G=(V,E)G = (V, E),整数kk
  • 问题:是否存在大小为kk的顶点覆盖(每条边至少一个端点在覆盖中)?
  • 关系:顶点覆盖的补是独立集

4. 哈密顿路径/回路

  • HAMILTONIAN-PATH:图中是否存在经过每个顶点恰好一次的路径?
  • HAMILTONIAN-CYCLE:是否存在哈密顿回路?
  • 即使限制在平面图中仍是NP完全

5. 旅行商问题(TSP)

  • 判定版本:给定距离矩阵和界限BB,是否存在长度≤B\leq B的回路访问所有城市?
  • 优化版本:找最短回路(NP难)
  • 欧几里得TSP也是NP完全

6. 子集和(SUBSET-SUM)

  • 输入:整数集合SS,目标值tt
  • 问题:是否存在子集和等于tt?
  • 与背包问题密切相关

7. 划分问题(PARTITION)

  • 输入:正整数集合SS
  • 问题:是否可将SS划分为两个和相等的子集?

8. 图着色(GRAPH-COLORING)

  • 输入:图GG,整数kk
  • 问题:GG是否kk-可着色(相邻顶点不同色)?
  • 3COLORING是NP完全,2COLORING属于P\mathbf{P}

9. 装箱问题(BIN-PACKING)

  • 输入:物品大小,箱子容量,箱子数量kk
  • 问题:是否可用kk个箱子装下所有物品?

10. 集合覆盖(SET-COVER)

  • 输入:集合族F\mathcal{F},全集UU,整数kk
  • 问题:是否存在≤k\leq k个集合覆盖UU?
  • 对数近似比(贪心算法)

这些问题的NP完全性意味着:

  • 不太可能有多项式时间算法
  • 一个问题的突破意味着所有NP问题的突破(如果找到多项式算法)
  • 实际应用中需要借助近似算法、启发式或专门求解器

Comments