【问题标题】:How to calculate the time of recursive computation of n-th Fibonacci number?如何计算第n个斐波那契数的递归计算时间?
【发布时间】:2012-10-11 16:08:05
【问题描述】:

有什么方法可以知道在当前机器上计算第 n 个斐波那契数需要多少时间?例如,在当前机器上,第 30 个元素的计算时间为 67 毫秒,第 40 个元素的计算时间为 554 毫秒。如何计算第 99 个元素的时间?

int fib(int n)
{
    if( n <= 2) 
        return 1
    else
        return fib(n-1) + fib(n-2)
}

更新

Fibonacci Nth vs ms(当前 pc 计算第 n 个斐波那契元素所用的时间,以 ms 为单位的时间) http://pastebin.com/PGnd54Hq

Matlab: 代码 http://pastebin.com/L9CH53Pf

如何找出第 N 个元素的时间?

【问题讨论】:

  • “当前机器”是什么意思?这个问题有点不清楚。此外,任何类型的估计都取决于它是哪种算法。是尾递归吗?每次调用都推送一个堆栈帧吗?你对这个问题有什么看法?
  • 我的机器-当前运行递归算法的PC。可能另一种可能的解决方案是找出(总共)需要多少步骤并将其乘以一个步骤的时间。但是如何计算一步所需的时间呢?

标签: algorithm complexity-theory fibonacci


【解决方案1】:

我会测量一系列值的时间并制作表格:

n | time

然后使用matlab 适应exponential function

请记住,大 O 表示法是渐近的并且适用于大量元素。

您应该尝试为它编写一个 c 代码。使用 Fibonacci 例程的内联函数,并获取使用 ctime 的时间并将值存储在两个数组中。然后使用matlab 或`python 分析结果。

请发布您的结果...

【讨论】:

    【解决方案2】:

    很容易证明对函数的递归调用次数也遵循斐波那契数列。例如,如果 F0=0F1=1 是您的基本情况,那么 F2 需要调用 2 次函数,F3 需要调用 3 次,依此类推。

    这证明了使用指数函数来适应 @0x90 建议的时间。

    【讨论】:

      【解决方案3】:

      显然,您正在运行用于计算斐波那契数列的朴素算法的实现。该算法具有指数复杂度:Computational complexity of Fibonacci Sequence (~θ(1.6n))。所以你的程序在你的计算机上的运行时间大约是k*1.6n。知道一个n 的函数结果(您的程序的运行时间),您应该能够计算常数k,从而计算不同n 的近似时间。

      【讨论】:

      • 无法理解为什么这个公式没有显示需要的实时算法。在问题的示例中,计算第 40 个元素的时间是 554 毫秒和第 30 次 -67 毫秒。使用这个公式 k= (67/(1.6^30)) 和 T[40]=( (67/(1.6^30)) *1.6^(40)) 但它是不正确的。 wolframalpha.com/input/?i=%28%2867%2F%281.6%5E30%29%29*1.6%5E%2840%29%29
      【解决方案4】:

      性能不仅取决于函数调用的次数和每次调用中的计算次数,还取决于您为递归算法在堆栈上推入更多内容所支付的费用(按时间计算)。我不知道堆栈推送是如何执行的,但它很可能在某个阈值之后开始更快地增加。因此,您必须找出这个阈值的起始位置并在下方和上方(以指数方式或其他方式)拟合(当您开始构建递归堆栈时,可能会有更多类似的性能损失)。

      显然 - 虽然这不是问题 - 斐波那契数不应该以递归方式计算,即使这在数学上很优雅并且需要最简单的代码。

      [添加/编辑] 我注意到您添加了时间测量图。为了获得更好的洞察力,我建议垂直使用对数刻度(次)。这将更清楚地显示整个图是“纯”指数 - 对数图上的直线 - 还是它是否是(不同的)指数序列或其他东西。可能,指数部分从“某处”开始,或者变成另一个指数。

      【讨论】:

        【解决方案5】:

        根据列出的代码,每个调用都会进行 2 次调用。所以这个问题的一个简单答案是每个 n 的调用次数加倍,所以调用次数为 2^(n-1)。例如,如果您正在计算 fib(10),则调用次数将为 2^9 = 512。因此,如果需要 1 秒来进行一次,则需要 512 秒来进行 fib(10) 的所有调用)。

        【讨论】:

          猜你喜欢
          • 2020-02-09
          • 2013-09-26
          • 1970-01-01
          • 1970-01-01
          • 2013-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多