3 计算机科学简介
- 算法是执行某些任务的精确方法,本章将概述在计算机科学中发展的现代算法理论。
- 刻画算法的基本模型是图灵机,这是一台理想化的计算机, 具有更简单的基本指令集和理想化的无限内存。 它们可用于执行任何算法,甚至是那些在看似强大得多的计算机上运行的算法。
- 在算法研究中试图解决的基本问题是:执行给定的算任务需要哪些资源?
- 了解哪些计算任务是可能的 最好是通过提供解决特定问题的显式算法。
- 论证关于可以完成哪些计算任务的限制。
3.1 计算模型
使用两种方法解释计算模型。
3.1.1 图灵机
图灵机:用来刻画执行某项计算任务的算法的概念
图灵机的基本要素
如图3.1,图灵机包含四个主要元素:
- 程序program:类似普通的计算机
- 有限状态控制器finite state control:作用类似于精简的微处理器,协调机器的其他运算
- 纸带tape:作用类似于计算机内存
- 读写头read/write head:指向带上当前可读或可写的位置
-
有限状态控制器由一组有限的内部状态 q 1 , . . . , q m q_1,...,q_m q1,...,qm组成,其中 m m m是某个固定的常数。
- 有限状态控制器可以看作是一种协调图灵机运算的微处理器。它提供纸带外的临时存储,以及可以完成机器的所有处理的核心位置。
- 除了状态 q 1 , . . . , q m q_1,...,q_m q1,...,qm,还有两个特殊的内部状态,标记为 q s q_s qs和 q h q_h qh,分别对应为起始状态和停止状态。在计算开始时,图灵机处于起始状态 q s q_s qs,如果计算完成,图灵机将以状态 q h q_h qh结束,表示机器完成了它的运算。
-
纸带是一维的,纸带由无限长的纸带格序列组成。
- 纸带格:编号为 0 , 1 , 2 , 3 , . . . 0,1,2,3,... 0,1,2,3,...。每个纸带格包含一个来自于某个字母表 Γ \Gamma Γ的符号,其中 Γ \Gamma Γ包含有限个不同的符号。
- exp. ,假设字母表包含四个符号,我们用 0 , 1 , b 0,1,b 0,1,b("空白"符)和 ⊳ \rhd ⊳(标记带的左端点)表示。开始时,带的左端包含一个 ⊳ \rhd ⊳符号和有限个 0 0 0和 1 1 1,带的其余部分包含空白符。
-
读写头指定图灵机纸带上的某个方格作为机器当前正在访问的方格。
机器在有限状态控制器处于状态 q s q_s qs时开始它的运算,此时读写头位于最左端编号为 0 0 0的纸带格上。然后计算根据程序逐步进行。如果当前状态是 q h q_h qh,那么计算停止,并且计算的输出是纸带当前的(非空白)内容。
- 程序是形如
⟨
q
,
x
,
q
′
,
x
′
,
s
⟩
\left \langle q,x,q',x',s \right \rangle
⟨q,x,q′,x′,s⟩的程序行的有限顺序列表。
- q q q是来自于机器内部状态集的一个状态, x x x取自可能出现在纸带上的符号组成的字母表 Γ \Gamma Γ。
- 程序的工作方式:在每个机器周期中,图灵机按顺序查看程序行列表,搜索形如 ⟨ q , x , ⋅ , ⋅ , ⋅ ⟩ \left \langle q,x,\cdot,\cdot,\cdot \right \rangle ⟨q,x,⋅,⋅,⋅⟩的程序行,其中机器当前的内部状态为 q q q,带上正在读取的符号是 x x x。如果它没有找到这样的程序行,那么机器的内部状态变为 q h q_h qh,且机器停止运行。如果找到了这样程序行,则执行该程序行。
- 程序行执行步骤:机器的内部状态更改为 q ′ q' q′;纸带上的符号 x x x被符号 x ′ x' x′覆盖,并且读写头向左移动、向右移动,或者保持不动,这分别取决于 s s s是 − 1 , + 1 -1,+1 −1,+1还是 0 0 0。这个规则的唯一例外是,如果带头位于最左端的纸带格,且 s = − 1 s=-1 s=−1;在这种情况下带头保持不动。
如何计算一个简单的函数
exp. 计算常值函数 f ( x ) = 1 f(x)=1 f(x)=1
初始时机器的纸带上是一个二进制数
x
x
x,其后跟着空白符。除了起始状态
q
s
q_s
qs和停止状态
q
h
q_h
qh之外,机器还具有三个内部状态
q
1
,
q
2
q_1,q_2
q1,q2和
q
3
q_3
q3。它的程序包含如下程序行:
1
:
⟨
q
s
,
▹
,
q
1
,
▹
,
+
1
⟩
2
:
⟨
q
1
,
0
,
q
1
,
b
,
+
1
⟩
3
:
⟨
q
1
,
1
,
q
1
,
b
,
+
1
⟩
4
:
⟨
q
1
,
b
,
q
2
,
b
,
−
1
⟩
5
:
⟨
q
2
,
b
,
q
2
,
b
,
−
1
⟩
6
:
⟨
q
2
,
▹
,
q
3
,
▹
,
+
1
⟩
7
:
⟨
q
3
,
b
,
q
h
,
1
,
0
⟩
\begin{array}{l} 1:\left\langle q_{\mathrm{s}}, \triangleright, q_{1}, \triangleright,+1\right\rangle \\ 2:\left\langle q_{1}, 0, q_{1}, b,+1\right\rangle \\ 3:\left\langle q_{1}, 1, q_{1}, b,+1\right\rangle \\ 4:\left\langle q_{1}, b, q_{2}, b,-1\right\rangle \\ 5:\left\langle q_{2}, b, q_{2}, b,-1\right\rangle \\ 6:\left\langle q_{2}, \triangleright, q_{3}, \triangleright,+1\right\rangle \\ 7:\left\langle q_{3}, b, q_{\mathrm{h}}, 1,0\right\rangle \end{array}
1:⟨qs,▹,q1,▹,+1⟩2:⟨q1,0,q1,b,+1⟩3:⟨q1,1,q1,b,+1⟩4:⟨q1,b,q2,b,−1⟩5:⟨q2,b,q2,b,−1⟩6:⟨q2,▹,q3,▹,+1⟩7:⟨q3,b,qh,1,0⟩
执行过程:初始时机器处于状态
q
s
q_s
qs和最左端的纸带格上,因此第一行被执行,这导致带头向右移动而不改变纸带上写入的内容,但是机器的内部状态变为
q
1
q_1
q1。接下来的三行程序确保当机器处于状态
q
1
q_1
q1时,如果它在纸带上读取到
0
0
0(第2行)或者
1
1
1(第3行),带头会继续向右移动,同时使用空白符覆盖带上的内容,并且保持在状态
q
1
q_1
q1,直到它到达一个已经包含空白符的纸带格,此时读写头向左移动一个位置,并且内部的状态变为
q
2
q_2
q2(第4行)。其后,第5行确保带头在读取到空白符的时候保持向左移动而不改变带的内容。这一直持续到带头返回它的起始点,此时它在纸带上读取到
⊳
\rhd
⊳,将内部状态更改为
q
3
q_3
q3,然后向右移动一步(第6行),第7行完成程序,仅仅将数字
1
1
1打印到纸带上,然后停止。
更一般地,图灵机可以被当作是计算从非负整数到非负整数的函数;带的状态用于表示函数的输入,纸带的最终状态用于表示函数的输出。
丘奇-图灵论题
图灵机可计算的函数类完全对应于我们自然地认为可由算法计算的函数类。
- 丘奇-图灵论题断言了一个严格的数学概念:图灵机可计算的函数与可由算法计算的函数这一直观概念之间的等价性。
- 量子计算机也遵循丘奇-图灵论题。量子计算机与图灵机可计算的函数类相同。量子计算机和图灵机之间的区别在于使用它们执行函数计算时的效率不同。
图灵机模型的变体
- 具有不同种类的纸带
- 将随机性引入模型中
专题3.1 通用图灵机
图灵机包含三部分:纸带上的初始格局、有限状态控制器的内部状态以及机器的程序。
通用图灵机UTM允许我们一劳永逸地固定住程序和有限状态控制器,使得带上的初始内容称为机器唯一可以改变的部分。
UTM的特性:设 M M M为任意的图灵机,令 T M T_M TM为与机器 M M M关联的图灵编号。在如下输入上: T M T_M TM的二进制表示后跟着一个空白符,而后在纸带的其余部分上跟着任意的字符串 x x x,通用图灵机给出机器 M M M在输入 x x x上的输出作为它的输出。因此,通用图灵机可以模拟任何其他的图灵机。
专题3.2 停机问题
希尔伯特可判定问题:是否存在算法能够判定所有的数学问题。
每个图灵机都可以唯一地关联到列表 1 , 2 , 3 , . . . 1,2,3,... 1,2,3,...中的一个数字。
为解决希尔伯特问题,图灵使用这一编号提出了停机问题:图灵编号为 x x x的机器是否在输入为编号 y y y时停机?
结果:没有算法能够解决停机问题。
3.1.2 电路
电路模型在计算能力方面与图灵机相当,但对于许多应用来说更加方便和实际。
电路的组成
- 电路由导线和门组成,分别携带信息和执行简单的计算任务。
exp. 图3.2中的电路是将单比特 a a a作为输入,传递给一个非门,非门翻转该比特,把 1 1 1变成 0 0 0, 0 0 0变成 1 1 1。
- 电路可能包含许多输入和输出比特,许多导线和许多逻辑门。逻辑门是从某些固定的
k
k
k个输入比特到某些固定的
l
l
l个输出比特的函数
f
:
{
0
,
1
}
k
→
{
0
,
1
}
l
f:\{0,1\}^k\to \{0,1\}^l
f:{0,1}k→{0,1}l。
- 电路中不允许循环,不允许包含回路
逻辑门
如图3.4所示,与、或、异或、与非、非门
-
扇出门:允许比特分裂,用自身的两个副本代替自己。
-
交叉门:允许比特交叉,两个比特的值互相交换。
exp. 这些简单的电路元件可以放在一起执行各种各样的计算。这些元件可用于计算任何函数。
实现相加两个n比特整数。
- 图3.5中是一个半加法器,把两个比特 x x x和 y y y作为输入,输出它们的模2加 x ⊕ y x\oplus y x⊕y和以及一个进位。如果 x x x和 y y y都是1,则进位位1,否则为0。
- 可以使用两个级联的半加法器来构造一个全加法器,图3.6所示。全加法器把三个比特 x , y , c x,y,c x,y,c作为输入,比特 x x x和 y y y看作是要相加的数据, c c c来自较早计算的进位。电路输出两个比特,一个输出比特是所有输入比特的模2加和 x ⊕ y ⊕ c x\oplus y\oplus c x⊕y⊕c,第二个比特 c ′ c' c′是进位,如果两个或多个输入1,则设置为1,否则为0。
- 通过将许多全加法器组合在一起,就可以得到一个相加两个n比特整数的电路,图3.7所示是 n = 3 n=3 n=3的情况
一致电路族
电路族由一组电路 { C n } \{C_n\} {Cn}组成,由整数 n n n作为索引。电路 { C n } \{C_n\} {Cn}具有n个输入比特,并且可能具有任意有限个额外的工作比特以及输出比特。
- 在长度最多为n个比特的输入 x x x上,电路 C n C_n Cn的输出被记为 C n ( x ) C_n(x) Cn(x)。
- 电路一致性:如果 m < n m<n m<n且 x x x的长度最多是 m m m比特,那么 C m ( x ) = C n ( x ) C_m(x)=C_n(x) Cm(x)=Cn(x)。
一致电路族:如果存在某个允许在图灵机上的算法,其在输入n上,生成 C n C_n Cn的一个描述。该算法的输出描述了电路 C n C_n Cn中有哪些门,这些门如何连接在一起组成一个电路,电路所需的辅助比特,扇出和交叉运算,以及应该从电路的哪里读取输出。
3.2 计算问题的分析
对于计算问题的分析取决于三方面:
- 什么是计算问题
- 如何设计算法来解决给定的计算问题
- 解决给定计算问题所需的最小资源是什么
3.2.1 如何量化计算资源
量化资源需求的工具之一:渐近符号,可用于概括函数的本质行为。
-
O O O(大 O O O):用来设定函数行为的上界。
假设 f ( n ) f(n) f(n)和 g ( n ) g(n) g(n)是非负整数上的两个函数。我们说 f ( n ) f(n) f(n)在函数类 O ( g ( n ) ) O(g(n)) O(g(n))当中或者 f ( n ) f(n) f(n)是 O ( g ( n ) ) O(g(n)) O(g(n))的,如果存在常数 c c c和 n 0 n_0 n0,使得对于所有大于 n 0 n_0 n0的 n n n, f ( n ) ≤ c g ( n ) f(n)\le cg(n) f(n)≤cg(n)。也就是说对于足够大的 n n n,在相差一个不重要的常数因子的意义下,函数 g ( n ) g(n) g(n)是 f ( n ) f(n) f(n)的一个上界。
- 用于研究特定算法最坏情况下的行为
-
Ω \Omega Ω(大Omega):用来界定所需资源的下界。
函数 f ( n ) f(n) f(n)被称为是 Ω ( g ( n ) ) \Omega (g(n)) Ω(g(n))的,如果存在常数 c c c和 n 0 n_0 n0,使得对于所有大于 n 0 n_0 n0的 n n n, c g ( n ) ≤ f ( n ) cg(n)\le f(n) cg(n)≤f(n)。也就是说对于足够大的 n n n,在相差一个不重要的常数因子的意义下,函数 g ( n ) g(n) g(n)是 f ( n ) f(n) f(n)的一个下界。
-
Θ \Theta Θ(大Theta):用于表示在相差一个不重要的常数因子的意义下, f ( n ) f(n) f(n)的行为渐进地与 g ( n ) g(n) g(n)相同。
f ( n ) f(n) f(n)是 Θ ( g ( n ) ) \Theta(g(n)) Θ(g(n))的,如果它是 O ( g ( n ) ) O(g(n)) O(g(n))和 Ω ( g ( n ) ) \Omega (g(n)) Ω(g(n))的
- n log n n^{\log n} nlogn是超多项式的: n k n^k nk是 O ( n log n ) O(n^{\log n}) O(nlogn)的,但是 n log n n^{\log n} nlogn不可能是 O ( n k ) O(n^k) O(nk)的
- n log n n^{\log n} nlogn是亚指数的: c n c^n cn是 Ω ( n log n ) \Omega(n^{\log n}) Ω(nlogn)的,但是 n log n n^{\log n} nlogn不可能是 Ω ( c n ) \Omega(c^n) Ω(cn)的
3.2.2 计算复杂性
定义
-
计算复杂性的任务:证明求解一个问题可能的最优算法所需资源的下界,即便我们未明确知晓这一算法。
-
计算复杂性的主要贡献:它可以使用关于 n n n的多项式的资源来解决的问题和需要使用比 n n n的任何多项式都增长的更快的资源的问题之间做出了区分。
- 后一种情况中,所需的资源通常是问题规模的指数大小
-
一个问题被认为是容易的、易解的或者可行的,如果存在一个使用多项式资源的算法求解该问题;
-
一个问题被认为是困难的、难解的或者不可行的,如果最好的算法都需要使用指数的资源。
多项式与指数分类
计算复杂性主要建立在多项式与指数分类的基础之上,原因:
- 除少数例外,多项式资源的算法比指数算法快的多
- 来源于强丘奇-图灵论题。如果在某个不是概率型图灵机的计算模型下可以使用 k k k个基本运算计算某个函数,那么在概率型图灵机模型下,总可以使用最多 p ( k ) p(k) p(k)个基本运算计算相同的函数,其中 p ( ⋅ ) p(\cdot) p(⋅)是某个多项式函数。
强丘奇-图灵论题
任何计算模型都可以在概率型图灵机上进行模拟,且最多只需要增加多项 式量级的基本运算次数。
- 对于计算复杂性的研究只需要关注概率型图灵机计算模型上。如果一个问题在概率型图灵机上没有多项式资源的解决方案,那么强丘奇-图灵论题意味着它在任何计算设备上都没有有效的解决方案。
缺陷
很难证明存在能够引起人们兴趣的需要指数资源来求解的问题类。
3.2.3 判定性问题与复杂类P与NP
判定性问题
-
判定性问题定义:一个答案为是或否的问题。
-
对判定性问题的一般性质的描述采用形式语言的术语。
一个字母表 Σ \Sigma Σ上的语言 L L L是集合 Σ ∗ \Sigma^* Σ∗的一个子集,其中 Σ ∗ \Sigma^* Σ∗是基于 Σ \Sigma Σ的所有有限长度字符串构成的集合。比如,当 Σ = { 0 , 1 } \Sigma=\{0,1\} Σ={0,1}时,所有偶数的二进制形式表示组成的集合, L = { 0 , 10 , 100 , 110 , . . . } L=\{0,10,100,110,...\} L={0,10,100,110,...}就是 Σ \Sigma Σ上的语言。
-
判定性问题可以用一种直接的方式被编码为语言上的问题。
素性测试问题的二进制编码方式如下:字母表 Σ = { 0 , 1 } \Sigma=\{0,1\} Σ={0,1}; Σ ∗ \Sigma^* Σ∗中的所有字符串与所有非负整数自然对应。比如 0010 0010 0010对应于数字2语言 L L L包含了与素数对应的所有字符串。
素性测试问题
- 定义:判断给定的整数 n n n是否为素数
- 素性测试图灵机:初始时刻将给定的整数
n
n
n写在输入纸带上,最终在输出纸带上给出结果,如果
n
n
n是素数输出“是”,否则输出”否“。
- 修改3.1.1节中图灵机的定义,将停机状态 q h q_h qh改为两个状态 q Y q_Y qY和 q N q_N qN,分别表示”是“和”否“。
- 一个语言 L L L被一个图灵机 M M M所判定,如果这个图灵机能够确定输入 x x x是否属于 L L L,即最终停在状态 q Y q_Y qY如果 x ∈ L x\in L x∈L,停在状态 q N q_N qN如果 x ∉ L x\notin L x∈/L。
复杂性类:P类
- 一个问题在类 TIME ( f ( n ) ) \text{TIME}(f(n)) TIME(f(n))中,如果存在一个图灵机可以在 O ( f ( n ) ) O(f(n)) O(f(n))的时间内判定输入 x x x是否属于这个语言,其中 n n n是输入 x x x的长度。
- 一个问题被称为多项式时间可解的,如果存在常数 k k k使得该问题在 TIME ( n k ) \text{TIME}(n^k) TIME(nk)中。
- P类:所有在 TIME ( n k ) , k ≥ 0 \text{TIME}(n^k),k\ge 0 TIME(nk),k≥0类中的语言组成的集合。
- 一个复杂性类是由一些语言组成的集合所定义的。
素因子分解问题
存在多项式时间无法解决的问题,但是证明任何给定的问题不能在多项式时间内解决是困难的。素因子分解问题是一个被认为不属于 P P P的判定性问题。
- 定义:给定一个合数 m m m和 l < m l<m l<m, m m m是否含有比 l l l小的非平凡因子。
- 素因子分解问题属于NP复杂性类别。
复杂性类:NP类
-
区分一个问题是否在类NP中取决于,问题的肯定回答可以在适当的证据的帮助下很容易的被验证。
-
更严格的,如果存在具有以下属性的图灵机 M M M,则语言 L L L在NP中:
- 如果 x ∈ L x\in L x∈L那么存在一个证据(一个字符串 w w w)使得当输入为 x -空白符- w x\text{-空白符-}w x-空白符-w时, M M M允许 ∣ x ∣ |x| ∣x∣的多项式量级的时间后在状态 q Y q_Y qY终止。
- 如果 x ∉ L x\notin L x∈/L那么对所有试图充当证据的字符串 w w w,当输入为 x -空白符- w x\text{-空白符-}w x-空白符-w时, M M M运行 ∣ x ∣ |x| ∣x∣的多项式量级的时间后在状态 q N q_N qN终止。
-
coNP类:由所有对否实例存在证据的语言组成的类,coNP中的语言是NP中语言的补集。
P与NP的关系
P是NP的子集,但目前无法证明 P ≠ NP \text{P}\ne \text{NP} P=NP
exp1. 图论问题
一个图是一个由顶点 { v 1 , . . . , v n } \{v_1,...,v_n\} {v1,...,vn}以及连接顶点的边构成的有限集合,其中边用顶点对 ( v i , v j ) (v_i,v_j) (vi,vj)表示。后续讨论是关于无向图。图3.9是图的一个典型例子。
图论中一个圈指一个顶点序列 v 1 , . . . , v m v_1,...,v_m v1,...,vm,其中 ( v j , v j + 1 ) (v_j,v_{j+1}) (vj,vj+1)以及 ( v 1 , v m ) (v_1,v_m) (v1,vm)均为图中的边。一个圈是简单的,如果顶点序列中没有重复的顶点。
- 哈密顿圈是一个包含图中所有顶点的简单圈,如图3.10给出了包含哈密顿圈和不包含哈密顿圈的图
- 哈密顿圈问题HC是确定一个给定的图是否包含一个哈密顿圈。
- HC是NP中的一个判定性问题,如果一个给定的图包含一个哈密顿圈,那么这个圈是一个易于检查的证据。
- HC目前没有一个多项式算法,HC是NP完全复杂性类中的问题。
- NP完全类包含了NP中被认为是最难的问题,即若HC能在 t t t时间内被解决,那么NP中所有问题都可以在 O ( poly(t) ) O(\text{poly(t)}) O(poly(t))时间内被解决。任一NP完全问题可以在多项式内被解决,则P=NP。
exp2. 欧拉回路问题
- 一条欧拉回路是图 G G G的一个边序列表示的圈,其中 G G G的每条边恰出现一次。
- 欧拉回路问题EC是判定一个给定的n顶点图 G G G是否含有一个欧拉回路。
- 欧拉定理:一个连通图包含一条欧拉回路当且仅当它的每个顶点均有偶数条边相关联。
- 利用欧拉定理高效解决EC问题:首先,检查图是否联通;这很容易在
O
(
n
2
)
O(n^2)
O(n2)时间内实现。如果图不连通,那么显然欧拉回路不存在。如果图是联通的,那么对每个顶点检查是否有偶数条边与之相关联。如果有顶点不满足这个条件,那么不存在欧拉回路,反之欧拉回路存在。
- 因为有 n n n个顶点, n ( n − 1 ) / 2 n(n-1)/2 n(n−1)/2条边,算法需要 O ( n 3 ) O(n^3) O(n3)的基本操作,因此EC ∈ \in ∈P。
归约思想
一个语言 B B B可以被归约到另一个语言 A A A,如果存在一个图灵机在多项式时间内可以通过给定输入 x x x得到输出 R ( x ) R(x) R(x),其中 x ∈ B x\in B x∈B当且仅当 R ( x ) ∈ A R(x)\in A R(x)∈A。
- 如果我们有一个判定 A A A的算法,我们只需要进行一点额外的计算就可以判定 B B B。
某些复杂性类中含有对应于该类的完全问题,即该复杂性类中最难判定的语言,该复杂性类中的任何其他语言都可以归约到此语言。
- 不是所有的复杂性类都有完全问题
- exp. 令 L L L是 P P P中任一非空及非全集的语言。则存在字符串 x 1 , x 2 x_1,x_2 x1,x2使得 x 1 ∉ L , x 2 ∈ L x_1\notin L,x_2\in L x1∈/L,x2∈L。那么任一P中的语言 L ′ L' L′可以通过如下过程被归约到 L L L:给定输入 x x x,用多项式时间的判定性算法去决定 x x x是否属于 L ′ L' L′。如果不是,令 R ( x ) = x 1 R(x)=x_1 R(x)=x1,否则令 R ( x ) = x 2 R(x)=x_2 R(x)=x2。
NP完全问题
电路可满足性问题CSAT
- 定义:给定一个由与、或和非门组成的布尔电路,是否存在一组输入使得电路最终输出1,亦即电路对某个输入可满足?
- CSAT的NP完全性是Cook-Levin定理:CSAT是NP完全的。
- CSAT使得我们不再需要根据定义去证明一个问题是NP完全的,而只需要证明它是NP的并且CSAT可以归约到它
可满足性问题SAT
- 布尔公式 φ \varphi φ:由布尔变量集合 x 1 , x 2 , . . . x_1,x_2,... x1,x2,...、布尔连接词,即具有一个或两个输入、一个输出的布尔函数、以及括号组成。对于给定的布尔变量,布尔公式的真假性基于布尔代数的基本规则确定。
- 定义:确定对于一个给定的布尔公式 φ \varphi φ,是否存在满足此公式的输入。SAT是NP完全的
- 3SAT:SAT的一个重要的带约束的特例,也是NP完全的。3SAT中的布尔公式为3-合取范式。
- 合取范式:如果一个公式形式上为”与“连接的若干子句,每个子句形式为”或“连接的若干文字,每个文字的形式为 x x x或 ¬ x \neg x ¬x。
- 3-合取范式:3-CNF,如果每个子句恰好含3个文字。
- 3-可满足性问题是确定一个3-合取范式是否可以被满足。
- 如果将3SAT问题中每个子句中包含文字的个数改为2,那么这个问题可以在多项式时间内解决。
NPI问题
在P ≠ \ne =NP的假设下,存在非空的复杂性类NPI(NP中间问题),这类问题既不能使用多项式的资源解决,也不是NP完全的。
目前的候选问题有素因子分解问题和图同构问题。
图同构问题:假设 G G G和 G ′ G' G′是两个顶点集为 V = { v 1 , . . . , v n } V=\{v_1,...,v_n\} V={v1,...,vn}的无向图。判断 G G G和 G ′ G' G′是否同构,即是否存在一个双射 φ : V → V \varphi :V\to V φ:V→V使得边 ( v i , v j ) (v_i,v_j) (vi,vj)在 G G G中当且仅当边 ( φ ( v i ) , φ ( v j ) ) (\varphi (v_i),\varphi (v_j)) (φ(vi),φ(vj))在 G ′ G' G′中。
3.2.4 更多的复杂性类
在复杂性类定义中考虑三个可以改变的基本属性:
- 感兴趣的计算资源:时间、空间等
- 所考虑问题的类型:判定问题、优化问题等
- 底层计算模型:确定性图灵机、概率图灵机、量子计算机等
复杂性类:PSPACE
-
定义:被空间条件约束的复杂性类,这个类的问题可以被一台图灵机使用多项式数目的工作比特完成,而对于使用的时间并没有做要求。
- P在PSPACE中,因为一台在多项式时间内停机的图灵机只能使用多项式数量的纸带单元格。
- NP也是PSPACE的子集。
- 无法确定PSPACE是否包含不在P中的问题
- 在量子计算机上多项式时间内可解的问题类是PSPACE的一个子集,证明了量子计算机上有效解决的问题在经典计算机上无法有效解决并得出P ≠ \ne =PSPACE
-
复杂性类EXP:指数时间复杂性类,包含了所有可以在图灵机上用指数时间(即 O ( 2 n k ) O(2^{n^k}) O(2nk))解决的判定性问题。
- PSPACE ⊆ \subseteq ⊆EXP
-
复杂性类L:对数空间复杂性类,包含了所有可以在图灵机上用对数空间( O ( log ( n ) ) O(\log(n)) O(log(n)))解决的判定性问题
- L ⊆ \subseteq ⊆P
-
L ⊆ \subseteq ⊆P ⊆ \subseteq ⊆NP ⊆ \subseteq ⊆PSPACE ⊆ \subseteq ⊆EXP,但目前并没有证明
更多的时间和空间会增强计算能力
- 时间层次定理:表明
TIME
(
f
(
n
)
)
\text{TIME}(f(n))
TIME(f(n))是
TIME
(
f
(
n
)
log
2
(
f
(
n
)
)
)
\text{TIME}(f(n)\log^2(f(n)))
TIME(f(n)log2(f(n)))的真子集。
- 指出P是EXP的严格真子集
- 空间层次定理:表明
SPACE
(
f
(
n
)
)
\text{SPACE}(f(n))
SPACE(f(n))是
SPACE
(
f
(
n
)
log
2
(
f
(
n
)
)
)
\text{SPACE}(f(n)\log^2(f(n)))
SPACE(f(n)log2(f(n)))的真子集。这里的
SPACE
(
f
(
n
)
)
\text{SPACE}(f(n))
SPACE(f(n))是指包含所有可以用
O
(
f
(
n
)
)
O(f(n))
O(f(n))空间来判定的语言的复杂性类。
- L被PSPACE严格包含
如何处理NP完全问题
- 确定哪些特殊情况可能是能够解决的
- 改变正在考虑的问题类型,尝试找到好的算法去给出问题的一个近似解(并不是每个问题都能找到的)
复杂性类:BPP
- 定义:有界错误率概率多项式时间复杂性类,包含了所有可以被概率型图灵机 M M M所接受的语言 L L L,即如果 x ∈ L x\in L x∈L则 M M M以至少 3 / 4 3/4 3/4的概率接受 x x x,如果 x ∉ L x\notin L x∈/L则 M M M以至少 3 / 4 3/4 3/4的概率拒绝 x x x。
- 切诺夫界意味着只需要多重复几次用来判定BPP中语言的算法其成功的概率就可以被放大,可以认为最终能放大到1。
- 相较于P,BPP被认为是在经典计算机上能够有效解决的一类判定问题
- BPP在量子计算机上对应的类被称为BQP
BPP与切诺夫界
定理3.3(切诺夫界) 设
X
1
,
.
.
.
,
X
n
X_1,...,X_n
X1,...,Xn为独立同分布的随机变量,每个以概率
1
/
2
+
ϵ
1/2+\epsilon
1/2+ϵ取值为1,以概率
1
/
2
−
ϵ
1/2-\epsilon
1/2−ϵ取值为0。则
p
(
∑
i
=
1
n
X
i
≤
n
/
2
)
≤
e
−
2
ϵ
2
n
(
3.2
)
p\left(\sum_{i=1}^{n} X_{i} \leq n / 2\right) \leq e^{-2 \epsilon^{2} n}(3.2)
p(i=1∑nXi≤n/2)≤e−2ϵ2n(3.2)
proof. 考虑任一包含至多
n
/
2
n/2
n/2个1的序列
(
x
1
,
.
.
.
,
x
n
)
(x_1,...,x_n)
(x1,...,xn),当这个序列恰好包含
⌊
n
/
2
⌋
\left \lfloor n/2 \right \rfloor
⌊n/2⌋个1时出现的概率最大,故
p
(
X
1
=
x
1
,
…
,
X
n
=
x
n
)
≤
(
1
2
−
ϵ
)
n
2
(
1
2
+
ϵ
)
n
2
(
3.3
)
=
(
1
−
4
ϵ
2
)
n
2
2
n
(
3.4
)
\begin{aligned} p\left(X_{1}=x_{1}, \ldots, X_{n}=x_{n}\right) & \leq\left(\frac{1}{2}-\epsilon\right)^{\frac{n}{2}}\left(\frac{1}{2}+\epsilon\right)^{\frac{n}{2}}(3.3) \\ & =\frac{\left(1-4 \epsilon^{2}\right)^{\frac{n}{2}}}{2^{n}}(3.4) \end{aligned}
p(X1=x1,…,Xn=xn)≤(21−ϵ)2n(21+ϵ)2n(3.3)=2n(1−4ϵ2)2n(3.4)
至多有
2
n
2^{n}
2n个这样的序列,故
p
(
∑
i
X
i
≤
n
/
2
)
≤
2
n
×
(
1
−
4
ϵ
2
)
n
2
2
n
=
(
1
−
4
ϵ
2
)
n
2
(
3.5
)
p\left(\sum_{i} X_{i} \leq n / 2\right) \leq 2^{n} \times \frac{\left(1-4 \epsilon^{2}\right)^{\frac{n}{2}}}{2^{n}}=\left(1-4 \epsilon^{2}\right)^{\frac{n}{2}}(3.5)
p(i∑Xi≤n/2)≤2n×2n(1−4ϵ2)2n=(1−4ϵ2)2n(3.5)
最后,由简单微积分
1
−
x
≤
exp
(
−
x
)
1-x \leq \exp (-x)
1−x≤exp(−x)可得
p
(
∑
i
X
i
≤
n
/
2
)
≤
e
−
4
ϵ
2
n
/
2
=
e
−
2
ϵ
2
n
(
3.6
)
p\left(\sum_{i} X_{i} \leq n / 2\right) \leq e^{-4 \epsilon^{2} n / 2}=e^{-2 \epsilon^{2} n}(3.6)
p(i∑Xi≤n/2)≤e−4ϵ2n/2=e−2ϵ2n(3.6)
对于固定的
ϵ
\epsilon
ϵ,出错的概率以算法重复次数的指数速度下降。在BPP中取
ϵ
=
1
/
4
\epsilon =1/4
ϵ=1/4,因此仅需要重复几百次算法即可将出错的概率减少到
1
0
−
20
10^{-20}
10−20以下,此时计算机的某个元件出故障的概率都比算法出错的概率大。
3.2.5 能量与计算
能量是除了时间和空间总量之外的另一个重要计算资源。
经典和量子计算原则上都可以在不消耗任何能量的情况下完成,计算中的能量消耗与计算的可逆性密切相关。
计算的不可逆性
-
理解一:从逻辑门的角度
考虑一个与非门,其包含两个输入位和一个输出位。该门本质上是不可逆的,因为在给定门的输出的情况下,输入不是唯一确定的;考虑一个非门是可逆逻辑门,给定非门的输出,能够唯一推断出输入是什么
-
理解二:从信息消除的角度
计算是可逆的等同于在计算过程中没有信息被擦除。
-
能耗与计算不可逆性的关系
兰道尔原理指出为了擦除信息必须要消耗能量。
兰道尔原理
- 第一种形式:假设一台计算机擦除了1比特的信息,那么耗散到整个环境中的能量至少是 k B T ln 2 k_BT\ln 2 kBTln2,其中 k B k_B kB是玻尔兹曼常数, T T T是电脑工作环境的温度
- 第二种形式:假设一台计算机擦除了1比特的信息,那么整个环境的熵至少增加了 k B ln 2 k_B\ln 2 kBln2,其中 k B k_B kB是玻尔兹曼常数。
- 兰道尔原理仅给出了擦除信息所必须消耗的能量下限。eg. 2000年左右计算机执行一个基本逻辑运算要消耗大约 500 k B T ln 2 500k_BT\ln 2 500kBTln2的能量。
- 在实际应用中,根据摩尔定律:如果计算机的能力不断增加,那么耗散的能量也必然增加,除非每次操作消耗的能量下降的速度至少和计算能力增长的速度一样快。
通用计算的可逆电路模型
使用两种不同的技术来提供进行通用计算的可逆电路模型:
- 一台完全由台球和镜子构成的计算机
- 基于一个被称为Toffoli门的可逆逻辑门,1,4,1节
台球计算机
图3.14所示
- 台球从左侧”输入”计算机,在镜子间进行碰撞和反弹,然后在右侧”输出“。在可能的输入位置处是否存在台球分别代表逻辑1或逻辑0。
- 只要操作是基于经典力学的规律,该模型具有可逆性。
- 该计算模型在模拟标准电路计算模型上的任意计算的意义下被证明是通用的。
- 台球计算模型取决于完美的操作,并且没有外部扰动,例如由热噪声引起的外部扰动。
- 台球计算机为实现被称为Fredkin门的可逆通用逻辑门提供了一种方法
Fredkin门
- Fredkin门有三个输入比特和三个输出比特,分别用 a , b , c a,b,c a,b,c和 a ′ , b ′ , c ′ a',b',c' a′,b′,c′表示。图3.15展示了Fredkin门的真值表
- 比特 c c c是一个控制比特,其值在Fredkin门作用后不会发生改变,即 c ′ = c c'=c c′=c。它控制着其他两个比特 a a a和 b b b的改变。
- 如果 c c c的值是0,则 a a a和 b b b不变,即 a ′ = a , b ′ = b a'=a,b'=b a′=a,b′=b。如果 c c c的值是1,则 a a a和 b b b进行交换,即 a ′ = b , b ′ = a a'=b,b'=a a′=b,b′=a。
- 很容易得到Fredkin门是可逆的,给定输出 a ′ , b ′ , c ′ a',b',c' a′,b′,c′,可以确定输入 a , b , c a,b,c a,b,c。
- 恢复原始输入的方法是在 a ′ , b ′ , c ′ a',b',c' a′,b′,c′上作用另一个Fredkin门。
- 除了可逆性之外,Fredkin门还有一个特性:在输入和输出之间保持1的数目不变。
- 保守性:对于台球计算机而言,相当于进入Fredkin门的台球的数量等于出来的数量,因此也成为保守的可你逻辑门。
- 在台球计算机模型中,保守性完全对应于质量守恒(还可能量守恒)
- 同时,Fredkin门也是一个通用的逻辑门。图3.16展示Fredkin门可以被组合起来取模拟与、或、交叉、扇出函数,因此它可以被组装去模拟任意形式的经典电路。
- 利用Fredkin门模拟不可逆门,如与门。利用下面两个想法使得计算可逆。
-
允许在准备阶段输入辅助比特到Fredkin门
-
Fredkin门的输出包含计算结果之外所不需要的多余比特
-
计算 f f f的可逆电路过程:初态为 ( x , 0 , 0 , y ) (x,0,0,y) (x,0,0,y)①通过运行计算 f f f的可逆电路得到状态 ( x , f ( x ) , g ( x ) , y ) (x,f(x),g(x),y) (x,f(x),g(x),y);②使用受控非门将 f ( x ) f(x) f(x)按位地加到第四个寄存器上,得到状态 ( x , f ( x ) , g ( x ) , y ⊕ f ( x ) ) (x,f(x),g(x),y\oplus f(x)) (x,f(x),g(x),y⊕f(x));③由于 f ( x ) f(x) f(x)的过程是可逆的,并且不会影响第四个寄存器,故通过运行计算 f f f的逆电路得到状态 ( x , 0 , 0 , y ⊕ f ( x ) ) (x,0,0,y\oplus f(x)) (x,0,0,y⊕f(x))。省略辅助位0,可以将电路的过程写为
( x , y ) → ( x , y ⊕ f ( x ) ) ( 3.8 ) (x,y)\to (x,y\oplus f(x))(3.8) (x,y)→(x,y⊕f(x))(3.8)
Toffokin门
- Toffokin门有三个输入比特 a , b , c a,b,c a,b,c。 a , b a,b a,b称为第一和第二控制位, c c c是目标位。该门保持两个控制位不变,如果两个控制位都是1则翻转目标位,否则目标位不变。图3.17所示
-
利用Toffokin门进行 a a a和 b b b的与非,如图3.18:
输入比特 a a a和 b b b作为控制位,并初始值为1的辅助位发送给目标位,在目标位上的输出即为 a a a和 b b b的与非。
-
利用Toffokin门实现扇出操作,如图3.19:
第一个控制位作为辅助比特初始值为1,将 a a a赋值给第二个控制位,则最后输出 1 , a , a 1,a,a 1,a,a。
-
与非门和扇出门合在一起构成一组通用门,因此任一电路可以被一个只包含Toffokin门和辅助比特的可逆电路高效模拟。
可逆计算的关键想法:
- 可逆性源于保持追踪每一比特的信息,只有在信息丢失或删除时才会发生不可逆的结果
- 通过可逆地进行计算,消除了计算期间的能量消耗,所有计算原则上可以零能耗完成
- 可以有效地完成可逆计算,而不产生无用比特
量子计算中的任何经典子程序必须可逆地执行,而且不能产生依赖于经典输入的冗余比特。