一台 k-带图灵机(TM)M 有 k-条带子。第一条带子称为输入带,用来存放输入数据,输入带是只读带。其余 k−1 条带子是工作带,既可以从工作带上读信息,也可以往工作带上写内容。图灵机的输出写在最后一条工作带(即第 k 条带)上。
图灵机是用来解决问题的,那么如何定义图灵机解决了一个问题?
问题就是函数
A function f : { 0 , 1 } ∗ → { 0 , 1 } ∗ f:\{0,1\}^* \rightarrow\{0,1\}^* f:{0,1}∗→{0,1}∗ is a problem.
L ( x ) = { 1 , 若 x ∈ L , 0 , 若 x ∉ L , L(x)= \begin{cases}1, & \text { 若 } x \in L, \\ 0, & \text { 若 } x \notin L,\end{cases} L(x)={1,0, 若 x∈L, 若 x∈/L,
称 M \mathbb{M} M 接受语言 L L L, 或称 L L L 为可判定的。我们常等价语言和相应的判定问题,
问题本质上是一个(有限) 0-1 串到 (有限)0-1 串的函数。推而广之, 一个函数 f : { 0 , 1 } ∗ → { 0 , 1 } ∗ f:\{0,1\}^* \rightarrow\{0,1\}^* f:{0,1}∗→{0,1}∗ 就是一个问题
用 “ M ( x ) = y \mathbb{M}(x)=y M(x)=y ” 表示 “ M ( x ) ↓ \mathbb{M}(x) \downarrow M(x)↓ 且计算终止时输出带上的内容是 y y y ”, 在此种情况下, 称 y y y 为 M ( x ) \mathbb{M}(x) M(x) 的计算结果。若对任意输入 x ∈ { 0 , 1 } ∗ x \in\{0,1\}^* x∈{0,1}∗,有 M ( x ) = f ( x ) \mathbb{M}(x)=f(x) M(x)=f(x), 称 M \mathbb{M} M 计算 f f f, 或 M \mathbb{M} M 解决问题 f f f
一个判定问题是一个特殊的函数 d : { 0 , 1 } ∗ → { 0 , 1 } d:\{0,1\}^* \rightarrow\{0,1\} d:{0,1}∗→{0,1}, 其值域为布尔集 { 0 , 1 } \{0,1\} {0,1} 。
若 M \mathbb{M} M 解决 d d d, 亦称 M \mathbb{M} M 判定 d d d 。
!!!判定问题常常等同等效得用一个语言来表示,语言L就是01串的一个子集
比如说我们刚刚说的那个哈密路回路问题, L L L就是所有包含了哈密顿回路的图,语言问题和判定问题是等价的
若图灵机 M \mathbb{M} M 判定 L L L 的特征函数
L ( x ) = { 1 , 若 x ∈ L , 0 , 若 x ∉ L , L(x)= \begin{cases}1, & \text { 若 } x \in L, \\ 0, & \text { 若 } x \notin L,\end{cases} L(x)={1,0, 若 x∈L, 若 x∈/L,
称 M \mathbb{M} M 接受语言 L L L, 或称 L L L 为可判定的。我们常等价语言和相应的判定问题,
Suppose T : N → N T: \mathbf{N} \rightarrow \mathbf{N} T:N→N and M \mathbb{M} M computes the problem f f f.
We say that M \mathbb{M} M computes f f f in T ( n ) T(n) T(n)-time if its computation on every input x x x requires at most T ( ∣ x ∣ ) T(|x|) T(∣x∣) steps.
经常将一个时间函数记为 T ( n ) T(n) T(n),而非 T ( x ) T(x) T(x) 或 T ( ∣ x ∣ ) T(|x|) T(∣x∣),其中 n n n 强调是输入串的长度。
所有的时间函数 T ( n ) T(n) T(n) 都必须满足不等式 T ( n ) ≥ n T(n) \geq n T(n)≥n 。
定义 1.3. 若有图灵机在 O ( T ( n ) ) O(T(n)) O(T(n)) 时间内计算函数 1 n ↦ ⌞ T ( n ) ⌟ 1^n \mapsto\llcorner T(n)\lrcorner 1n↦└T(n)┘, 称 T ( n ) T(n) T(n) 是时间可构造的。
(有图灵机可以计算时间复杂度,而且时间复杂度不是很怪,用 O ( T ( n ) ) O(T(n)) O(T(n)) 就可以算出来)
定义 1.4. 若有图灵机在输入 1 n 1^n 1n 上准确地计算了 T ( n ) T(n) T(n) 步后停机, 称 T ( n ) T(n) T(n) 是完全时间可构造的。
(完全时间可构造比时间可构造强(课后可证明)
定义时间可构造的意义:用图灵机实现 在某些运行太长的输入上叫停 两台图灵机并行计算)
通过将 图灵机 M \mathbb{M} M 和 时钟图灵机 T \mathbb{T} T 作硬连接, 强迫 M \mathbb{M} M 在 T ( n ) T(n) T(n) 步或 O ( T ( n ) ) O(T(n)) O(T(n)) 步内终止
模型无关性:一个问题是不是可计算是模型无关的
一个模型里面一个问题多项式时间可解,另一个模型里一个问题也是多项式时间可解
(但无法证明)
Complexity theory ought to be model independent.
Variants of Turing Machines are equivalent to the k k k-tape Turing Machines in the sense that they can simulate each other with polynomial overhead.
尽管我们用的是图灵机 但是用在哪个机子里都是一样(我们在计算复杂性里面关注的都是图灵完备的模型)
任何时候读写头位置只依赖于输入长度不依赖于输入内容
Every physically realizable computing device can be simulated by a Turing Machine
物理上可实现的最厉害的计算就是图灵机计算(我们只讨论可计算性,不可证)(和电子计算机也等价)
通用图灵机:可以计算你想让它算的任何事情,只要那件事情是可计算的
因为图灵机在语法上是有限对象 所以可以被二进制编码
不同的图灵机有不同的编码
有些图灵机事实上是相同的 但编码不一样 因此我们可以说每台图灵机对应无限多个编码(无限多个和它行为一样的图灵机)
有些01串不是图灵机编码,所有不是图灵机编码的01串解释为某个特定的图灵机编码
我们用 ⌞ M ⌟ \llcorner\mathbb{M}\lrcorner └M┘ 表示图灵机 M \mathbb{M} M 的二进制编码,用 M α \mathbb{M}_\alpha Mα 表示二进制编码为 α \alpha α 的那台图灵机。
对于图灵机编码使得我们可以枚举图灵机
自然数集合 N \mathbf{N} N 和 0-1 串集合之间的一一对应函数可用程序实现。利用此一一对应程序可给出图灵机的一个有效枚举:
M 0 , M 1 , … , M i , … \mathbb{M}_0, \mathbb{M}_1, \ldots, \mathbb{M}_i, \ldots M0,M1,…,Mi,…
称 i i i 为图灵机 M i \mathbb{M}_i Mi 的下标或哥德尔编码。设 ϕ i \phi_i ϕi 是 M i \mathbb{M}_i Mi 所计算的函数, 由 (1.3.2)可得图灵机可计算函数的一个枚举
ϕ 0 , ϕ 1 , … , ϕ i , … 。 \phi_0, \phi_1, \ldots, \phi_i, \ldots \text { 。 } ϕ0,ϕ1,…,ϕi,… 。
这里, ϕ i \phi_i ϕi 为如下定义的函数:
ϕ i ( x ) = def { y , 若 M i ( x ) = y , ↑ , 若 M i ( x ) ↑ 。 \phi_i(x) \stackrel{\text { def }}{=} \begin{cases}y, & \text { 若 } \mathbb{M}_i(x)=y, \\ \uparrow, & \text { 若 } \mathbb{M}_i(x) \uparrow 。\end{cases} ϕi(x)= def {y,↑, 若 Mi(x)=y, 若 Mi(x)↑。
偏函数:对一部分输入都有定义
全函数:对所有输入都有定义
一般可计算函数是偏函数,可计算全函数是可计算函数的一部分
既然已经选定了一个图灵机编码, 我们可以将一个二进制串理解成一个数据或一台图灵机。给定任意两个二进制串 α , x \alpha, x α,x, 我们可以模拟 M α \mathbb{M}_\alpha Mα 在输入 x x x上的计算。直观上这个模拟过程是有效的, 即有一台图灵机 U \mathbb{U} U, 满足
U ( α , x ) ≃ M α ( x ) 。 \mathbb{U}(\alpha, x) \simeq \mathbb{M}_\alpha(x) 。 U(α,x)≃Mα(x)。
称 U \mathbb{U} U 为通用图灵机。在 1.3.4 中, 等价关系 ≃ \simeq ≃ 的定义如下: 若一边有定义,则另一边也有定义且两边相等; 若一边无定义, 则另一边也无定义。如果将一个程序语言视为一个计算模型的话, 那么用这个程序语言写的程序就是 “图灵机”, 用该程序语言写的该语言的解释器就是一台 “通用图灵机”。
定理 1.1 (枚举定理). 存在通用图灵机 U \mathbb{U} U, 对任意 α , x ∈ { 0 , 1 } ∗ \alpha, x \in\{0,1\}^* α,x∈{0,1}∗, 等式 U ( α , x ) ≃ \mathbb{U}(\alpha, x) \simeq U(α,x)≃ M α ( x ) \mathbb{M}_\alpha(x) Mα(x) 成立。
定理 1.2. 存在通用图灵机 U \mathbb{U} U 和多项式 c c c. 对任意长度为 n n n 的输入串 x x x, 若 M α ( x ) \mathbb{M}_\alpha(x) Mα(x) 在 T ( n ) T(n) T(n) 步内停机, 则 U ( α , x ) \mathbb{U}(\alpha, x) U(α,x) 在 c ( ∣ α ∣ ) T ( n ) log T ( n ) c(|\alpha|) T(n) \log T(n) c(∣α∣)T(n)logT(n) 步内停机。
不存在一段程序, 当输入一段程序 P \mathbb{P} P 和一个输入数据 x x x, 该程序能判定 P ( x ) \mathbb{P}(x) P(x) 的计算是否终止。这就是所谓的 “停机问题不可判定”。在这个推导里, 我们使用归约方法, 将问题 A \mathrm{A} A 有效归约到问题 H \mathrm{H} H 。
T I M E ( T ( n ) ) TIME(T(n)) TIME(T(n)) :
T I M E ( T ( n ) ) TIME(T(n)) TIME(T(n))是一个问题集合,一个问题在此集合中当且仅当该问题在 T ( n ) T(n) T(n) 的一个常数倍时间内可判定。一般地, T I M E ( T ( n ) ) TIME(T(n)) TIME(T(n)) 依赖于所用模型。若模型是所有双带图灵机, T I M E ( n ) TIME(n) TIME(n) 包含回文问题;若模型是具有单条读写带的图灵机,可以证明,回文问题不在 T I M E ( n ) TIME(n) TIME(n) 中,事实上,它在 T I M E ( n 2 ) TIME(n^2) TIME(n2) 中
可判定
L是一种语言,它是 { 0 , 1 } ∗ \{0,1\}^* {0,1}∗ 的一个子集。
L是可判定的 当意思是你把x输入到M中,如果x在L里,那它就输出1,不然就输出0。
此时L是可判定问题。
用 M ( x ) M(x) M(x) 表示图灵机 M M M 的输入带预置了输入 x x x。 M ( x ) M(x) M(x) 会按相关指令计算。在计算的任何时刻 t t t, M ( x ) M(x) M(x) 的格局 σ t σ_t σt 是一个 2 k 2k 2k-元组 ( q , κ 2 , . . . , κ k , h 1 , . . . , h k ) (q, κ_2,..., κ_k, h_1,...,h_k) (q,κ2,...,κk,h1,...,hk),其中 q 是时刻 t 时的机器状态,符号串 κ 2 , . . . , κ k κ_2,..., κ_k κ2,...,κk 分别是时刻 t 时 k − 1 k−1 k−1 条工作带上的内容(非空的符号串),自然数 h 1 , . . . , h k h_1,...,h_k h1,...,hk 是时刻 t 时 k 个读写头的位置。格局 σ t σ_t σt 表示 M(x) 计算了 t 步后的系统参数。一步计算可表示成一个格局的迁移 σ t → σ t + 1 σ_t → σ_{t+1} σt→σt+1。M(x) 从初始格局开始的格局迁移序列 σ 0 → σ 1 → . . . → σ t → . . . σ_0 → σ_1 → ... → σ_t → ... σ0→σ1→...→σt→...述了M(x) 的计算。若该计算终止,记为 M ( x ) ↓ M(x)↓ M(x)↓;若该计算不终止,记为 M ( x ) ↑ M(x)↑ M(x)↑。若 M(x) 的计算终止于格局 σ T σ_T σT,用 σ 0 → σ 1 → . . . → σ T σ_0 → σ_1 → ... → σ_T σ0→σ1→...→σT 表示其计算路径。
S ( n ) S(n) S(n) 为 M \mathbb{M} M 的空间函数。
SPACE ( S ( n ) ) \operatorname{SPACE}(S(n)) SPACE(S(n)) :
设 S : N → N S: \mathbf{N} \rightarrow \mathbf{N} S:N→N, 且 L ⊆ { 0 , 1 } ∗ L \subseteq\{0,1\}^* L⊆{0,1}∗ 。若有常数 c c c 和判定语言 L L L 的图灵机 M \mathbb{M} M,当输入 x x x 时, M ( x ) \mathbb{M}(x) M(x) 计算时使用的工作带上的格子数不会超过 c S ( n ) c S(n) cS(n), 那么 L L L在 SPACE ( S ( n ) ) \operatorname{SPACE}(S(n)) SPACE(S(n)) 中。称 S ( n ) S(n) S(n) 为 M \mathbb{M} M 的空间函数。
可计算
称一个函数是图灵机可计算的,或该问题是图灵机可解的,当仅当有一台图灵机计算它。
Message from Blum’s Speedup Theorem:
-We cannot define time complexity for problems.
-We can of course define time complexity for solutions.
With this remark we proceed to investigate time complexity class.
Blum定理告诉我们有些问题永远有更好的算法,因此我们没法定义问题的复杂性,只能去评估算法的复杂性,所以我们如何对问题进行分类,我们用的方法是看这个问题有什么样的算法。
一个复杂性类是一个模型无关的问题类。一个问题不管用什么模型,都在复杂性类里。一个问题有多项式时间算法,无论用什么模型,都有多项式时间算法。
TIME ( T ( n ) ) \operatorname{TIME}(T(n)) TIME(T(n)):
Let T : N → N T: \mathbf{N} \rightarrow \mathbf{N} T:N→N be a time function.
A decision problem L ⊆ { 0 , 1 } ∗ L \subseteq\{0,1\}^* L⊆{0,1}∗ is in TIME ( T ( n ) ) \operatorname{TIME}(T(n)) TIME(T(n)) if there exists a TM that accepts L L L and runs in time c T ( n ) c T(n) cT(n) for some c > 0 c>0 c>0.
一个问题(decision problem)在 TIME ( T ( n ) ) \operatorname{TIME}(T(n)) TIME(T(n))中当它可以在 T ( n ) T(n) T(n)中跑完
有了这个符号之后我们就可以定义复杂性类
用双带图灵机,回文问题可在线性时间内解决,见第 14 页上的回文例子。可以证明, 如果只用单带图灵机, 回文问题只能在平方时间内解决 [150]。所以说, 回文问题是否在 TIME ( n ) \operatorname{TIME}(n) TIME(n) 里依赖于我们使用的模型。按我们的理解, TIME ( n ) \operatorname{TIME}(n) TIME(n)不是一个复杂性类。一个复杂性类是一个模型无关的问题类。最著名的一个复杂性类是多项式时间类,其定义如下:
P = ⋃ c ≥ 1 TIME ( n c ) 。 \mathbf{P}=\bigcup_{c \geq 1} \operatorname{TIME}\left(n^c\right) 。 P=⋃c≥1TIME(nc)。
E X P = ⋃ c ≥ 1 TIME ( 2 n c ) \mathbf{E X P}=\bigcup_{c \geq 1} \operatorname{TIME}\left(2^{n^c}\right) EXP=⋃c≥1TIME(2nc).
非确定图灵机的每条计算路径试图构造一个存在性证明,若构造成功,在输出带上写 1 并停机,称该计算是成功的,该终止格局为接受格局;若构造失败,在输出带上写 0 并停机,并称该计算是失败的,该终止格局为拒绝格局。有些计算路径可能不终止,这些计算也是失败的。只要计算终止,我们总可以假定输出带上的内容或为 1 或为 0。对于解决存在性问题,只要有一个存在性证明就足够了。
非确定图灵机是用来解决验证性问题的。
P问题(多项式时间可解决问题)指的是可以在多项式时间内(通常是输入规模的多项式函数)用确定性的图灵机或其它多项式时间可计算的模型有效解决的问题。也就是说,对于P问题,存在一个能在多项式时间内解决问题的算法。
NP问题(非确定性多项式时间可验证问题)指的是可以在多项式时间内验证给定解的正确性的问题。也就是说,如果一个解可以在多项式时间内被验证,那么这个问题就属于NP类。但并不一定存在多项式时间内解决该问题的算法。
因为知道有多项式时间证明 所以可以先猜测一个多项式长度的01串 看是否存在证明
定义 1.6. 设 N \mathbb{N} N 为非确定图灵机, 当输入 x x x 时, 若 N ( x ) \mathbb{N}(x) N(x) 有一条计算路径终止于接受格局, 称 N \mathbb{N} N 接受 x x x, 记为 N ( x ) = 1 \mathbb{N}(x)=1 N(x)=1 。若 N ( x ) \mathbb{N}(x) N(x) 的所有的计算路径都失败, 称 N \mathbb{N} N 拒绝 x x x, 记为 N ( x ) = 0 \mathbb{N}(x)=0 N(x)=0 。
设 L L L 为一语言, 若 x ∈ L x \in L x∈L(这个命题为真) 当仅当 N ( x ) = 1 \mathbb{N}(x)=1 N(x)=1, 称 N \mathbb{N} N 接受 L L L 。
举例子 非确定图灵机 命题是图上是否有哈密顿回路 猜的是结点顺序(没一种结点顺序对应一个01串对应一条路径)
设 T : N → N T: \mathbf{N} \rightarrow \mathbf{N} T:N→N 为时间函数。对任意输入 x x x, 若非确定图灵机 N \mathbb{N} N 的任一计算路径的长度都不超过 T ( ∣ x ∣ ) T(|x|) T(∣x∣), 称 T ( n ) T(n) T(n) 为 N \mathbb{N} N 的时间函数。设 L ⊆ { 0 , 1 } ∗ L \subseteq\{0,1\}^* L⊆{0,1}∗ 。记号 L ∈ NTIME ( T ( n ) ) L \in \operatorname{NTIME}(T(n)) L∈NTIME(T(n)) 表示存在接受 L L L 的非确定图灵机 N \mathbb{N} N 和常数 c > 0 c>0 c>0, c T ( n ) c T(n) cT(n) 为 N \mathbb{N} N 的时间函数。用此记号, 可定义非确定复杂性类, 比如:
N P = ⋃ c ≥ 1 NTIME ( n c ) , N E X P = ⋃ c ≥ 1 NTIME ( 2 n c ) 。 \begin{aligned} \mathbf{N P} & =\bigcup_{c \geq 1} \operatorname{NTIME}\left(n^c\right), \\ \mathbf{N E X P} & =\bigcup_{c \geq 1} \operatorname{NTIME}\left(2^{n^c}\right) 。 \end{aligned} NPNEXP=c≥1⋃NTIME(nc),=c≥1⋃NTIME(2nc)。
N P \mathrm{NP} NP 就是著名的非确定多项式时间类。与之相关的问题, 即 “ N P = ? P \mathrm{NP} \stackrel{?}{=} \mathbf{P} NP=?P ”, 是计算机科学中最重要的基础性问题。
定理 1.7. P ⊆ N P ⊆ E X P ⊆ N E X P \mathrm{P} \subseteq \mathrm{NP} \subseteq \mathrm{EXP} \subseteq \mathrm{NEXP} P⊆NP⊆EXP⊆NEXP
两个定义 一个对应经典图灵机 一个对应非确定图灵机
在数学中,当两个集合之间的包含关系是严格的,意味着其中一个集合是另一个集合的子集,但两个集合并不相等。这种关系通常用符号 ⊊ \subsetneq ⊊ 表示
给定时间函数 f , g f, g f,g, 若 f ≤ g f \leq g f≤g, 必有 T I M E ( f ( n ) ) ⊆ T I M E ( g ( n ) ) \mathbf{T I M E}(f(n)) \subseteq \mathbf{T I M E}(g(n)) TIME(f(n))⊆TIME(g(n)) 。
定理 1.10 (时间谱系定理). 若 f , g f, g f,g 是时间可构造的且 f ( n ) log f ( n ) = o ( g ( n ) ) f(n) \log f(n)=o(g(n)) f(n)logf(n)=o(g(n)),则 T I M E ( f ( n ) ) ⊊ T I M E ( g ( n ) ) \mathbf{T I M E}(f(n)) \subsetneq \mathbf{T I M E}(g(n)) TIME(f(n))⊊TIME(g(n)) 。
Exponential Hierarchy
E X P = ⋃ c > 1 TIME ( 2 n c ) 2 E X P = ⋃ c > 1 TIME ( 2 2 n c ) 3 E X P = ⋃ c > 1 TIME ( 2 2 2 n c ) ⋮ ELEMENTARY = E X P ∪ 2 E X P ∪ 3 E X P ∪ … \begin{aligned} \mathbf{E X P} & =\bigcup_{c>1} \operatorname{TIME}\left(2^{n^c}\right) \\ 2 \mathbf{E X P} & =\bigcup_{c>1} \operatorname{TIME}\left(2^{2^{n^c}}\right) \\ 3 \mathbf{E X P} & =\bigcup_{c>1} \operatorname{TIME}\left(2^{2^{2^{n^c}}}\right) \\ & \vdots \\ \text { ELEMENTARY } & =\mathbf{E X P} \cup 2 \mathbf{E X P} \cup 3 \mathbf{E X P} \cup \ldots \end{aligned} EXP2EXP3EXP ELEMENTARY =c>1⋃TIME(2nc)=c>1⋃TIME(22nc)=c>1⋃TIME(222nc)⋮=EXP∪2EXP∪3EXP∪…
定理 1.11 (非确定时间谱系定理). 若 f , g f, g f,g 为时间可构造,且 f ( n + 1 ) = o ( g ( n ) ) f(n+1)=o(g(n)) f(n+1)=o(g(n)),则 N T I M E ( f ( n ) ) ⊊ N T I M E ( g ( n ) ) \mathbf{N T I M E}(f(n)) \subsetneq \mathbf{N T I M E}(g(n)) NTIME(f(n))⊊NTIME(g(n)) 。
定理 1.12 (间隙定理). 设 r ( x ) ≥ x r(x) \geq x r(x)≥x 为可计算全函数。存在可计算全函数 b ( x ) b(x) b(x)使得等式 T I M E ( b ( x ) ) = T I M E ( r ( b ( x ) ) ) \mathbf{T I M E}(b(x))=\mathbf{T I M E}(r(b(x))) TIME(b(x))=TIME(r(b(x))) 成立。
间隙定理的结论显然和时间谱系定理的结论相矛盾。因此, 上述证明里定义的可计算全函数 b b b 不是时间可构造的。间隙定理是计算复杂性理论中的又一个奠基性定理, 它告诉我们应该将目光局限在什么样的时间函数。