遞歸算法時間複雜度

【代入法】代入法首先要對這個問題的時間複雜度作出預測,而後將預測帶入原來的遞歸方程,若是沒有出現矛盾,則是可能的解,最後用數學概括法證實。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)

相關文章
相關標籤/搜索