一尘不染

亚线性时间中的第n个斐波那契数

algorithm

是否有任何算法可以在亚线性时间内计算第n个斐波那契数?


阅读 277

收藏
2020-07-28

共1个答案

一尘不染

所述n第Fibonacci数由下式给出

f(n) = Floor(phi^n / sqrt(5) + 1/2)

哪里

phi = (1 + sqrt(5)) / 2

假设原始数学运算(+-*/)是O(1)可以使用该结果来计算n在第Fibonacci数O(log n)时间(O(log n)因为式中的求幂的)。

在C#中:

static double inverseSqrt5 = 1 / Math.Sqrt(5);
static double phi = (1 + Math.Sqrt(5)) / 2;
/* should use 
   const double inverseSqrt5 = 0.44721359549995793928183473374626
   const double phi = 1.6180339887498948482045868343656
*/

static int Fibonacci(int n) {
    return (int)Math.Floor(Math.Pow(phi, n) * inverseSqrt5 + 0.5);
}
2020-07-28