【问题标题】:What is the time complexity of printing all Fibonacci numbers from 0 to n?打印从 0 到 n 的所有斐波那契数的时间复杂度是多少?
【发布时间】:2019-04-07 21:46:38
【问题描述】:

同样的问题在这里被问到: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)。

【问题讨论】:

  • 简单地说,如果你有 n 个 O(2^n) 步骤但你没有,你的 O(n × 2^n) 公式将是正确的那。你有 n 个步骤,好吧,但只有最后一个是 O(2^n)。最后一个是 O(2^(n-1)),前一个是 O(2^(n-2)),等等。它们都比最后一个小得多,所以它们都可以删除(在 O() 内),而 O(2^n) 仍然是增长最快的项。

标签: algorithm recursion time-complexity


【解决方案1】:

对于编写的程序,如果fib(n)的时间复杂度为T1(n),则程序的总时间复杂度为T(n) = sum_{i=0}^{n-1} T1(i)。现在尝试计算T1(i)。根据fib 函数的定义,T1(i) = T1(i-1) + T2(i-2) + 2T1(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).

【讨论】:

    猜你喜欢
    • 2019-01-05
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 2021-06-14
    • 2017-07-25
    相关资源
    最近更新 更多