什么是算法?算法就是图灵机
3.1 图灵机
图灵机用一个无限长的带子作为无限存储,它有一个读写头,能在带子上读、写和左右移动。图灵机开始运作时,带子上只有输入串,其他地方都是空的,如果需要保存信息,它可将这个信息写在带子上。为了读已经写下的信息,它可将读写头往回移动到这个信息所在的位置。机器不停地计算,直到产生输出为止。机器预置了接收和拒绝两种状态,如果进入这两种状态,就产生接收(accept)或拒绝(reject),如果不能进入任何接收或拒绝状态,就继续执行下去,永不停止。
3.1.1 图灵机的形式化定义
D e f 3.1 Def\ 3.1 Def 3.1 图灵机
图灵机是一个7元组 ( Q , ∑ , Γ , δ , q 0 , q a c c e p t , q r e j e c t ) (Q,\sum,\Gamma,\delta,q_0,q_{accept},q_{reject}) (Q,∑,Γ,δ,q0,qaccept,qreject),其中: Q , ∑ , Γ Q,\sum,\Gamma Q,∑,Γ都是有穷集合,并且
- Q Q Q是状态集
- ∑ \sum ∑是输入字母表,不包括特殊空白符号 ⊔ \sqcup ⊔
- Γ \Gamma Γ是带子字母表,其中, ⊔ ∈ Γ , ⊳ ∈ Γ , ∑ ⊆ Γ \sqcup\in\Gamma,\rhd\in\Gamma,\sum\subseteq\Gamma ⊔∈Γ,⊳∈Γ,∑⊆Γ
- δ : Q × Γ → Q × Γ × { L , R } \delta:Q\times\Gamma\rightarrow Q\times \Gamma\times\{L,R\} δ:Q×Γ→Q×Γ×{L,R}是转移函数
- q 0 ∈ Q q_0\in Q q0∈Q是起始状态
- q a c c e p t ∈ Q q_{accept}\in Q qaccept∈Q是接收状态
- q r e j e c t ∈ Q q_{reject}\in Q qreject∈Q是拒绝状态,且 q r e j e c t ≠ q a c c e p t q_{reject}\ne q_{accept} qreject=qaccept
例:输入一个二进制数n,低位在前,输出n+1
Input | Output |
---|---|
101 ⊔ ⊔ 101\sqcup\sqcup 101⊔⊔ | 011 ⊔ ⊔ 011\sqcup\sqcup 011⊔⊔ |
11 ⊔ ⊔ 11\sqcup\sqcup 11⊔⊔ | 001 ⊔ ⊔ 001\sqcup\sqcup 001⊔⊔ |
∑ = { 0 , 1 } , Γ = { 0 , 1 , ⊔ , ⊳ } \sum=\{0,1\},\Gamma=\{0,1,\sqcup,\rhd\} ∑={0,1},Γ={0,1,⊔,⊳}
例1:判断回文串
,图灵机编程先写一下想法
- 读一个字符,并写为空格,0和1进入不同的路径
- 接着不停地往右走,直到读到空格,往左走一格
- 进行比较,如果不同,则进入 q r e j e c t q_{reject} qreject,如果相同,写为空格后回到 q s t a r t q_{start} qstart重复上述过程
- 接收状态有两种:
- 偶数,最终正好把所有字符写为空格后回到 q s t a r t q_{start} qstart,则在 q s t a r t q_{start} qstart读到空格则接收
- 奇数,最后一次读到一个字符并进入到对应状态,没有下一个有效的字符进行判断,则此时读到空格接收
例2:2的n次方
:图灵机判断
L
=
{
0
2
n
∣
n
≥
0
}
L=\{0^{2^n}|n\ge0\}
L={02n∣n≥0}
每次擦除一半的0,直到只剩一个0则接受,如果为奇数个0则拒绝。(隔一个擦一个)
- 从左往右,隔一个0,擦除一个0(写x)
- 如果在跳过一个0后读到了空格,则说明是奇数,直接拒绝
- 接着回到最左边,重复上述操作,直到0全部被擦除。
∑ = { 0 } , Γ = { 0 , ⊔ , x } \sum=\{0\},\Gamma=\{0,\sqcup,x\} ∑={0},Γ={0,⊔,x},空格在最左边,x用来表示被擦除的0
例3:判断字符串相等
,图灵机判断
L
=
{
w
#
w
:
w
∈
{
0
,
1
}
∗
}
,
∑
=
{
0
,
1
,
#
}
L=\{w\#w:w\in\{0,1\}^*\},\sum=\{0,1,\#\}
L={w#w:w∈{0,1}∗},∑={0,1,#}
- 读取一个字符并改为x后,不断向右移动,直到遇到 # \# #。
- 跳过x后,进行比较,如果不同则拒绝;如果相同则写为x并回到最左端并重复。
- 最终在x后读到#则接收
练习:
-
二进制整数比较: L = { x , y ∣ x , y ∈ { 0 , 1 } ∗ , x ≥ y } L=\{x,y|x,y\in\{0,1\}^*,x\ge y\} L={x,y∣x,y∈{0,1}∗,x≥y} 最高位在前
先比较长度,再回到最高位比较。
-
二进制+1,最高位在前(input:100 ,output:101)
特殊处理全1的情况就好
-
L = { 0 n 1 n } L=\{0^n1^n\} L={0n1n}
如果第一位是空格则接收,然后就读0,找1,重复
D
e
f
3.2
Def\ 3.2
Def 3.2 可判定
语言 L ⊆ { 0 , 1 } ∗ L\subseteq \{0,1\}^* L⊆{0,1}∗,M是一个图灵机,L可被M在时间 T ( n ) T(n) T(n)内判定,如果 ∀ x ∈ { 0 , 1 } ∗ \forall x\in\{0,1\}^* ∀x∈{0,1}∗:
-
M在 T ( n ) T(n) T(n)步内停止
-
如果 x ∈ L x\in L x∈L,那么 M M M接收 x x x
-
如果 x ≠ L x\ne L x=L,那么 M M M拒绝 x x x(不允许出现死循环)
D
e
f
3.3
Def\ 3.3
Def 3.3 图灵可判定
L ⊆ { 0 , 1 } ∗ L\subseteq\{0,1\}^* L⊆{0,1}∗,如果有一个图灵机可判定他,则称 L L L是(图灵)可判定的
D
e
f
3.4
Def\ 3.4
Def 3.4 可识别
M是一个图灵机,M可接收的字符串集被称为被M识别的语言,记为 L ( M ) L(M) L(M),比判定弱,L之外的语言可不被接收,也可能死循环。
D
e
f
3.5
Def\ 3.5
Def 3.5图灵可识别
L ⊆ { 0 , 1 } ∗ L\subseteq\{0,1\}^* L⊆{0,1}∗,称L为图灵可识别,如果存在一个图灵机识别他。
由定义可知,每一个可判定的语言都是可识别的,反过来则不一定,例如:
L = { < M , x > , 输入 x , M 会停机 } L=\{<M,x>,输入x,M会停机\} L={<M,x>,输入x,M会停机},这是可识别的,因为L是可接收的,单如果 x ≠ L x\ne L x=L,M可能会陷入死循环。
D e f 3.6 Def\ 3.6 Def 3.6 时间复杂度`
映射 f : { 0 , 1 } ∗ → { 0 , 1 } ∗ ∪ { u n d e f i n e d } f:\{0,1\}^*\rightarrow\{0,1\}^*\cup\{undefined\} f:{0,1}∗→{0,1}∗∪{undefined},如果 ∀ x ∈ { 0 , 1 } ∗ , f ( x ) ≠ u n d e f i n e d \forall x\in\{0,1\}^*,f(x)\ne undefined ∀x∈{0,1}∗,f(x)=undefined,M在 T ( ∣ x ∣ ) T(|x|) T(∣x∣)步内停下,并输出 f ( x ) f(x) f(x)
E v e r y t h i n g s h o u l d b e m a d e a s s i m p l e a s p o s s b i l e , b u t n o s i m p l e r Everything\ should\ be\ made\ as\ simple\ as\ possbile,but\ no\ simpler Everything should be made as simple as possbile,but no simpler
3.1.2 图灵机变体
L e m a 3.7 Lema\ 3.7 Lema 3.7 图灵机等价
如果语言
L
⊆
{
0
,
1
}
∗
L\subseteq\{0,1\}^*
L⊆{0,1}∗可在时间
T
(
n
)
T(n)
T(n)内被图灵机(带子字母表为
Γ
\Gamma
Γ)判定,那么他可在
O
(
l
o
g
∣
Γ
∣
T
(
n
)
)
=
O
Γ
(
T
(
n
)
)
O(log|\Gamma|T(n))=O_{\Gamma}(T(n))
O(log∣Γ∣T(n))=OΓ(T(n))
时间内被图灵机
M
′
(
Γ
′
=
{
0
,
1
,
⊔
,
⊳
}
)
M'(\Gamma'=\{0,1,\sqcup,\rhd\})
M′(Γ′={0,1,⊔,⊳})判定
P r o o f Proof Proof:
用 k = ⌈ l o g 2 ∣ Γ ∣ ⌉ = O ( l o g 2 ∣ Γ ∣ ) k=\lceil log_2|\Gamma|\rceil=O(log_2|\Gamma|) k=⌈log2∣Γ∣⌉=O(log2∣Γ∣)bits编码 Γ \Gamma Γ的标识符,新的图灵机 M ′ M' M′将
- 用 k k k步读一个标识 a ∈ Γ a\in\Gamma a∈Γ
- 转移到下一步 q ′ q' q′,得到一个新的标识 b b b(用来改写 a a a)
- 用 b b b替换 a a a
- 接着用 k k k步实现左移右移或者保持
综上所述,这一步的模拟需要 k + 1 + k + k = O ( k ) k+1+k+k=O(k) k+1+k+k=O(k)步,那么 T ( n ) T(n) T(n)步需要 O ( l o g 2 ∣ Γ ∣ T ( n ) ) O(log_2|\Gamma|T(n)) O(log2∣Γ∣T(n))步
D
e
f
3.8
Def\ 3.8
Def 3.8 多带图灵机
一个 k k k-带图灵机M是一个七元组 ( Q , ∑ , Γ , δ , q 0 , q a c c e p t , q r e j e c t ) (Q,\sum,\Gamma,\delta,q_0,q_{accept},q_{reject}) (Q,∑,Γ,δ,q0,qaccept,qreject),其中 δ : Q × Γ k → Q × Γ k × { L , R , S } k \delta:Q\times \Gamma^k \rightarrow Q\times \Gamma^k\times \{L,R,S\}^k δ:Q×Γk→Q×Γk×{L,R,S}k,通常来说,第一条带子作为输入带,如果要输出,那么最后一条带子作为输出带, k = O ( 1 ) k=O(1) k=O(1)(必须是一个常数)
L
e
m
a
3.9
Lema\ 3.9
Lema 3.9 多带等价
L ⊆ { 0 , 1 } ∗ L\subseteq \{0,1\}^* L⊆{0,1}∗,如果 L L L可被一个 k − t a p e k-tape k−tape 图灵机在时间 T ( n ) T(n) T(n)内识别,那么 L L L可在时间 O ( k T 2 ( n ) ) O(kT^2(n)) O(kT2(n))内被一个单带图灵机识别。( n n n为输入长度, S ( n ) S(n) S(n)为K带图灵机用的格子数, T ( n ) T(n) T(n)为K带图灵机所用的时间,即转移次数,假定 T ( n ) ≥ n T(n)\ge n T(n)≥n, S ′ ( n ) S'(n) S′(n)为单带图灵机用的格子数,显然有 S ( n ) ≤ T ( n ) S(n)\le T(n) S(n)≤T(n))
P r o o f Proof Proof
用位置 i − 1 , k + i − 1 , 2 k + i − 1 , ⋯ i-1,k+i-1,2k+i-1,\cdots i−1,k+i−1,2k+i−1,⋯,来模拟第 i i i条带子, i = 1 , 2 , ⋯ , k i=1,2,\cdots,k i=1,2,⋯,k, ∀ a ∈ Γ \forall a \in \Gamma ∀a∈Γ,引入 a , a ^ ∈ Γ ′ a,\hat a\in \Gamma' a,a^∈Γ′, a ^ \hat a a^标记表头的位置,来模拟图灵机 M M M的一步,单带图灵机 M ′ M' M′将
- 从左到右的扫描一遍表带,读 k k k个标志,用 ^ \hat{\ } ^标记,但我们并不清楚这k个标志的顺序
- 应用 M M M的转移函数 δ \delta δ来决定下一个状态,对于k个标志的顺序,我们可以使用
- 如果需要往回(从右到左)更新k个标志(S’(n)),并移动 ^ \hat{\ } ^( 2 k 2 2k^2 2k2,去又回,2k,共k个)
总计3步,共用了 k S ’ ( n ) + O ( 1 ) + S ′ ( n ) + 2 k 2 ≤ k T ( n ) + O ( 1 ) + O ( k T ( n ) ) = O ( k T ( n ) ) kS’(n)+O(1)+S'(n)+2k^2\le kT(n)+O(1)+O(kT(n))=O(kT(n)) kS’(n)+O(1)+S′(n)+2k2≤kT(n)+O(1)+O(kT(n))=O(kT(n)),共有 T ( n ) T(n) T(n)步,故为 O ( k T 2 ( n ) ) O(kT^2(n)) O(kT2(n))
D
e
f
3.10
Def\ 3.10
Def 3.10 双向纸带图灵机
双向纸带图灵机的带子在两端都是无限的
L e m a 3.10 Lema\ 3.10 Lema 3.10 L ⊆ ∑ ∗ L\subseteq \sum^* L⊆∑∗,若 L L L可被一个双向纸带图灵机在 T ( n ) T(n) T(n)内判定,那么它可以被一个单带图灵机在 O ( T ( n ) ) O(T(n)) O(T(n))内判定。
P r o o f Proof Proof
对于双向纸带图灵机,标记起点为0,左边记为负数 − i -i −i,右边记为正数 i i i,可映射到单带图灵为: i → 2 i , − i → 2 i + 1 i\rightarrow 2i,-i\rightarrow 2i+1 i→2i,−i→2i+1
对双向纸带图灵机 M M M的每一步,单带图灵机 M ′ M' M′将
- 读标记
- 转移到下一个状态
- 更新标记
- 如果需要,向左或向右移动两位
总计4步,每一步需要 O ( 1 ) O(1) O(1)来模拟,故总计在 O ( T ( n ) ) O(T(n)) O(T(n))内
D e f 3.11 Def\ 3.11 Def 3.11 随机访存图灵机
随机访存图灵机(Random access memory,RAM) 是一个拥有随机访存的图灵机
- M M M拥有一条无限内存带 A A A,使用自然数集 N \N N作为索引
- M M M的其中一条带子是地址带
- Γ \Gamma Γ 拥有两种特殊的符号R(read)和W(write)
-
Q
Q
Q拥有两种特殊的状态
Q
a
c
c
e
s
s
⊆
Q
Q_{access}\subseteq Q
Qaccess⊆Q,无论何时
M
M
M进入到状态
q
∈
Q
a
c
c
e
s
s
q\in Q_{access}
q∈Qaccess
- 如果地址带包含 i R iR iR,( i i i为R之前的一串字符串), A [ i ] A[i] A[i]的值将会被写到 R R R旁边的格子
- 如果地址带包含 i W σ iW\sigma iWσ,那么 A [ i ] = σ A[i]=\sigma A[i]=σ
如果有 k k k个工作带,那么 δ : Q × Γ k + 1 → Q × Γ k + 1 × { L , R , S } k + 1 \delta:Q\times \Gamma^{k+1}\rightarrow Q\times \Gamma^{k+1}\times\{L,R,S\}^{k+1} δ:Q×Γk+1→Q×Γk+1×{L,R,S}k+1 ,内存带不需要指针
那么随机访存图灵机是一个八元组,假设有k个工作带,一个地址带m,
那么 M = ( Q , ∑ , Γ , δ , q 0 , q a c c e p t , q r e j e c t , Q a c c e s s ) , δ : Q × Γ k + 1 → Q × Γ k + 1 × { L , R , S } k + 1 M=(Q,\sum,\Gamma,\delta,q_0,q_{accept},q_{reject},Q_{access}),\delta:Q\times \Gamma^{k+1}\rightarrow Q\times \Gamma^{k+1}\times\{L,R,S\}^{k+1} M=(Q,∑,Γ,δ,q0,qaccept,qreject,Qaccess),δ:Q×Γk+1→Q×Γk+1×{L,R,S}k+1
L e m a 3.12 Lema\ 3.12 Lema 3.12 RAM图灵机可被多带图灵机判定
若 L ⊆ { 0 , 1 } ∗ L\subseteq\{0,1\}^* L⊆{0,1}∗,若 L L L可在 T ( n ) T(n) T(n)被一个RAM图灵机判定,那么它可以在 O ( T 3 ( n ) ) O(T^3(n)) O(T3(n))的时间内被一个多带图灵机判定。
如果地址带长度为 O ( 1 ) O(1) O(1)(例如现实中的32位,64位),那么可在 O ( T 2 ( n ) ) O(T^2(n)) O(T2(n))内被多带图灵机判定。
P r o o f Proof Proof
用一条额外工作带A作为内存,来保存元组 ( i , A [ i ] ) (i,A[i]) (i,A[i]),其中 i i i是一个二进制整数, A [ i ] ∈ Γ A[i]\in\Gamma A[i]∈Γ,是所有被引用的内存地址
$pairs\le T(n),length\ of\ each \ pair\le O(T(n)),length\ of\ the\ extra \ memory\ tape\le O(T^2(n)) $
模拟 M M M的一步,如果 M M M在一次访问中,那么多带图灵机M‘将:
- 扫描带A来找到一个在地址带中匹配 i i i的地址
- 如果不存在这样的 i i i,添加一个新的元组 ( i , A [ i ] ) (i,A[i]) (i,A[i])
- 读或写 A [ i ] A[i] A[i]
每一步用时 O ( T 2 ( n ) ) + O ( T ( n ) ) + O ( T ( n ) ) = O ( T 2 ( n ) ) O(T^2(n))+O(T(n))+O(T(n))=O(T^2(n)) O(T2(n))+O(T(n))+O(T(n))=O(T2(n)), T ( n ) T(n) T(n)步为 O ( T 3 ( n ) ) O(T^3(n)) O(T3(n))
如果地址带长度为 O ( 1 ) O(1) O(1),那么 p a i r s ≤ T ( n ) , l e n g t h o f e a c h p a i r = O ( 1 ) , l e n g t h o f t h e e x t r a m e m o r y t a p e ≤ O ( T ( n ) ) pairs\le T(n),length \ of\ each\ pair=O(1),length\ of\ the\ extra\ memory\ tape \le O(T(n)) pairs≤T(n),length of each pair=O(1),length of the extra memory tape≤O(T(n)),那么每一步将花费 O ( T ( n ) ) O(T(n)) O(T(n))的时间,总共花费 O ( T 2 ( n ) ) O(T^2(n)) O(T2(n))
若忽略多项式,所有图灵机都是等价的。
使用RAM图灵机模拟汇编语言:
一组固定数量的寄存器(64bits)
对于加法、减法、 乘法
a d d R 0 , R 1 , R 2 / / R 0 ← R 1 + R 2 add\ R_0,R_1,R_2 // R_0\leftarrow R_1+R2 add R0,R1,R2//R0←R1+R2
s u b R 0 , R 1 , R 2 / / R 0 ← R 1 − R 2 sub\ R_0,R_1,R_2 // R_0\leftarrow R_1-R2 sub R0,R1,R2//R0←R1−R2
M U L R 0 , R 1 , R 2 / / R 0 ← R 1 × R 2 MUL\ R_0,R_1,R_2 // R_0\leftarrow R_1\times R2 MUL R0,R1,R2//R0←R1×R2
比较(将结果储存在状态寄存器中)
C M P R 0 , R 1 CMP \ R_0,R_1 CMP R0,R1
移动
M o v R 0 , R 1 / / R 0 ← R 1 Mov\ R_0,R_1//R_0\leftarrow R_1 Mov R0,R1//R0←R1
位运算,or,xor
KaTeX parse error: Undefined control sequence: \or at position 37: …\leftarrow R_1 \̲o̲r̲ ̲R_2
E O R R 0 , R 1 , R 2 / / R 0 ← R 1 ⊕ R 2 EOR\ R_0,R_1,R_2//R_0\leftarrow R_1\oplus R_2 EOR R0,R1,R2//R0←R1⊕R2
测试相等
T S T R 0 , # 8 TST\ R_0,\#8 TST R0,#8
T E Q R 0 , R 1 TEQ\ R_0,R_1 TEQ R0,R1
逻辑位移
L S L R 0 , R 1 , # 3 / / R 0 ← 将 R 1 左移 3 位,存在 R 0 中 LSL\ R_0,R_1,\#3// R_0\leftarrow 将R_1左移3位,存在R_0中 LSL R0,R1,#3//R0←将R1左移3位,存在R0中
L S L R 0 , R 1 , R 2 LSL\ R_0,R_1,R_2 LSL R0,R1,R2
旋转
R O R R 0 , R 1 , # 5 / / R 1 右移 5 位,移出的位从另一边进入 ROR\ R_0,R_1,\#5//R_1右移5位,移出的位从另一边进入 ROR R0,R1,#5//R1右移5位,移出的位从另一边进入
内存相关操作
L D R R 0 [ R 1 ] / / R 0 ← M [ R 1 ] LDR \ R_0[R_1]//R_0\leftarrow M[R_1] LDR R0[R1]//R0←M[R1]
S T R R 1 [ R 0 ] / / M [ R 0 ] ← R 1 STR\ R_1[R_0]//M[R_0]\leftarrow R_1 STR R1[R0]//M[R0]←R1
上述每个汇编操作都可以用RAM图灵机在 O ( 1 ) O(1) O(1)步内完成
算法相关的书中的时间复杂度,是用的RAM图灵机
复杂性理论的书中的时间复杂度,使用的多带图灵机
C h u r c h − T u r i n g t h e s i s Church-Turing \ thesis Church−Turing thesis
物理世界中可计算的所有函数都可以被图灵机计算(例如:量子,生物)
S t r o n g C T t h e s i s Strong\ CT \ thesis Strong CT thesis
可在多项式时间内计算完成。(可能的例外:量子计算机)