簡體   English   中英

記憶化斐波那契代碼中的空間復雜度

[英]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 = 0i = 1 ,其中沒有進行額外的調用)。 每次調用都需要恆定的空間量。 遞歸深度以 2 為界,因此所需的額外空間總量是恆定的。

如果你用 summation memo[n] = memo[n - 1] + memo[n - 2]的循環替換它,額外的空間復雜度將保持O(1) ,所以它不會減少。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM