许多算法中会用到随机性,这类算法称为随机算法。一个随机算法可以看作是一系列确定性算法的分布。引入随机性一般有两种目的:第一种目的是,提供一个简单的解决方案使得我们能以期望意义下更高效地完成计算,例如在快速排序中我们不通过分析数据选取一个尽可能接近中位数的pivot,而是快速地选一个随机的pivot;第二种目的是,牺牲百分之百输出正确答案这一特性,而是设计一个高效得多的算法,该算法以较大概率输出正确答案。无论哪种目的,引入随机性都能提升算法的运行效率。
概率图灵机模型
确定性图灵机模型和非确定性图灵机模型都不足以刻画随机算法,所以我们引入概率图灵机(Probabilistic Turing Machine)。可以这样直观理解概率图灵机:如果说非确定性图灵机是一棵二叉树,那么概率图灵机就是这棵二叉树上随机的一条从根节点到叶节点的路径。严格来说,一个概率图灵机有两个迁移函数δ0,δ1;任何时候概率图灵机都会以1/2的概率选择某个迁移函数做状态转移;在某个固定的输入x下,概率图灵机的输出P(x)是一个随机变量。
称概率图灵机P在输入x后计算得到了y,如果Pr[P(x)=y]>1/2;否则称概率图灵机计算失败。由此,P能判定问题L当且仅当∀x,Pr[P(x)=L(x)]>1/2。这是一个相当自然的定义,也应当是唯一能被接受的定义方式。
Santos定理指出,概率图灵机可计算的函数就是一切确定性图灵机可计算的函数。这个定理告诉我们,引入概率图灵机并不会扩展“可计算”意义下模型的计算能力。
概率图灵机定义的复杂性类
注意到,我们对概率图灵机计算成功的要求仅仅是输出概率>1/2。这会引发下面这样一个结论:概率图灵机能以期望时间常数判定任何可判定的问题。这是因为,我们总是可以构造以下的概率图灵机:对一个可判定的问题,存在一台确定性图灵机M判定之;令概率图灵机一步步模拟M的计算,如果某步后M停机输出1,我们令概率图灵机输出1;如果某步后M停机输出0,我们输出0;否则,我们以1/2的概率继续模拟,以另外1/2的概率“以1/2的概率”输出结果。这会使得我们总能以期望常数的时间,以某个大于零的概率输出正确,并用剩下的概率以一半的概率猜对,也即输出正确的概率总是大于1/2。
基于以上分析,直接不加修饰地利用概率图灵机定义复杂性类是没有意义地。为了做出有意义的复杂性类的定义,有两种补救手段:一种是不以期望时间步数作为时间复杂度,而是以最坏情况的时间步数作为时间复杂度;一种是增加常数ε,要求>1/2+ε才算概率图灵机计算成功。我们分别讨论这两种情况。
概率多项式类(PP)
首先考虑以最坏情况的时间步数作为时间复杂度定义的复杂性类划分方式。对于概率图灵机P,如果时间函数T满足∀x,P(x)计算成功的所有可能计算步数都不超过T(∣x∣),就称T是P的时间函数。如果P(x)能在cT(n)内判定L,就称L∈PTIME(T(n))。
定义PP=c>0⋃PTIME(nc),称为概率多项式类(Probabilistic Polynomial time complexity class),它包含所有概率图灵机在多项式时间内(最坏情况)可判定的问题。
根据最坏情况时间这一定义,自然有PP=PP,也即PP在补运算下封闭。
根据定义可知,PP⊆PSPACE,因为所有概率多项式可判定的问题都可以在多项式空间用确定性图灵机模拟所有可能情况。
下面我们证明,NP⊆PP。对于一个能被非确定性图灵机在多项式时间判定的问题L,我们用概率图灵机依照概率模拟非确定性图灵机,模拟到某一时刻如果非确定性图灵机输出1,则概率图灵机也输出1;否则某一时刻非确定性图灵机输出0,此时概率图灵机以1/2的概率输出0或1。分析以上过程,如果非确定性图灵机确实存在一个输出1的终止状态,那么这一状态一定会以大于零的概率被模拟到,如果没被模拟到概率图灵机会以1/2的概率输出正确。综上,概率图灵机总是以>1/2的概率输出正确。
由此我们得到了PP类的上下界:NP⊆PP⊆PSPACE(或NP⊆PP⊆PSPACE,因为PP在补运算下封闭)。
通过定义可以发现,PP类问题关心的是具有某个性质的对象是否占多数。所以它本质是一些计数问题,我们可以从计数的角度用确定性图灵机给出PP类的等价刻画:L∈PP当且仅当存在M使得rPr[M(x,r)=L(x)]>1/2,其中r是关于输入长度多项式长的随机串。换言之,我们可以用确定性图灵机模拟概率图灵机的每种可能性,然后统计其结果,这样就把用概率图灵机定义的复杂性类转化为了用确定性图灵机定义的复杂性类。
既然一个复杂性类是可以用确定性图灵机定义的,那么我们就可以用Karp归约定义其中的完全问题。PP类中的完全问题是什么?答案还是和SAT有管。人们证明了以下两个问题是PP-complete的:①基于SAT集合定义♮SAT,⟨φ,i⟩∈♮SAT当且仅当φ存在>i个可满足的赋值;②基于SAT集合定义MajSAT(Majority SAT),φ∈ SAT当且仅当φ的所有赋值中超过半数的赋值是可满足的。Gill证明了这两个问题都是PP-complete的,并且是等价的(可以相互归约)。
最后值得一提的是,对于大多数复杂性类都满足其中的问题关于交和并封闭。比如对于P(PSPACE),L1,L2∈P⟹L1∩L2∈P,L1∪L2∈P,这根据定义是显然的。然而由于涉及概率,这对于PP不是显然的。然而人们证明了,关于交和并封闭的性质对PP也是成立的。
有界误差概率多项式类(BPP)
下面我们考虑第二种补救方法,也即用>1/2+ε来定义计算成功,而把最坏时间改为期望时间。而令人惊奇的是,我们可以证明(略),如果我们考虑的是多项式时间,那么用期望时间定义和用最坏时间定义是等价的。更进一步,如果我们考虑的是多项式时间,ε的取值并不重要。所以,关于BPP类,无论我们使用“最坏时间+ε=1/6”定义还是用“期望时间+某个ε”定义,它们都将会是等价的。于是我们可以这样定义:
对于概率图灵机P,如果时间函数T满足∀x,P(x)以Bounded-error 1/6计算成功(也即以大于2/3概率计算成功)的所有可能计算步数都不超过cT(∣x∣),就称L∈BPTIME(T(n))。BPP=c>0⋃BPTIME(nc),称为有界误差概率多项式类(Bounded-error Probabilistic Polynomial time complexity class)。
BPP可能是概率图灵机定义的最重要的复杂性类了,因为就像人们普遍相信P=NP一样,人们普遍相信BPP=P(还没有人证明)。这是因为Impagliazzo & Wigderson证明了如果P=BPP,那么SAT就一定有2o(n)大小的电路解。而人们普遍相信SAT是难的而不是简单的。如果BPP=P成立,那么随机算法在理论上看就是一个骗局。不过,从应用上看,随机算法还是有很大价值的。
根据定义,显然有BPP=BPP,并且有上下界P⊆BPP⊆PP。
关于为什么在BPP的定义中能够把ε换作任意值的定义,我们有以下错误压缩定理(Bounded Error Theorem):
令BPP(ρ)表示以出错概率ρ定义的BPP类。错误压缩定理指出,∀c,d>1,BPP(2nd1)=BPP(21−nc1)。这意味着,不仅我们可以用任意常数ε定义BPP,bounded error甚至可以以多项式倒数的速率接近0,以指数的倒数的速率接近1/2(也即出错的概率可以以多项式倒数的速率接近1/2,以指数的倒数的速率接近0)。Pf. 显然有BPP(2nd1)⊆BPP(21−nc1)。因此只需证BPP(21−nc1)⊆BPP(2nd1)。 也即,∀L∈BPP(21−nc1),L∈BPP(2nd1)。 对于L∈BPP(21−nc1),存在一台概率图灵机P,在输入x时,能够以小于21−∣x∣c1的出错概率判定x∈L是否成立。我们利用多数原则(Majority Rule, 多次实验取众数)的方法,运行P′程序k次,得到k个判定结果y1,⋯,yk,那么可以构造概率图灵机P′,如果超过k/2的判定结果为x∈L,就输出x∈L,否则输出x∈L。我们分析P′的出错概率。若P′出错,要么是x∈L而P′输出x∈L,要么是x∈L而P′输出x∈L。我们可以令Yi=1[yi=1],Y=i=1∑kYi。为了书写方便,令δ=∣x∣c1,p=21+δ。对于第一种情况,出错概率为Pr[Y≤k/2],由于δ<1/2,所以(1−δ)p>1/2,所以出错概率<Pr[Y<(1−δ)kp]。因为x∈L,所以E[Y]≥kp,因此出错概率≤Pr[Y<(1−δ)E[Y]]。由Chernoff Bound,并且取k=12∣x∣2c+d+1,得到<exp(−21δ2E[x])≤exp(−21δ2kp)<2∣x∣d1;对于第二种情况,出错概率为Pr[Y>k/2],由于δ<1/2,所以(1+δ)(1−p)<1/2,所以出错概率<Pr[Y>(1+δ)k(1−p)]。因为x∈L,所以E[Y]<k(1−p),因此出错概率≤Pr[Y>(1+δ)E[Y]]。由Chernoff Bound,取k=12∣x∣2c+d+1,<exp(−31δ2E[Y])≤exp(−21δ2k(1−p)))<2∣x∣d1; 综上,L∈BPP(2nd1)。Qed.
利用错误压缩定理,可以得到以下几个重要结论:
Adleman定理:BPP⊆P/poly。“非一致性强于随机性”。
Sipser-Gacs定理:BPP⊆Σ2p。BPP位于多项式谱系的第二层。
BPPBPP=BPP:直观上,因为BPP的出错概率可以压缩到很小,作为oracle调用产生的错误概率可以忽略不计。
零误差概率多项式类(ZPP)
像快速排序这样的随机算法总是会以1的概率给出结果,它出错的概率是0。对于这类用随机算法零误差解决的问题,我们也可以定义复杂性类。注意到在以下定义中,我们用的是平均时间而不是最坏时间,可见我们牺牲了时间换来了正确性。
对于问题L和概率图灵机P,如果时间函数T满足∀x,P(x)以零误差计算成功的所有可能计算步数的期望不超过cT(∣x∣),就称L∈ZTIME(T(n))。定义ZPP=c>0⋃ZTIME(nc),称为零误差概率多项式类(Zero-sided-error Probabilistic Polynomial time complexity class),它包含所有概率图灵机在期望多项式时间内能以零误差判定的问题。
单侧误差概率多项式类(RP)
实践中还会遇到这样一类算法,它能够保证在输出0时零误差,而在输出1时有概率出错。换言之,这类算法只可能有单侧误差(One-sided Error)。对于这类问题,我们也可以定义复杂性类。注意到在以下定义中,我们用的是Bounded Error,并且是用最坏时间定义的。
对于问题L和概率图灵机P,如果时间函数T满足∀x,P(x)以单侧误差计算成功的所有可能计算步数的最坏步数不超过cT(∣x∣),就称L∈RTIME(T(n))。其中,单侧误差计算成功定义为,∀x,如果x∈L则Pr[P(x)=1]=0;如果x∈L则Pr[P(x)=1]≥2/3。定义RP=c>0⋃RTIME(nc),称为单侧误差概率多项式类或随机多项式类(Randomized Probabilistic Polynomial time complexity class)。
根据定义,显然有RP⊆BPP。
可以证明,ZPP=RP∩RP。
单侧误差概率对数空间类(RL)
类似的,概率图灵机在对数空间内可以单侧误差判定的问题类称为单侧误差概率对数空间类或随机对数空间类(Randomized Logspace complexity class)。
无向图的连通性判定问题UPATH ∈RL。可以用随机游走证明。
可以证明,RL⊆NL。
