代码之家  ›  专栏  ›  技术社区  ›  Warren Crasta

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

  •  -2
  • Warren Crasta  · 技术社区  · 6 年前

    这里也提出了同样的问题: 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 回复  |  直到 6 年前
        1
  •  1
  •   OmG    6 年前

    对于编写的程序,如果时间复杂的话 fib(n) T1(n) 程序的总时间复杂度为 T(n) = sum_{i=0}^{n-1} T1(i) . 现在尝试计算 T1(i) . 根据 fib 功能, T1(i) = T1(i-1) + T2(i-2) + 2 T1(0) = 1 (一个比较)和 T1(1) = 2 (两个比较)。

    从之前众所周知的分析,我们知道 T1(i) = Theta(2^i) . 因此, T(n) = Theta(sum_{i=1}^{n-1} 2^i) = Theta(2^n - 1) = Theta(2^n).