打印从0到n的所有斐波那契数的时间复杂度是多少?

时间:2019-04-07 21:46:38

标签: algorithm recursion time-complexity

在这里有人问过同样的问题:Time complexity for all Fibonacci numbers from 0 to n,但我不明白所提供的答案。

以下代码打印从0到n的所有斐波那契数。时间的复杂度是多少?

void allFib(int n){
    for(int i = 0 ; i < n ; i++){
        System.out.println(i + ": " + fib(i));
    }
}    

int fib(int n ){
    if(n <= 0) return 0;
    else if (n == 1) return 1;
    return fib(n-1) + fib(n-2);
}

我不明白为什么时间复杂度是O(2 ^ n)而不是O(n * 2 ^ n)。据说:

  

fib(1)采取2 ^ 1步

...

  

fib(n)需要2 ^ n步

我不知道这是怎么回事,因为fib(1)根据else语句立即返回1,因此应该采取1步。即使这句话是正确的,我仍然不明白时间复杂度如何仅为O(2 ^ n)。

1 个答案:

答案 0 :(得分:1)

对于书面程序,如果fib(n)的时间复杂度为T1(n),则程序的总时间复杂度为T(n) = sum_{i=0}^{n-1} T1(i)。现在尝试计算T1(i)。根据{{​​1}}函数的定义,fibT1(i) = T1(i-1) + T2(i-2) + 2(一个比较)和T1(0) = 1(两个比较)。

根据先前的著名分析,我们知道T1(1) = 2。因此,T1(i) = Theta(2^i)