遞迴樹求解遞迴演算法的時間複雜度
在引入遞迴樹之前可以考慮一個例子:
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
這恰好是一個樹形結構,由此可引出遞迴樹法。
圖中的(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值。
原文連結http://www.cnblogs.com/wu8685/archive/2010/12/21/1912347.html