java - 内存斐波那契码的空间复杂度

标签 java algorithm big-o space-complexity

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[n - 1] 和 memo[n - 2],因为它们保证已经被计算过。但是因为它们采用这种形式并在内存中建立自己的堆栈,所以每个调用都应该有内存占用吗?如果是这样,什么?

如果我将该行替换为 memo[n] = memo[n - 1] + memo[n - 2],则该行贡献的空间复杂度将减少到 O( 1)对吗?

我知道,由于 memo 数组的大小为 n + 1,因此整体空间复杂度至少为 O(n)。

最佳答案

当您计算从最小到最大的连续斐波那契数时,即使使用递归调用,额外的空间复杂度也是O(1)

事实上,循环中对 fib 的每次新调用都会产生两次调用(除了 i = 0i = 1 >,其中不进行额外的调用)。 每次调用都需要恒定的空间量。递归深度以 2 为界,因此所需的额外空间总量是恒定的。

如果将其替换为带有求和的循环 memo[n] = memo[n - 1] + memo[n - 2],额外的空间复杂度将保持 O(1 ),因此不会减少。

关于java - 内存斐波那契码的空间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41512975/

相关文章:

java - ProcessException : ExecException: Process 'command ' /Library/Java/JavaVirtualMachines/jdk1. 8.0_31.jdk/Content/Home/bin/java

c# - 将递归替换为 TimerCallback 以迭代所有变体

algorithm - 从向量历史预测二进制占用向量

big-o - 以下代码片段的最坏情况运行时间作为 N 的函数的增长顺序是多少?

java - ArrayList 还是不同键的映射,更快?

java - Assets 文件目录给出 java.io.FileNotFoundException eclipse

java - Android - dlopen 失败 : file offset for the library

Java - 将方法传递给类并在新线程中执行

algorithm - 如何找出将 1 2 和 3 添加到给定总和避免重复的可能方法的数量?

algorithm - 复杂性和大 O 符号