您的位置:首页 > 其它

斐波那契数列的快速解法

2015-12-06 20:15 387 查看

题目描述

求解斐波那契数列,要求时间复杂度为O(logn\log n )

题目解答

主要思路是快速幂和矩阵乘法的结合律



利用数学归纳法来证明。

快速幂的思想:

当n为偶数的时候

an=an2∗an2a^n = a^{n \over 2} * a^{n \over 2}

当n为奇数的时候

an=a(n−1)2∗a(n−1)2∗aa^n = a^{(n-1) \over 2} * a^{(n-1) \over 2} * a

那么FnF_n的问题就可以换成求矩阵的n次幂了。

代码实现

class Solution {
/**
* @param n: an integer
* @return an integer f(n)
*/
private static int[][] A = {{1,1},{1,0}};
public int fibonacci(int n) {
// write your code here
if(n < 1)
return 0;
int a = 0;
int b = 1;
if(n == 1)
return a;
if(n == 2)
return b;
int[][] ret= power(n-2);
return ret[0][0];
}

// 求 a ^ n
public static int[][] power(int n){

int[][] a = new int[2][2];
if(n == 1){
a = A;
}else if(n % 2 == 0){
a = matrixMultiply(power(n/2), power(n/2));
}else if(n % 2 == 1){
a = matrixMultiply(power(n/2), power(n/2));
a = matrixMultiply(a, A);
}

return a;
}

/*
*两个矩阵相乘
*/
public static int[][] matrixMultiply(int[][] a, int[][] b){
int[][] ret = new int[2][2];
ret[0][0] = a[0][0]*b[0][0] + a[0][1]*b[1][0];
ret[0][1] = a[0][0]*b[0][1] + a[0][1]*b[1][1];
ret[1][0] = a[1][0]*b[0][0] + a[1][1]*b[1][0];
ret[1][1] = a[1][0]*b[0][1] + a[1][1]*b[1][1];
return ret;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: