【问题标题】:Fibonacci sequence. Time Complexity斐波那契数列。时间复杂度
【发布时间】:2017-04-09 17:27:14
【问题描述】:

首先 - 是的,我知道有很多类似的问题,但我仍然不明白。

所以这段代码的 Big-O 表示法是 O(2^n)

 public static int Fibonacci(int n)
    {
        if (n <= 1)
            return n;
        else
            return Fibonacci(n - 1) + Fibonacci(n - 2);
    }

即使我使用 6 来运行它,函数也会被调用 25 次,正如您在这张图片中看到的那样:

Fibonacci 不应该是 64 因为 O(2^6) = 64 吗?

【问题讨论】:

  • 那个代码是错误的,它给Fib(0)0,而它应该是1
  • @Alexander 这取决于您是引用 fib(0) = fib(1) = 1 还是 fib(1) = fib(2) = 1,两者都可以 - 仅取决于您从哪里开始索引。
  • 感谢您指出这一点。
  • 另外:O(2^(n - 1)) 仍然是 O(2^(n))。当n 接近无穷大时,n 会胜过常数的偏移量。

标签: recursion time-complexity fibonacci


【解决方案1】:

这里的逻辑很少有问题:

  1. 大 O 表示法仅给出上渐近界,而不是紧界,这就是 big Theta 的用途。
  2. 斐波那契实际上是Theta(phi^n),如果您正在寻找更紧密的界限(其中phi 是“黄金比例”,phi ~= 1.618
  3. 在谈论渐近表示法时,谈论小数并忽略常数没有多大意义 - 因为它们因渐近复杂性而被省略(但这里不是这种情况)。

在这里,问题是斐波那契确实是O(2^n),但这个界限并不紧密,因此实际调用次数将低于估计的调用次数(对于足够大的n,向前)。

【讨论】:

  • 谢谢,我现在有了更好的理解。请您看一下这个 - Fibonacci 在这个线程上有一个“绘制”金字塔以直观地展示如何获得 O(2^n) 的人的答案。他使用相同的算法并从Fib(6) 开始,不知何故设法得到64。这是我不明白的部分。你能评论一下吗?
  • @Daniel 那里已经有 Avik 的评论,说金字塔是错误的,因为 F(3) 被调用了 3 次,而不是 4:F(6) = F(5) + F( 4) = F(4) + F(3) + F(3) + F(2) = F(3) + F(2) + F(3) + F(3) + F(2)。 (下一行也会出现同样的错误)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
相关资源
最近更新 更多