【问题标题】:Time Complexity of Fibonacci Algorithm [duplicate]斐波那契算法的时间复杂度
【发布时间】:2023-03-07 11:09:01
【问题描述】:

所以,我在 Java 中有一个递归方法来获取第 n 个斐波那契数 - 我唯一的问题是:时间复杂度是多少?我认为它是 O(2^n),但我可能弄错了? (我知道迭代要好得多,但这是一种练习)

public int fibonacciRecursive(int n)
{
    if(n == 1 || n == 2) return 1;
    else return fibonacciRecursive(n-2) + fibonacciRecursive(n-1);
}

【问题讨论】:

  • “迭代更好”通常是错误的。确实,它击败了您幼稚的递归实现,但可以改进该实现,使其基本上与使用动态编程的迭代实现相提并论。

标签: java recursion methods time-complexity fibonacci


【解决方案1】:

您的递归代码具有指数运行时间。但我不认为基数是 2,而可能是黄金比例(大约 1.62)。但当然 O(1.62^n) 也自动成为 O(2^n)。

运行时间可以递归计算:

t(1)=1
t(2)=1
t(n)=t(n-1)+t(n-2)+1

这与斐波那契数本身的递归定义非常相似。递归方程中的+1 可能与大 n 无关。 S 我相信它的增长速度大约与斐波那契数一样快,并且以黄金比例为基础呈指数增长。

您可以使用记忆来加速它,即缓存已经计算的结果。然后它有 O(n) 运行时间,就像迭代版本一样。


您的迭代代码的运行时间为 O(n)

您有一个简单的循环,其中包含 O(n) 步和每次迭代的恒定时间。

【讨论】:

  • 啊,对不起,我发布了错误的代码。我需要递归的!我的错,将在几秒钟内编辑。
  • @lars 这就是我写“当然 O(1.62) 也自动成为 O(2)”的原因。但是知道比 2^n 更接近的上限仍然很有趣。
  • O(? ^ n) = O(2 ^ n) 不直接遵循 O(?) = O(2),因为 O(n^?) != O(n²)。我对此并不特别感兴趣,因为这个问题有一个 O(lg n) (O(n) in the number of bits) 算法。
  • @lars 抱歉,这是一个错字。我想写O(1.62^n) 自动是O(2^n) 但忘了^n
【解决方案2】:

你可以用这个

在 O(log n) 中计算 Fn

【讨论】:

    【解决方案3】:

    每个函数调用只执行一次加法,或返回 1。基本情况仅返回值 1,因此加法的总数为 fib(n)-1。因此函数调用的总数为2*fib(n)-1,因此时间复杂度为Θ(fib(N)) = Θ(phi^N),以O(2^N)为界。

    【讨论】:

      【解决方案4】:

      O(2^n)?我在这里只看到 O(n)。

      我想知道您为什么要继续计算和重新计算这些?只要内存要求不会变得太讨厌,缓存您拥有的那些不是一个好主意吗?

      由于它们没有改变,如果速度对我很重要,我会生成一个表并进行查找。

      【讨论】:

        【解决方案5】:

        很容易看出(并通过归纳证明)对 fibonacciRecursive 的调用总数完全等于返回的最终值。这确实是输入数字的指数。

        【讨论】:

        • 不,它略高。例如 Fibo(2) 有 3 次调用,但返回 2。但对于较大的 n,差异并不重要。
        猜你喜欢
        • 2011-11-28
        • 1970-01-01
        • 1970-01-01
        • 2017-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-12
        相关资源
        最近更新 更多