【问题标题】:Time complexity for all Fibonacci numbers from 0 to n从 0 到 n 的所有斐波那契数的时间复杂度
【发布时间】:2019-01-05 16:29:11
【问题描述】:

我正在计算这段代码的时间复杂度,它打印从 0 到 n 的所有斐波那契数。根据我的计算,fib() 方法需要O(2^n),由于它被调用了i 的次数,所以它是O(n*2^n)。然而,这本书说它是O(2^n)。谁能解释一下为什么这里的时间复杂度会是O(2^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);
}

【问题讨论】:

  • @Am_I_Helpful 请在将其标记为重复之前仔细阅读该问题。您提供的链接中的内容不是我问题的答案。
  • 在计算fib(n) 时,您已经得到了fib(n -1)fib(1) 的所有结果。所以计算fib(n) 与计算所有这些具有相同的复杂性。但是您的allFib 函数不同,因为它不会保存以前的fib(n-1)fib(n-2) 来计算fib(n)。所以allFib 的时间复杂度为 O(n*2^n)。
  • @shaunshia 这就是我的答案,但书上说它是 O(n*2^n) 并且它不是任何书,它是 GL Mcdowell 的《Cracking the Coding Interview》。

标签: time-complexity fibonacci


【解决方案1】:

我终于从教授那里得到了答案,我会在这里发布:

按照他的说法:你不应该只看从 0 到 n 迭代的 for 循环,而是必须通过计算步骤来找到实际的计算。

fib(1) 需要 2^1 步

fib(2) 需要 2^2 步

fib(3) 需要 2^3 步

.......

fib(n) 需要 2^n 步

现在添加这些:

2^1 + 2^2 + 2^3 + ........+ 2^n = 2^n+1

忽略常数,它是2^n,因此时间复杂度是O(2^n)。

【讨论】:

  • 对我来说,这仅仅解释了fib(n) 本身的时间复杂度。而且我确实理解它必须是2^n 的原因。但还是。 fib(n)for 循环中找到。这意味着 fib(n) 被调用 n 次。我不明白为什么不是n * 2^n
  • 你好像和书上说的一样。
【解决方案2】:

我已经想出了自己的方法来理解本书的解决方案,希望它可以帮助那些仍在苦苦挣扎的人。

假设我们现在调用 allFib(n)。

由于我们有一个从 0 到 n 的 for 循环,因此将调用以下函数:

  • i = 0,调用 fib(0)
  • i = 1,调用 fib(1)
  • i = 2,调用 fib(2)
  • ...
  • i = n-1,调用 fib(n-1)

如前所述,fib(n) 将花费 O(2^n) = 2^n 步 因此,

  • i = 0,调用 fib(0) 需要 2^0 步
  • i = 1,调用 fib(1) 需要 2^1 步
  • i = 2,调用 fib(2) 需要 2^2 步
  • ...
  • i = n-1,调用 fib(n-1) 需要 2^(n-1) 步

因此,allFib(n) 的运行时间为

2^0 + 2^1 + 2^2 + ... + 2^(n-1)。 *

关注我们的sum of powers of 2 formula

* = 2^(n-1+1) - 1 = 2^n - 1。

因此它是 O(2^n)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多