如何计算第n个Fibonacci数的递归计算时间?

时间:2012-10-11 16:08:05

标签: algorithm complexity-theory fibonacci

知道在当前机器上计算第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

Graph

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

5 个答案:

答案 0 :(得分:2)

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

n | time

然后使用matlab来适应exponential function

请记住,大O符号是渐近的,适用于大量元素。

enter image description here

你应该尝试为它编写一个c代码。使用Fibonacci例程的内联函数,并花时间使用ctime并将值存储在两个arraies中。然后使用matlab或`python。

分析结果

请发布您的结果......

答案 1 :(得分:2)

很容易证明函数的递归调用次数也遵循Fibonacci序列。比如,如果F0=0F1=1是您的基本情况,则F2需要2次调用该函数,F3需要3次,依此类推。

这证明使用指数函数来拟合@ 0x90建议的时间。

答案 2 :(得分:2)

显然,您正在运行用于计算Fibonacci序列的朴素算法的实现。此算法具有指数复杂度:Computational complexity of Fibonacci Sequence(〜θ(1.6 n ))。因此,您的计算机上的程序运行时间大约为k*1.6 n 。知道一个n函数的结果(您的程序的运行时间),您应该能够计算常量k,从而计算不同n的大致时间。

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

从列出的代码中,每次通话都会进行2次通话。因此,对这个问题的简单回答是每个n的呼叫数量加倍,因此呼叫数量为2 ^(n-1)。例如,如果你正在计算fib(10),那么调用的数量将是2 ^ 9 = 512.因此,如果花费1秒钟来制作一个,则需要512秒才能完成对fib的所有调用(10) )。