【问题标题】:How to estimate the time of Fibonacci recursive algorithm for nth element? [duplicate]如何估计第 n 个元素的斐波那契递归算法的时间? [复制]
【发布时间】:2013-09-26 20:30:30
【问题描述】:

如何估计第 N 个斐波那契元素的以下算法的完成时间?

private static double fib(double nth){

        if (nth <= 2) return 1;
        else return fib(nth - 1) + fib(nth - 2);
    }

【问题讨论】:

  • 您的意思是复杂性?还是实际时间?该算法在O(phi^n) 时间运行。
  • 我需要实际时间(计算第 N 个元素需要多长时间)。如何计算这个 O(phi^n) 例如第 200 个斐波那契数?
  • 为元素 1..10 运行它,然后使用它是 O(phi^2) 的事实进行推断。这不会很准确。这是练习吗?
  • 是的。我在 6452 毫秒内获得了第 45 名;和 10 毫秒。如何计算第 200 次的时间?
  • 为什么不使用closed form

标签: java algorithm


【解决方案1】:

该算法的精确时间复杂度是...O(F(n)) 其中 F(N) 是第 n 个斐波那契数。为什么?请参阅下面的说明。

让我们通过归纳来证明它。显然它适用于基本情况(一切都是常数)。为什么它对 F(N) 成立?让我们将算法复杂度函数表示为 T(N)。然后T(N) = T(N-2) + T(N-1),因为您进行了 2 次递归调用 - 一个参数减 1,一个减 2。而这个时间复杂度正是斐波那契数列。

所以F(N) 是您可以做出的最佳估计,但您也可以说这是O(2^n) 或更准确地说是O(phi^n) 其中phi = (1 + sqrt(5)) / 2 ~= 1.61。为什么?因为第 n 个斐波那契数几乎等于phi ^ n

这个界限使您的算法非多项式,并且对于比30 周围的数字更大的数字非常慢。您应该考虑其他好的算法 - 有许多已知的对数算法可以解决这个问题。

【讨论】:

  • 如果第 10 个元素是在 1 毫秒内计算的,我如何找出找到第 300 个 fib 元素所需的时间?
  • 根据上面的公式,您需要大约 2 * 10^62 次操作。假设您的计算机可以在一个内核上每秒进行 10^9 次操作,您将需要 10^45 年。直到那时,地球和太阳都会死去。
  • @RCola 你需要使用System.nanoTime() 来计算运行时间。 System.currentTimeMillis() 不够准确。
  • @BoristheSpider,我希望你在开玩笑?他需要等待 10^45 年。
  • 不,最好说 c * (1.61 ^10) = 9193461。你必须找到 c * (1.61^30)。这很容易找到,因为 c * (1.61^10) = c * (1.61^10)^3 = c * (9193461) ^ 3
猜你喜欢
  • 1970-01-01
  • 2020-02-09
  • 2021-07-18
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
  • 2022-12-10
  • 2010-12-03
相关资源
最近更新 更多