Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 斐波那契数算法_Performance_Algorithm_Numbers_Fibonacci - Fatal编程技术网

Performance 斐波那契数算法

Performance 斐波那契数算法,performance,algorithm,numbers,fibonacci,Performance,Algorithm,Numbers,Fibonacci,斐波那契序列最常见的递归算法如下所示: unsigned int fib(unsigned int n){ return (n < 2) ? n : fib(n - 1) + fib(n - 2); } unsigned int fib(unsigned int n){ 返回值(n

斐波那契序列最常见的递归算法如下所示:

unsigned int fib(unsigned int n){
   return (n < 2) ? n : fib(n - 1) + fib(n - 2);
}
unsigned int fib(unsigned int n){
返回值(n<2)?n:fib(n-1)+fib(n-2);
}

就时间和空间复杂度而言,什么是最有效的斐波那契算法?

简建议的公式不是很神奇(如果你对线性代数有基本的了解,并且感兴趣,我可以在这里证明)

这也是最快的方式。因此,求助于JavaScript(我可以用其他语言实现这一点,您可能会喜欢它,它只是:

var sqrt5= Math.sqrt(5);
var phi = (1 + sqrt5) / 2;

function fibonacci(n){
     return (Math.pow(phi,n) - Math.pow(-phi,-n)) / sqrt5;
}

如果出于某种原因,你非常想避免它-你可以使用一种非常基本的动态规划形式来做
O(n)
(而不是现在的指数时间),而不是每次都计算最后两个数字-你记住它们

function fib(n){
    var x=1,y=1,t;
    for(var i=1;i<n;i++){ 
        t=x;
        x+=y;
        y=t;
    }
    return x;
}
函数fib(n){
变量x=1,y=1,t;

对于(var i=1;i,使用浮点计算整数通常是一个坏主意。在我上面看到的答案中,使用闭合公式也是这样

有一个令人惊讶的鲜为人知的公式,我将在下面加以说明。更好的方法是使用以下矩阵:[[1 1][1 0]]。可以证明,将其提高到n次方将得到[[f(n+1)f(n)][f(n)f(n-1)]]。如果不想使用矩阵,可以只使用4个参数,当然,还可以使用快速求幂得到O(logn)中f(N)的结果

请参见此处的更详细说明:


如果你需要任何额外的细节,请告诉我。

这篇维基百科文章的可能重复:递归斐波那契效率极低。迭代法要好得多。@jonhopkins我可以用很少的时间做常数时间计算research@JanDvorak也许wikipedia链接对你来说是可读的,但对我来说不是很可读lz.@user2871354这里有一页解释和基准测试它们:如果你能证明它适用于浮点数(而不是实数),我会非常感兴趣。我从来没有看到过这方面的实际证明,只是手工操作。难道你不需要因为不精确而舍入到最接近的整数吗?@harold如果你可以假设
pow
在实际值的1ulp之内,那么结果在实际值的5ulp之内。这对于2^50之前的值来说是非常好的(这非常接近于失去表达奇数的能力)@user2871354是的。你应该进行舍入。@user2871354是的,在某一点以上你应该进行数学运算。舍入结果,因为JS在这里无法产生准确的结果-但是舍入对JS的数字范围非常有效,因为JS的数字范围大于大多数实际用途。上面的封闭形式没有错。它给出正确的数字,有很好的理论支持。它也非常简单,在恒定的时间内运行。给定两种可能产生相同结果的算法,我总是选择简单和快速,而不是复杂和缓慢。