如何定义时间复杂性
加速定理(Speedup Theorem)
当我们提到“时间复杂性”的时候,我们说的是“一个算法的时间复杂性”,这是通过这个算法在图灵机上的运行步数来定义的。但有时候我们会说“一个问题的复杂性”,例如排序问题的复杂性是O(nlogn),这是因为我们证明了不可能有一个算法能比这更快的解决排序问题, 换言之排序问题是有“最优算法”的。
那么,是不是所有问题都有最优算法呢?答案是否定的,我们不加证明的给出Blum加速定理的叙述:存在一个问题f:{0,1}∗→{0,1}∗,对于任意能计算f的图灵机Mi(假设Mi(x)的运行步数为Ti(x)),可以找到另一台能计算f的图灵机Mj使得r(Tj(x))<Ti(x)关于x几乎处处成立,其中r是可以任意选取的一个单调函数。这里的“几乎处处成立”的意思是只对有限个x不成立。这个定理告诉我们,存在这样的问题,我们永远可以找出复杂性更优的算法,因此不存在复杂性最优的算法。例如取r(n)=2n,假设f有一个O(T)的算法Mi,那么2Tj<Ti,所以存在一个O(logT)的算法。
Blum加速定理意味着,对问题定义复杂性将不会是良定义的。我们只能对算法定义复杂性,不能对问题定义复杂性。
线性加速定理(Linear Speedup Theorem)
下面这个线性加速定理告诉我们,我们的确不需关心复杂性中的常数。为了方便,我们只讨论判定问题。对于一个判定问题,假设存在一个T(n)步内计算它的图灵机Mi,那么可以构造一个Mj只需ϵT(n)+n+2就可以计算这个问题,其中ϵ是任选的正实数。要做到这一点,只需扩充图灵机Mj中的符号集:设Mi的符号集大小为∣Γ∣,对于Γ中符号连成的长度为m的符号串,我们可以用一个大小为∣Γ∣m的新符号集Γ′编码所有这些符号串,这样在用Mj模拟Mi时,Mi的m步操作只需在Mj上对应常数c步,因此ϵ可以取mc,可以任意小。
这告诉我们,编程时可以使用更高阶的指令集(更高级的程序语言),从而实现常数优化。因此以后在讨论复杂性问题时,我们都可以使用大O符号,避开对常数的讨论。
复杂性类(Complexity Classes)
为了讨论方便,接下来我们提到“问题”时指的都是判定性问题,也即只要求输出一个bit的问题。尽管并不是所有问题都可以归约成判定性问题,但我们将会看到判定性问题已经极具代表性了。
尽管我们不能对问题定义“复杂性”,但我们可以根据问题已有的最优算法的复杂性对问题进行分类。然而如何划分复杂性类并不是一个显然的问题。以“回文串判定”问题为例,假设在一台多带图灵机上,它有O(n)算法;但是如果规定图灵机只有一条纸带(令输入带不为只读,这也是一个计算模型),那么可以证明不存在O(n)算法,因为读写头必须来回移动,最优复杂度也会达到O(n2)。这个例子说明,“一个问题是否有O(n)算法”是依赖于具体的计算模型的,而不是模型无关的。因此,我们不应当定义一个O(n)复杂性类。
多项式类和指数类
加强版的丘奇-图灵命题说,任何物理过程的计算都可以在图灵机上用多项式倍的复杂度来模拟。也即假设一个计算过程需要T步,那么一定可以在某台图灵机上用O(TC)步来模拟,C是常数。这同样是人们的一种信仰,而不是一个定理。如果相信这一加强版的丘奇-图灵命题成立,那么“多项式类”P=C≥1⋃TIME(nC)就是一个良定义的复杂性类:任何物理上需要多项式步的计算,在图灵机上也只需要多项式步。所以人们通常把多项式复杂度的算法称为高效(efficient)的算法。
同样的,还可以定义指数复杂性类EXP=C≥1⋃TIME(2nC)。(注意不是2Cn)
非确定性图灵机
还有一类问题,能够有多项式复杂度的验证算法,但不一定有多项式复杂度的判定算法。例如,要判定图上是否存在一个大小为k的独立集,假设已经给出了一个解,那么只需验证这些点两两间是否右边,因此能O(∣V∣2)判定;但是人们到目前为止还没找到多项式复杂度的算法来判定是否存在解,只能O(2∣V∣)暴力枚举。我们想为这类问题也定义一个复杂性类。
我们能否为“多项式复杂度可判定”这一描述定义一个具体的计算模型呢?我们可以定义一个称为“非确定性图灵机(Non-Deterministic Turing Machine, NDTM)”的模型。普通的图灵机模型称为确定性图灵机,它每运行一步会修改读写头上的符号,并将读写头移动一格。我们可以把运行一步前后图灵机发生的变化看作一个状态转移函数δ,确定性图灵机每一步运行都是按照状态转移函数的规则转移一次。对于非确定性图灵机,我们定义它有两个状态转移函数δ1,δ2。非确定性图灵机每运行一步,会分别尝试使用δ1和δ2,从而得到了两个不同的状态,我们认为这两个状态同时存在。接下来再运行一步,会得到四个状态同时存在。运行n步,会得到2n个状态的叠加态。如果这2n个状态中有一个状态是满足要求的输出,非确定性图灵机就运行结束,因为这意味着我们已经可以用这个特定状态对应的那n步状态转移构造一个确定性图灵机的算法来检验了。例如,我们可以构造这样的非确定性图灵机来解决k-独立集判定问题。每运行一步,我们加入图上的一个新的点,创造选它与不选它的叠加态。在运行了∣V∣步以后,已经有了2∣V∣个状态,对应着图的所有点集,此时判断这些点集是否有一个大小为k的独立集即可。
我们找不到多项式复杂度内模拟非确定性图灵机的确定性图灵机。换言之, 根据强丘奇-图灵命题,非确定性图灵机并不是物理上能够实现的计算模型。它是我们为了描述“多项式可验证”这一性质而构造出来的一个数学意义上的计算模型。
定义非确定性图灵机在多项式步运算内能判定的问题集合为NP=C≥1⋃NTIME(nC)。这等价于所有存在多项式复杂度验证算法的问题集合。
显然,一个多项式时间可判定的问题肯定是多项式时间可验证的。所以P⊆NP。迄今为止,人们还没能证明是否有P=NP或P=NP。
Time Hierarchy Theorem(时间谱系定理)
显然,假设时间函数满足f(n)≤g(n),那么一定有TIME(f(n))⊆TIME(g(n))。我们想问,当f(n)和g(n)的大小关系满足什么样的条件时,这种包含关系会是严格的呢?时间谱系定理回答了这个问题:当n→∞limg(n)f(n)logf(n)=0时,有TIME(f(n))⊊TIME(g(n))。
对这一定理的证明再次用到了对角线方法。我们可以构造这样一个判定性问题L(x),使得L∈TIME(g(n))却不满足L∈TIME(f(n))。L(x)定义如下:当输入x时,用通用图灵机模拟图灵机Mx(x),若g(∣x∣)步后通用图灵机停机,则输出Mx(x)的取反,如果不停机就输出0。根据定义,显然L∈TIME(g(n))。然而假如L∈TIME(f(n)),那么存在一台图灵机Mz,在输入z后能在O(f(∣z∣))内输出Mz(z)=L(z)。通用图灵机模拟Mz(z)只需不超过O(f(∣z∣)logf(∣z∣))步,因此L(z)一定会输出Mz(z)取反,与L(z)=Mz(z)矛盾。因此L∈TIME(f(n))。
因此,时间谱系定理告诉我们当允许的计算时间提高一个量级以后,能计算的问题一定会变得更多。问题与问题间可以划分出严格的谱系:一定有这样的问题,能在O(2nc)下计算而不能在O(nc)下计算;也一定有这样的问题,能在O(22nc)下计算而不能在O(2nc)下计算……
同样运用对角线方法,还可以对于非确定性图灵机证明类似的结论:当n→∞limg(n)f(n+1)=0时,有NTIME(f(n))⊊NTIME(g(n))。
Gap Theorem(间隙定理)
我们注意到,Time Hierarchy Theorem要求时间函数必须是时间可构造的。我们现在可以给出一个时间不可构造的函数,它能打破Time Hierarchy Theorem的陈述TIME(f(n))⊊TIME(g(n))。下面的定理称为Gap Theorem:
对于任意可计算的全函数r(x)(我们要求∀x,r(x)≥x),存在可计算的全函数b(x)使得TIME(b(x))=TIME(r(b(x)))成立。
Proof.
我们构造一个函数b,使得TIME(b(x))=TIME(r(b(x)))成立。显然,TIME(b(x))⊆ TIME(r(b(x))),因此只需证TIME(r(b(x)))⊆TIME(b(x))。即证对于任意L∈TIME(r(b(x))),成立L∈TIME(b(x))。也即存在图灵机M使得∃X,∀x>X,M能在Cb(x)步内判定L(x)。(这里之所以可以转化为“对于充分大的x”,是因为我们可以取充分大的常数C)
我们按编码枚举前i+1台图灵机M0,⋯,Mi,设Mi的符号集为Γi,那么能在所有这些图灵机上输入的长度为恰好为i的符号串总数为ni=j=0∑i∣Γj∣i。对于任意给定的r(x),令k0=0,ki+1=r(ki)+1。注意到,k0,k1,⋯,kt是一个单调递增的数列,他们把整数划分成了连续的闭区间[k0,r(k0)],[k1,r(k1)],⋯, [kt,r(kt)]。对于任意一台图灵机Mj,0≤j≤i,它在接收一个长度不超过i的输入z时,最多只会有ni种不同的运算表现,因此其停机步数至多只有ni个不同的值。于是取t=ni,根据鸽巢原理在上述ni+1个闭区间里至少有一个不包含任何可能的Mj(z)的运行步数,也即“对于任意∣z∣=i,存在0≤s≤ni(如果有多个就取最小的那个),要么Mj(z)在ks步以内停机,要么Mj(z)在r(ks)步以后才停机”。这一命题对于任意i以及任意j<i都成立。我们令b(i)=ks,这样就完成了b的构造。下面验证这一构造满足定理的要求。
因为L∈TIME(r(b(x))),所以存在图灵机Mg能在O(r(b(x)))步以内判定L(x)。对于任意输入x,只要∣x∣≥g,就有:要么Mg(x)在b(x)步以内停机,要么Mg(x)在r(b(x))步以后才停机。我们总可以取到一个足够大的X,使得x>X时b(x)足够大,此时我们总是可以认为Mg(x)在b(x)以内停机了。因此L∈TIME(b(x))。
Qed.
可见,由于在Gap Theorem中r可以是任意的,所以b不可能是时间可构造的,否则就与Time Hierarchy Theorem相矛盾。这样我们就给出了第一个时间不可构造的函数的例子。
正是因为Gap Theorem,讨论时间不可构造的时间函数的复杂性类就失去了意义。因此在计算复杂性理论中,我们一般只关注时间可构造的时间函数。