具有记忆的递归Fibonacci的空间复杂度?

时间:2018-05-15 23:52:41

标签: java fibonacci space-complexity

我有两种方法可以找到给定数字' n'的Fibonacci系列。一个使用记忆。

我想知道这两种方法的空间复杂性如何不同:

    public static int fib(int n, int[] mem){

    if(n ==0 || n ==1 ){
        return n;
    }

    if(mem[n] > 0 ) {
        return mem[n]);
    }

    mem[n] = fib(n-1,mem) + fib(n-2,mem);

    return mem[n]; 

}

没有记忆:

public static int fib(int n){

    if(n ==0 || n ==1 ){
        return n;
    }

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


}

1 个答案:

答案 0 :(得分:0)

直接内存使用非常明显 - 使用memoization fib中的每个值只计算一次,因此你的空间复杂度将为o(n),其中n是fib的输入数(memoization数组将包含n个数字) )。

没有记忆 - 不需要额外的内存(缺点是许多冗余计算)。

  

是memoization数组,它传递给每个递归   调用相同的数组..或该数组的副本?如果是数组的副本   通过...空间复杂性将是>为O(n)。

您正在将相同的数组引用传递给递归调用。

这意味着您的空间复杂度为o(n)。如果您要创建一个新数组并将其传递,那么您的memoization将无法工作,因为您必须将更新的新数组的结果与前一个数组合并。