[英]Space complexity in memoized fibonacci code
void allFib(int n) {
int[] memo = new int[n + 1];
for(int i = 0; i < n; i++){
System.out.println(i + ": "+ fib(i, memo));
}
}
int fib(int n, int[] memo) {
if (n <= 0) return 0;
else if (n == 1) return 1;
else if (memo[n] > 0) return memo[n];
memo[n] = fib(n - 1, memo) + fib(n - 2, memo);
return memo[n];
}
在上面打印前 n 個斐波那契數的記憶代碼中,由於 fib 方法中的遞歸調用導致的空間復雜度是多少 ( memo[n]= fib(n - 1, memo) + fib(n - 2, memo);
)? 盡管它們看起來像遞歸調用,但它們真正做的只是查找 memo[n - 1] 和 memo[n - 2],因為它們保證已經被計算過。 但是因為它們采用這種形式並在內存中設置了自己的堆棧,所以每個調用都應該有內存占用嗎? 如果是這樣,是什么?
如果我用memo[n] = memo[n - 1] + memo[n - 2]
替換該行,則此行貢獻的空間復雜度將減少到 O(1) 對嗎?
由於大小為 n + 1 的備忘錄數組,我知道整體空間復雜度至少為 O(n)。
當您從最小到最大計算順序斐波那契數時,即使使用遞歸調用,額外的空間復雜度也是O(1)
。
實際上,循環中每次對fib
新調用都會導致兩次調用(好吧,除了i = 0
和i = 1
,其中沒有進行額外的調用)。 每次調用都需要恆定的空間量。 遞歸深度以 2 為界,因此所需的額外空間總量是恆定的。
如果你用 summation memo[n] = memo[n - 1] + memo[n - 2]
的循環替換它,額外的空間復雜度將保持O(1)
,所以它不會減少。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.