我已经使用了迭代方法以及递归方法,但在这两种情况下我都没有得到更快的结果(10 ^ 6),即。 O(logN)复杂度。
迭代方法:
static BigInteger fibo(long n){
BigInteger a=new BigInteger("1");
BigInteger b=new BigInteger("2");
BigInteger c=new BigInteger("0");
for(long i=3;i<=n;i++){
c=a.add(b);
a=b;
b=c;
}
return c;
}
答案 0 :(得分:1)
封闭表单仅计算n
值:
您可以在Wolfram MathWorld和Wikipedia上详细了解该主题(包括此公式)。
不幸的是,你不能在这里使用BigInteger
,但我认为你应该能够用BigDecimal
来做到这一点(尽管我还没有测试过。)
答案 1 :(得分:0)
如果你想找出大于n的 fib(n)的值,你需要使用矩阵指数法,即用于求解线性递归的方法方程。
矩阵求幂的最大优点是它的运行时间简单为O(k ^ 3 * logN),其中N是我们计算的矩阵的幂,k是矩阵的大小。
检查下面提到的python代码片段,它为大n计算fibonacci(mod为10 ^ 9 + 7,在int范围内有数字)。你可以找到相同的详细解释在this博客中。
matrix_mult 函数将作为参数给出的两个矩阵相乘并返回它们的乘积。
def matrix_mult(A, B):
C = [[0, 0], [0, 0]]
for i in range(2):
for j in range(2):
for k in range(2):
C[i][k] = (C[i][k] + (A[i][j]*B[j [k])%mod)%mod
return C
fast_expo 函数计算并返回(矩阵^幂),这是负责O(logn)运行时间的函数。
def fast_expo(matrix, power):
if(power==1):
return matrix
else:
if(power%2==0):
matrix1 = fast_expo(matrix, power/2)
return matrix_mult(matrix1, matrix1)
else:
return matrix_mult(matrix, fast_expo(matrix, power-1))
使用预先计算的矩阵作为参数之一调用该函数。在斐波那契的情况下,矩阵是[[1,1],[1,0]]。
matrix = [[1, 1], [1, 0]]
matrix_n = fast_exponentiation(matrix, number-2)
print (matrix_n[0][0] + matrix_n[0][1]) % 1000000007
对于所有n> 2,这里的幂应该是M ^(n-2),其中M是基本矩阵,因为你已经有f(n)的前2个值,即f(1)和f(2) 。