遞歸樹


求遞歸算法的時間復雜度:遞歸樹

遞歸算法時間復雜度的一個遞歸方程:

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

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/22 == 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) = a*f(n/b) + d(n)

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

2.當d(n) = cn 時:
   

3.當d(n)為其他情況時可用遞歸樹進行分析。
當d(n) = cn^d時:

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

照着某個大佬依葫蘆畫瓢的,為了練習寫blog,侵刪


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM