【算法学习笔记十一】计算复杂性

计算复杂性是指根据解决问题所需的时间、空间或任何其他资源(如处理器数量和通信成本)对问题进行分类。

 一.图灵机

字母\Sigma是一组有限的符号。语言L是从\Sigma中选择的所有有限长度的符号字符串集合的子集,用\Sigma*表示。

标准的图灵机只有一个工作带,它被分割成单独的单元。

每个单元包含\Sigma中的一个符号。图灵机具有读取和重写单元中包含的符号的能力。

【算法学习笔记十一】计算复杂性_第1张图片

图灵机在任何时刻都处于某种状态。

对于工作带上的当前状态和当前扫描的符号,有限状态控件指定下一步进入哪个状态,在工作带的扫描单元上打印哪个符号,以及以何种方式移动工作带头。

     k带图灵机

一个不确定性的k带图灵机是一个6元组M=(S,\Sigma,\Gamma,\delta,p_0,p_f),

1)S是一个有限状态集;

2)\Gamma是一个有限带字符集,它包括了特殊字符B(空格符);

3)\Sigma \subseteq \Gamma - \{B\},表示输入字符集;

4)\delta为转移函数,它是映射S \times \Gamma ^k的元素到S \times ( (\Gamma - \{B\}) \times \{L,P,R\})^k的有限子集的一个函数;

5)p_0 \in S,为初始状态;

6)p_f \in S,为终止或接受状态。

一个k带图灵机M=(S,\Sigma,\Gamma,\delta,p_0,p_f)是确定的,\delta(p,a_1,a_2,...,a_k)包含最多一个元素。

图灵机M的带上从左端起已有字符是a^nb^n,后面跟无限多个空白符号B,M开始动作的第一步先读到第一个b,并改写为x,然后左移去读第一个a,并改写为x,又右移当发现x时,再看紧接着x之后是否为b,若为b,将其改写为x,然后再左移找a,若紧接x之前是a,又将其改写成x,如此反复进行。当找a时,如果不再有a,M应转向找b,如果还能找到b,说明b的个数多于a的个数,则M停止,表示不接受。如果找不到b,说明a与b的个数相同,M应该进入终止状态,表示接受。当找b时,出现空白符,说明a的个数多余b的个数,M停止,不接受。

格局

设M=(S,\Sigma,\Gamma,\delta,p_0,p_f)是一个k带图灵机,M的一个格局是一个(k+1)元组,K=(p, \omega _{11} \uparrow \omega _{12},\omega _{21} \uparrow \omega _{22},..., \omega _{k1} \uparrow \omega _{k2}),其中p \in S并且\omega _{j1} \uparrow \omega _{j2}是M的第j条带的内容,1≤j≤k。(箭头指向后面字符的第一个字符)

初始格局可记为(p, \uparrow x, \uparrow B,..., \uparrow B),其中x是初始输入。终止或接受格局集合是所有格局(p_f, \omega _{11} \uparrow \omega _{12},\omega _{21} \uparrow \omega _{22},..., \omega _{k1} \uparrow \omega _{k2})的集合。

计算

图灵机M在输入x上的计算是一个格局的序列K_1,K_2,...,K_t,对于某个t≥1,其中K_1是初始格局,并且对于所有的i,2≤i≤t,K_i是从K_{i-1}经过M的一次移动得到的。这里t称为计算长度。如果K_t是终止格局,那么这个计算称为一个接受计算。

图灵机M在输入x上所用的时间记为T_M(x),定义如下:

1)如果存在一个M在输入x上的接受计算,那么T_M(x)是最短接受计算的长度;

2)如果M在输入x上不存在接受计算,那么T_M(x)= \infty

设L是一个语言,f是一个从非负整数集合到非负整数集合的函数,称L在DTIME(f)或NTIME(f) 中,如果存在一个确定性(或不确定性)图灵机M,它的性能如下,对于输入x,如果 x∈L,那么T_M(x)≤f(|x|);否则T_M(x)= \infty

对两个类P和NP可以形式的定义如下:

【算法学习笔记十一】计算复杂性_第2张图片

一个离线图灵机M在输入x上所用的空间记为S_M(x),定义如下:

1)如果存在一个M在输入x上的接受计算,那么S_M(x)是应用最小工作单元个数的一个接受计算所用的工作带单元;

2)如果M在输入x上不存在接受计算,那么S_M(x)= \infty

设L是一个语言,f是一个从非负整数集合到非负整数集合的函数,称L在DSPACE(f)或NSPACE(f) 中,如果存在一个确定性(或不确定性)图灵机M,它的性能如下,对于输入x,如果 x∈L,那么S_M(x)≤f(|x|);否则S_M(x)= \infty

【算法学习笔记十一】计算复杂性_第3张图片

P \subseteq PSPACE,NP \subseteq NSPACE 

离线图灵机

一个不确定性的离线图灵机是一个6元组M=(S,\Sigma,\Gamma,\delta,p_0,p_f),

1)S是一个有限状态集;

2)\Gamma是一个有限带字符集,它包括了特殊字符B(空格符);

3)\Sigma \subseteq \Gamma - \{B\},表示输入字符集,它包含了两个特殊符号#和$(分别为左端标志和右端标志);

4)\delta为转移函数,它是映射S \times \Sigma \times \Gamma的元素到S \times \{L,P,R\} \times (\Gamma - \{B\}) \times \{L,P,R\}的有限子集的一个函数;

5)p_0 \in S,为初始状态;

6)p_f \in S,为终止或接受状态。

L=\{\omega \subset \omega ^R | \omega \in \{0,1\}^*\}\omega ^R\omega的逆串;

1)从左到右扫描输入带,将输入带内容拷贝到工作带,直到读写头到达符号C;

2)输入带读写头继续右移,每读一个符号就和工作带读写头所指单元内容比较;

3)如果相同,工作带左移一格,输入带右移一格,继续此过程直至所有输入处理完毕;

4)若C两旁符号个数相同且匹配则接受,否则拒绝。

L \in DTIME(n)

在离线图灵机的情况下,一个格局由3元组K=(p,i, \omega _{1} \uparrow \omega _{2})定义。其中p是当前状态,i是由输入头指向的输入带上的单元号码,并且\omega _{1} \uparrow \omega _{2}是工作带上的内容。这里工作带头正指向\omega_2的第一个字符。

复杂类之间的关系

一个从非负整数集合到非负整数集合的全函数T称为是时间可构造的,当且仅当存在一个图灵机,在每一个长为n的输入,恰在T(n)步时停机。一个从非负整数集合到非负整数集合的全函数S称为是空间可构造的,当且仅当存在一个图灵机,对于每一个长为n的输入上,在一个格局里,其中恰有S(n)个它的工作空间的带单元是非空时停机,并且在计算过程中没有用过其他的工作空间。几乎所有大家熟悉的函数都是时间和空间可构造的,例如n^k,c^n,n!

                               

证明c):设M是一个不确定性离线图灵机,使对于所有长度为n的输入, M使用一个由s(n)≥log n为上界的工作空间。设s和t分别是M的状态和工作带字符数,因为M是以S(n)为空间界的,并且S(n)是空间可构造的, M在长度为n的输入x上可能进入的不同格局的最大数是s(n+2)S(n)t^{S(n)}。这个表达式是状态数、输入带头的位置数、工作带头位置数、可能工作带内容数的乘积。因为S(n)≥log n,这个表达式以d^{S(n)}为上界, d≥2是某个常数。因此, M不能做多于d^{S(n)}次移动,否则一个格局将不断重复,机器将永不停机。不失一般性,我们可以假定,如果M接受,在进人接受状态前它把带都擦去并且把带头移到第一个单元。考虑一个确定性图灵机M‘,在长度为n的输入x上,生成一个以M所有格局为顶点的图,并且在两个格局间设置有向边当且仅当从第一个格局遵照M的转移函数一步可到第二个格局。应用s的空间可构造性计算出格局个数,然后M‘检查在图中是否存在一条从初始格局到惟一接受格局的有向路径,并且当且仅当是这种情况下接受。对某个常数c≥2,这能够在O(d^{2S(n)})=O(c^{S(n)})时间内完成(有n个顶点的有向图的最短路径能在时间O(n^2)找到)。显然, M'接受和M同样的语言,并且因此对于某个常数c≥2,这个语言是在DTIME(c^{S(n)})中。

如果S是一个空间可构造函数且S(n)≥logn,那么NSPACE(S(n)) \subseteq DSPACE(S^2(n))

对于任意k≥1,NSPACE(n^k) \subseteqDSPACE(n^{2k}),NSPACE(log^kn) \subseteqDSPACE(log^{2k}n),而且NSPACE=PSPACE;

存在一个确定性算法解GAP问题,它用O(log^2n)空间。

设S(n)和S(n')是两个空间可构造的空间界限,假定S‘(n)是o(S(n)),那么DSPACE(S(n))包含一个语言,它不在DSPACE(S'(n))。

如果L由一个k带图灵机在时间T(n)中被接受,那么L由一个2带图灵机在时间T(n)logT(n)中接受。

设T(n)和T'(n)是两个时间界,使T(n)是时间可构造的并且T'(n)logT'(n)是o(T(n)),那么DTIME(T(n))包含一个不在DTIME(T’(n))中的语言。

【算法学习笔记十一】计算复杂性_第4张图片

 

二.下界

最优算法上界和问题的下界是渐进地相等的。

平凡下界

考虑用直观的论据,并不借助任何计算模型或进行复杂的数学运算就能够推导出来的下界。

下面给出两个建立平凡下界的例子。

考虑在n个数的表中寻找最大值的问题。显然,假设这个表是没有排序的,则必须检查表中的每个元素,这意味着必须为每个元素花费\Omega(1)时间。因此在一个没有排序的表中寻找最大值的任何算法必须花费\Omega(n)时间。

考虑矩阵乘法问题。两个nxn矩阵相乘的任何算法必须计算出恰好n^2个值。因为在每个值的计算中至少要花费\Omega(1)时间,因此两个nxn矩阵相乘的任何算法的时间复杂性是\Omega(n^2)

决策树

分支程序的通常表示形式是一种称为决策树的二叉树。每个内部顶点表示一个决策。首先进行根表示的测试,然后根据结果将“控制”传递给它的子节点之一。控件继续从一个顶点传递到它的一个子节点,每种情况下的选择取决于在顶点处的测试结果,直到到达一个叶节点。所需的输出在到达的叶子处可用。

搜索任何n个元素地排序序列地算法,在最坏情况下必须执行地比较次数不少于\lfloor logn \rfloor+1次;

设T是一颗至少有n!个叶子的二叉树,则T地高度至少是nlogn-1.5n=\Omega(nlogn)

任何基于比较地对n个元素排序地算法,在最坏情况下必须执行\Omega(nlogn)元素比较。

代数决策树

一个在有n个变量x1,x2, .,xn集合上的代数决策树是一棵具有这样性质的二叉树,它的每个顶点用如下方法标记一个语句,与每个内部顶点联结的实质上是一个测试形式的语句。如果f(x1, x2, .,xn ): 0则转到左孩子,否则转到右孩子。这里“:"代表来自集合{=,<,≤}的任何比较关系。另一方面,一个yes或no的回答和每个叶子节点联系。

\Pi是一个判定问题,它的输入是n个实数x1,x2, ...,xn的集合,则与\Pi联结的是一个n维空间E^n的子集W,使得点(x1,x2,.,xn)在W中当且仅当问题\Pi在输入为x1, x2, .,xn时回答是yes。我们说,一棵代数决策树T判定W中的成员资格,如果每当计算起始于T的根和某点p= (x1 ,x2,... ,xn),控制最终到达一个yes叶子当且仅当(x1, x2, ...,xn)∈W。

设W是E^n的子集,并设T是接受集合W的n个变量线性决策树,则T的高度至少是\lceil log(\#W) \rceil

设W是E^n的子集,并设d是一个固定的正整数。则接受W的任意一个阶为d的代数决策树的高度是\Omega(log(\#W)-n)

在代数决策树计算模型下,对n个实数排序,在最坏情况下需要\Omega(nlogn)次元素比较;

在代数决策树计算模型中,任何求解ELEMENT UNIQUENESS(元素唯一性问题)问题的算法在最坏情况下需要\Omega(nlogn)次元素比较。

线性时间归约

如果A的下界是\Omega(f(n)),n=o(f(n)),A \propto _n B \Rightarrow B的下界为\Omega(f(n))

推广:

如果A的下界是\Omega(f(n)),g(n)=o(f(n)),A \propto _{g(n)} B \Rightarrow B的下界为\Omega(f(n))

在代数决策树计算模型中,求解CONVEX HULL(凸包问题)的任何算法在最坏情况下需要\Omega(nlogn)次元素比较。

在代数决策树计算模型中,求解CLOSEST PAIR(最近点对问题)的任何算法在最坏情况下需要\Omega(nlogn)次元素比较。

在代数决策树计算模型中,求解EUCLIDEAN MINIMUM SPANNING TREE(欧几里得最小生成树问题)的任何算法在最坏情况下需要\Omega(nlogn)次元素比较。

 

你可能感兴趣的:(算法分析)