递归算法时间复杂度

【代入法】代入法首先要对这个问题的时间复杂度作出预测,而后将预测带入原来的递归方程,若是没有出现矛盾,则是可能的解,最后用数学概括法证实。html

  【举   例】咱们有以下的递归问题:T(n)=4T(n/2)+O(n),咱们首先预测时间复杂度为O(n2),不妨设T(n)=kn2(其中k为常数),将该结果带入方程中可得:左=kn2,右=4k(n/2)2+O(n)=kn2+O(n),因为n2的阶高于n的阶,于是左右两边是相等的,接下来用数学概括法进行验证便可。算法


   【迭代法】迭代法就是迭代的展开方程的右边,直到没有能够迭代的项为止,这时经过对右边的和进行估算来估计方程的解。比较适用于分治问题的求解,为方便讨论起见,给出其递归方程的通常形式:函数

  【举   例】下面咱们以一个简单的例子来讲明:T(n)=2T(n/2)+n2,迭代过程以下:.net

  容易知道,直到n/2^(i+1)=1时,递归过程结束,这时咱们计算以下:3d

  到这里咱们知道该算法的时间复杂度为O(n2),上面的计算中,咱们能够直接使用无穷等比数列的公式,不用考虑项数i的约束,实际上这两种方法计算的结果是彻底等价的,有兴趣的同窗能够自行验证。htm


  【公式法】这个方法针对形如:T(n) = aT(n/b) + f(n)的递归方程。这种递归方程是分治法的时间复杂性所知足的递归关系,即一个规模为n的问题被分红规模均为n/b的a个子问题,递归地求解这a个子问题,而后经过对这a个子问题的解的综合,获得原问题的解。这种方法是对于分治问题最好的解法,咱们先给出以下的公式:blog

  公式记忆:咱们其实是比较n^logba和f(n)的阶,若是他们不等,那么T(n)取他们中的较大者,若是他们的阶相等,那么咱们就将他们的任意一个乘以logn就能够了。按照这个公式,咱们能够计算【迭代法】中提到的例子:O(f(n))=O(n2),容易计算另一个的阶是O(n),他们不等,因此取较大的阶O(n2)。太简单了,不是吗?递归

  须要注意:上面的公式并不包含全部的状况,好比第一种和第二种状况之间并不包含下面这种状况:f(n)是小于前者,可是并非多项式的小于前者。一样后两种的状况也并不包含全部的状况。为了好理解与运用的状况下,笔者将公式表述成如上的状况,可是并非很严谨,关于该公式的严密讨论,请看这里。可是公式的不包含的状况,咱们不多不多碰到,上面的公式适用范围很普遍的。ip

  特别地,对于咱们常常碰到的,当f(n)=0时,咱们有:get


  【母函数法】母函数是用于对应于一个无穷序列的幂级数。这里咱们解决的递归问题是形如:T(n)=c1T(n-1)+c2T(n-2)+c3T(n-3)+...+ckT(n-k)+f(n)。为说明问题简便起见,咱们选择斐波那契数列的时间复杂度做为例子进行讨论。

  【举  例】斐波那契数列递归公式:T(n)=T(n-1)+T(n-2)。这里咱们假设F(n)为第n项的运算量。则容易获得:F(n)=F(n-1)+F(n-2),其中F(1)=F(2)=1.咱们构造以下的母函数:G(x)=F(1)x+F(2)x2+F(3)x3+......,咱们能够推导以下:

  上面的方法计算相对来讲是比较简单的,关键在于对于母函数的理解,刚开始的时候可能不是很好理解,对于母函数能够参考这里维基百科这里


  【差分方程法】能够将某些递归方程当作差分方程,经过解差分方程的方法来解递归方程,而后对解做出渐近阶估计。这里咱们只考虑最长常见的递归形式,形如:T(n)=c1T(n-1)+c2T(n-2)+c3T(n-3)+...+ckT(n-k)+f(n),其中c1,c2,...ck为常数且不等于0;咱们对该方程的求解以下:

  对应上面的齐次方程的特征方程为:

  若是解得t=r是该特征方程的m重根,则这m个解的形式为:{rn     n*rn      n2rn   ...    nm-1rn},其他的关于复数解的形式和普通的线性方程组的形式相似,再也不赘述。接下来,咱们要求解该方程的对应非齐次方程组的通解,这里咱们针对该方程的特殊形式,不加证实地给出以下的通解形式:

  则和线性代数中的解同样,原方程的解等于齐次方程组的通解+特解,即:

  最后由初始条件肯定a(i)的值便可。

  为了帮助理解,咱们举两个例子看看,就明白是怎么回事了。

  【举 例1】递归方程以下:

(1)写出对应齐次方程的特征方程:

获得基础解系为:{t1n,  t2n}

(2)计算特解,对于本题,直接观察得特解为:-8

(3)获得原方程解的形式为:T(n)=a0t1n+a1t2n-8

(4)代入n=0,n=1的状况,获得a0,a1,最后可得:

  能够看到该方程形式和上面讨论过的斐波那契数列只差一个常数8,于是二者的时间复杂度是相同的。有兴趣的同窗能够按照这个方法再次计算斐波那契数列的时间复杂度验证一下。

  【举  例2】递归方程以下:

(1)计算对应齐次方程的基础解析:

特征方程为:C(t)=t^2-4t-4=0,获得一个2重根t=2.于是其基础解为:{2n      n*2n}

(2)因为f(n)=n*2n,对应上面表格的最后一种状况,获得特解形式为:T(n)=n2(p0+p1n)2n代入原递归方程可得:p0=1/2,p1=1/6

(3)原方程解的形式为:T(n)=a0*2n+a1*n*2n+n2(1/2+n/6)2n,代入T(0),T(1)得:a0=a1=0

(4)综上:T(n)=n2(1/2+n/6)2n

于是时间复杂度为:O(n32n)