遞迴演算法時間複雜度分析與改善

2021-09-07 12:08:42 字數 1226 閱讀 9550

遞迴演算法大家都不陌生,當須要反覆計算同樣問題時,一般能夠選擇遞迴和迴圈兩種演算法。

又由於遞迴實現起來**比較簡潔。所以通常都會使用遞迴來解決上述問題。比方斐波那契數列。再比方樹的前序、中序、興許遍歷演算法。

遞迴演算法儘管是有**簡潔這個長處,可是其缺點顯著。

由於遞迴函式是在執行過程中呼叫其自身,所以會占用大量的棧上空間,而且壓棧和出棧都是有時間消耗的。

所以從這一點上來看,遞迴的效率是不如迴圈。除了效率之外,遞迴另乙個相當明顯的問題:可能會導致棧溢位。當遞迴呼叫的次數過大時,非常有可能會出現棧溢位的情況。

我們這裡暫不考慮空間複雜度,僅討論其時間複雜度以及改善方法。

還是以經典的fibonacci數列為例。其定義例如以下:

對於這個題目,大家對於其演算法已經十分熟悉。非常快就能寫出以下的**:

long long fibonacci(unsigned int n)

if (n == 1)

return fibonacci(n-1) + fibonacci(n-2);

}

我們以f(10)為例分析來分析遞迴的計算過程。f(10)=f(9)+f(8), 

f(9)=f(8)+f(7)

, f(8)=f(7)+f(6)。。

能夠用樹形結構來表示整個計算過程

我們能夠看出來,上面的樹中,非常多結點都是反覆計算的。其實,遞迴演算法的時間複雜度是n的指數級的。這種複雜度。一般來說是不可接受的。

上述的遞迴演算法中。時間複雜度高的原因是過程中存在大量的反覆計算。因此,假設能想辦法避免反覆計算,那麼其時間複雜度便能夠降下來。

比較簡單的方法是採用逆序的遞迴演算法:f(0)+f(1)=f(2), f(1)+f(2)=f(3),以此類推便能夠計算出f(n)。

而且這個演算法的時間複雜度非常明顯,就是o(n)。**例如以下:

long long fibonacci(unsigned int n)

; int i;

if (n < 2)

for (i = 2; i < n; i++)

return fibn;

}

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

一般情況下,演算法中基本操作重複的次數就是問題規模n的某個函式f n 進而分析f n 隨n的變化情況並確定t n 的數量級。這裡用 o 來表示數量級,給出演算法時間複雜度。t n o f n 它表示隨問題規模n的增大,演算法的執行時間增長率和f n 增長率成正比,這稱作演算法的漸進時間複雜度。而我們...

時間複雜度與空間複雜度,遞迴演算法

lina acm 演算法複雜度分為時間複雜度和空間複雜度。下面摘錄其含義 時間複雜度是指執行演算法所需要的計算工作量。重點在其計算方法 乙個演算法中的語句執行次數稱為語句頻度或時間頻度。記為t n 一般情況下,演算法的基本操作重複執行的次數是模組n的某乙個函式f n 因此,演算法的時間複雜度記做 t...

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

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