知道在当前机器上计算第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个元素的时间?
答案 0 :(得分:2)
我会测量一系列值的时间并制作表格:
n | time
然后使用matlab
来适应exponential function。
请记住,大O符号是渐近的,适用于大量元素。
你应该尝试为它编写一个c代码。使用Fibonacci例程的内联函数,并花时间使用ctime并将值存储在两个arraies中。然后使用matlab
或`python。
请发布您的结果......
答案 1 :(得分:2)
很容易证明函数的递归调用次数也遵循Fibonacci序列。比如,如果F0=0
和F1=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) )。