關於遞迴演算法的時間和空間複雜度

2022-06-24 21:51:11 字數 1791 閱讀 9264

斐波那契序列:在下面的**中,可以看到函式 fibonacci (int n) 計算了第 n 個斐波那契序列。斐波那契數列是 0, 1, 1, 2, 3, 5, 8, 13, 21,...。如你所見,該序列的第0個數為 0,該序列的第1個數為 1,依此類推。通常,如果 f(n) 表示斐波那契數列的第 n 個數字,則  f(n) = f(n-1) + f(n-2) 。對於此遞迴關係,f(0) = 0 和 f(1) = 1是終止條件。

1

public

int fibonacci(int

n) 56

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

7 }

時間複雜度:讓我們看一下生成的遞迴樹以計算斐波那契數列的第 5 個數。

在此遞迴樹中,每個狀態(除 f(0) 和 f(1) 之外)都會生成兩個附加狀態,並且生成的狀態總數為 15。通常,用於計算第 n 個斐波那契數 f (n) 的狀態總數大約等於 2^n。注意,每個狀態都表示對 fibonacci(n) 的函式呼叫,該函式除了進行另乙個遞迴呼叫外不執行任何操作。因此,計算斐波那契數列第 n 個所需的總時間為 o (2^n)。

請注意,這並不總是正確,為了更準確地進行時間複雜度分析,應該使用主定理。該解釋的目的是對遞迴演算法的執行時間有乙個總體了解。  

空間複雜度:遞迴演算法的空間複雜度計算有些棘手。我們需要了解如何在記憶體中生成堆疊幀以進行遞迴呼叫序列。

讓我們嘗試大致了解何時生成堆疊幀以及它們在記憶體中保留了多長時間?

從方法 "f0" 呼叫方法 "f1" 時,將建立與該方法 "f1" 相對應的堆疊幀。

該堆疊幀將保留在記憶體中,直到函式 "f1" 的呼叫未終止。

該堆疊幀負責儲存函式「f1」的引數,函式 "f1" 中的區域性變數以及呼叫方函式(函式 "f0")的返回位址。

現在,當此函式 "f1" 呼叫另乙個函式 "f2" 時,也會生成與 "f2" 相對應的堆疊幀,並將其保留在記憶體中,直到對 "f2" 的呼叫未終止。

呼叫 "f2" 時,其中具有堆疊框架的呼叫堆疊如下所示:

現在,當返回對函式 "f2" 的呼叫時,由於不再需要與 "f2" 相對應的堆疊幀,因此將從記憶體中刪除該堆疊幀。函式 "f1" 和函式 "f0" 的堆疊幀也是如此。

使用此類推方法進行遞迴呼叫序列時,應遵循的原則是,在任何時間點記憶體中可能存在的最大堆疊幀數等於遞迴樹的最大深度在遞迴樹中,當執行與葉節點狀態相對應的呼叫時,其呼叫序列可以由從遞迴樹中的根節點到該葉節點的路徑表示。例如,在用於計算第五斐波那契數的遞迴樹中,當執行最左端和最底端的狀態 f(1) 時,導致該狀態的呼叫序列為 f(5) -> f(4) -> f (3) -> f(2) -> f(1),所有對應的堆疊幀將出現在記憶體中,並且當 f(1) 返回時,其堆疊幀將從記憶體(或呼叫堆疊)中刪除

總而言之,遞迴演算法的空間複雜度與所生成的最大遞迴樹的深度成正比。如果遞迴演算法的每個函式呼叫都占用 o(m) 空間,並且如果遞迴樹的最大深度為 n,則遞迴演算法的空間複雜度將為 o(n·m)。

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

我是分割線 時間複雜度 時間複雜度實際就是乙個函式,該函式計算的是執行基本操作的次 數。演算法分析的分類 演算法存在最好 平均和最壞情況。最壞情況 任意輸入規模的最大執行次數 上界 平均情況 任意輸入規模的期望執行次數 最好情況 任意輸入規模的最小執行次數,通常最好情況不會出現 下界 例如 在乙個長...

關於演算法的時間複雜度和空間複雜度

首先,需要解釋一下經常看到的o log n 是什麼意思。大概總結為普通應用都是10,計算機學科是2,程式語言裡面是e。在我們初中最初接觸到對數時,學到的log指以10為底的對數,為了簡化把下標10去掉,記為log。以常數e為底的對數,簡化下標記為ln。但是在計算機學科裡,不知道為什麼流傳下來的log...

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

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