求遞迴演算法時間複雜度:遞迴樹
遞迴演算法時間複雜度的計算方程式乙個遞迴方程:
在引入遞迴樹之前可以考慮乙個例子:
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 時:
為其他情況時可用遞迴樹進行分析。
由第二種情況知,若採用分治法對原演算法進行改進,則著重點是採用新的計算方法縮小a值。
遞迴演算法時間複雜度
開篇前言 為什麼寫這篇文章?筆者目前在學習各種各樣的演算法,在這個過程中,頻繁地碰到到遞迴思想和分治思想,驚訝於這兩種的思想的偉大與奇妙的同時,經常要面對的乙個問題就是,對於乙個給定的遞迴演算法或者用分治思想縮小問題規模的演算法,如何求解這個演算法的時間複雜度呢?在google過很多的博文後,感覺這...
時間複雜度與空間複雜度,遞迴演算法
lina acm 演算法複雜度分為時間複雜度和空間複雜度。下面摘錄其含義 時間複雜度是指執行演算法所需要的計算工作量。重點在其計算方法 乙個演算法中的語句執行次數稱為語句頻度或時間頻度。記為t n 一般情況下,演算法的基本操作重複執行的次數是模組n的某乙個函式f n 因此,演算法的時間複雜度記做 t...
遞迴演算法時間複雜度 遞迴樹
遞迴演算法時間複雜度 遞迴樹 遞迴演算法時間複雜度的計算方程式乙個遞迴方程 在引入遞迴樹之前可以考慮乙個例子 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...