手把手教你 分析遞迴演算法的時間複雜度

2021-06-25 22:38:38 字數 1295 閱讀 4207

遞迴演算法時間複雜度的計算方程式乙個遞迴方程:

在引入遞迴樹之前可以考慮乙個例子:

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值。

手把手教你做測試分析

測試分析是什麼?我們知道作為乙個測試人員,拿到需求之後,不可能上來就做測試設計,因為需求是否合理?是否有價值?是否可測試?這些問題我們沒有弄明白之前開始做測試設計是不負責任的 需求分析在需求討論會結束之後就應該被提上日常並被認真對待,那麼需求分析要分析哪些內容呢?我們用下面這個思維導圖來說明這個過程...

手把手教你Serverless的沙龍來不來約?

從行業趨勢看,serverless是雲計算必經的一場革命。無伺服器雲函式是實現微服務的最好的方法之一。在微服務熱翻天的時候,另乙個新的技術 serverless開始在程式猿的世界冉冉公升起,並被賦予著必然性的發展趨勢。serverless從底層開始變革計算資源的形態,為軟體架構與應用服務部署帶來新的...

手把手教你申請Coursera的課程助學金

在c站已經上了一年多的課程了,因為的確沒有收入,所以一直申請獎學金度日。當然我也建議大家不要學 付費是不可能付費的,這輩子不可能付費的 這種套路。以後有收入了,還是要付費支援的。目前我在coursera上過的課程有十幾節,如果自費的話大概需要1000多刀,所以還是很有用的。我上的課程主要和程式設計以...