軟考 遞迴式時間複雜度計算詳解

2022-04-27 11:15:06 字數 1938 閱讀 2296

遞迴演算法的時間複雜度分析

在演算法分析中,當乙個演算法中包含遞迴呼叫時,其時間複雜度的分析會轉化為乙個遞迴方程求解。實際上,這個問題是數學上求解漸近階的問題,而遞迴方程的形式多種多樣,其求解方法也是不一而足,比較常用的有以下四種方法:

代換法主要需要以下兩個步驟

1、  猜答案,不需要完全猜出來,不需要知道常熟係數的準確值,而只需要猜出它的形式,比如猜乙個遞迴式的時間複雜度大概是o(n

2),即它的執行時間應該是乙個常熟乘以n

2,可能還會有一些低階項。

遞迴樹法主要是通過遞迴樹將遞迴式展開來找到答案,然後再用代換法證明它,因為遞迴樹法是不嚴謹的。

例如,用遞迴樹法求t(n) = t(n/2) + n2,

用遞迴樹法將該遞迴式展開

像這樣將遞迴樹展開並延伸下去,最終到葉子節點就只剩下t(1),那麼該遞迴樹的高度就是logn,因為從頂點n出發,到n/2,到n/4,……最後到1,那麼從n到1的折半次數是logn,即高度是logn(應該是乙個常數乘以logn,不過沒多大關係)。而最下面葉子節點的數目是n,因為從第一層往下,節點數變化為1,2,4,8……,如果樹的高度是h,那麼就會有2

h個葉節點,而高度是logn,那麼2

logn

=n。那麼,整體所做的工作加起來就是t(n)了

t(n) = [1+1/2+1/4+……]n2 =

2n2,於是可知時間複雜度為t(n) = o(n2)。

再例如,用遞迴樹法求t(n) = t(n/4)+t(n/2)+n2 ,下面用遞迴樹的方法將該遞迴式展開

最後,求葉子節點的數目有點麻煩,因為分支的遞迴速度是不一樣的,左邊降低到n/16的時候,右邊才降低到n/4,左邊子樹的高度將會比右邊子樹的高度要小。可以看到葉子節點的數目必然小於n,因為最開始的問題大小是n,然後遞迴成乙個n/4和n/2的兩個子問題,直到最後遞迴到1停止,而n/4+n/2

< n , 所以最後葉子節點的數目不會超過n,將每層求和就得到t(n),經過觀察發現乙個等比數列,於是數學歸納法開始派上用場

t(n) = (1+5/16+25/256+……)n2≤2n2 =o(n2)

於是得到該遞迴式時間複雜度為o(n2),因為是猜出來的等比數列,於是需要用數學歸納法證明之,就又變成方法一中代換法求證了。

方法三:主方法

(master method)

該方法僅適用於特定格式的遞迴式

同時要求f(n)漸進趨正,即當n->無窮時,f(n)>0。(我覺得上圖中第2,3中少了個logn,具體請參考演算法導論一書中對時間複雜度的討論)

例如:t(n)=4t(n/2)+n , 則a=4,b=2,f(n)=n,計算nlog(b,a)=n2>f(n),

滿足模式一,因此t(n) = nlog(b,a)=o(n2)

t(n)=4t(n/2)+n2,則根據上面計算,滿足模式二,因此t(n)=o(n2logn)

t(n)=4t(n/2)+n3,滿足模式三,t(n)=o(n3)

對於該方法的正確性,可以通過遞迴樹的方法證明,懶的畫了,可以在大腦裡構思出這樣乙個草圖:

在第一層,f(n)分解為a個子問題,每個子問題都是f(n/b),第二層每個子問題又分解為a個子問題,每個問題都是f(n/b2)……這樣遞迴分解下去,最後的葉子還是o(1),整個樹的高度就是log以b為底n的對數,整個的葉子節點數目為a的log以b為底n的對數次方(alog(b,n)),即nlog(b,a)個葉子節點。每個分支的遞減速度是一樣的,將每層都加在一起便得到t(n)

,此時就需要對f(n)的情況進行討論(於是就是上面的1,2,3)。

軟考 遞迴式時間複雜度計算詳解

遞迴演算法的時間複雜度分析 在演算法分析中,當乙個演算法中包含遞迴呼叫時,其時間複雜度的分析會轉化為乙個遞迴方程求解。實際上,這個問題是數學上求解漸近階的問題,而遞迴方程的形式多種多樣,其求解方法也是不一而足,比較常用的有以下四種方法 方法一 代換法 代換法主要需要以下兩個步驟 1 猜答案,不需要完...

遞迴式時間複雜度的計算

寫給自己!遞迴式的時間複雜度很難人為的計算出來,根據演算法導論知道乙個應用公式 使用時主要思路如下 首先根據自己的遞迴 寫出t n t n 為遞迴所用的總時間,其中,n為輸入的規模,a為分解成子問題的個數,n b為子問題輸入的子規模,f n 是乙個漸進正的函式。a個子問題被分別遞迴的解決,時間各為t...

軟考 從分治法中看時間複雜度計算

分治演算法是按照下列方案來工作的 1 將問題的例項劃分為幾個較小的例項,最好具有相等的規模 事實上,一般來說就是這樣來分的,而且分為2個例項的居多,注意是遞迴的分!2 對這些較小的例項求解 一般使用遞迴的方法,但在問題規模足夠小的時候也可以採用採用另乙個演算法 停止遞迴 3 如果有必要的話,合併這些...