求遞歸算法時間複雜度:遞歸樹

  

另外見地址2

遞歸算法時間複雜度的計算方程式一個遞歸方程:

  

  在引入遞歸樹之前可以考慮一個例子:

  T(n) = 2T(n/2) + n2

  迭代2次可以得:

  T(n) = n2 + 2(2T(n/4) + (n/2) 2)

  還可以繼續迭代,將其完全展開可得:

  T(n) = n2 + 2((n/2) 2 + 2((n/22)2 + 2((n/23) 2 + 2((n/24) 2+…+2((n/2i) 2 + 2T(n/2i + 1)))…))))  ……(1)

  而當n/2i+1 == 1時,迭代結束。

 

  將(1)式小括號展開,可得:

  T(n) = n2 + 2(n/2)2 + 22(n/22) 2 + … + 2i(n/2i)2 + 2i+1T(n/2i+1)

  這恰好是一個樹形結構,由此可引出遞歸樹法。

 

  圖中的(a)(b)(c)(d)分別是遞歸樹生成的第1,2,3,n步。每一節點中都將當前的自由項n2留在其中,而將兩個遞歸項T(n/2) + T(n/2)分別攤給了他的兩個子節點,如此循環。

  圖中所有節點之和爲:

  [1 + 1/2 + (1/2)2 + (1/2)3 + … + (1/2)i] n2 = 2n2

  可知其時間複雜度爲O(n2)

  

  可以得到遞歸樹的規則爲:

  (1) 每層的節點爲T(n) = kT(n / m) + f(n)中的f(n)在當前的n/m下的值;

  (2) 每個節點的分支數爲k;

  (3)每層的右側標出當前層中所有節點的和。

 

  再舉個例子:

  T(n) = T(n/3) + T(2n/3) + n

  其遞歸樹如下圖所示:

  

  可見每層的值都爲n,從根到葉節點的最長路徑是:

  

  因爲最後遞歸的停止是在(2/3)kn == 1.則

      

  於是

    

  即T(n) = O(nlogn) 

 

  總結,利用此方法解遞歸算法複雜度:

  f(n) = af(n/b) + d(n)

  1.當d(n)爲常數時:

  

  2.當d(n) = cn 時:

   

  3.當d(n)爲其他情況時可用遞歸樹進行分析。

  

  由第二種情況知,若採用分治法對原算法進行改進,則着重點是採用新的計算方法縮小a值。  

分類: algorithm
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章