您的位置:首页 > 编程语言 > Java开发

斐波那契数列的矩阵分治求法java实现

2014-04-26 18:49 471 查看
平时一般求Fibonacci数列都是用递归求的,其实还可以利用矩阵的幂求,如果递归时间复杂度是指数的(2^n),而矩阵分治来求是logn的。



为求A的n次幂,使用了分治法,复杂度为O(log(n))。这个结论可以用数学归纳法证明。

直接上代码:

package edu.pku.ss.hlj;

public class Matrix_N {
static int[][] matrix;

public static void main(String[] args) {
init(2);
matrix[0][0] = 1;
matrix[0][1] = 1;
matrix[1][0] = 1;
matrix[1][1] = 0;
int[][] temp = new int[matrix.length][matrix.length];
temp = pow(4);
for (int[] a : temp) {
for (int b : a) {
System.out.print(b + " ");
}
System.out.println();
}
System.out.println("斐波那契数列的fn值为:" + temp[0][1]);
}

public static void init(int n) {
matrix = new int

;
}

public static int[][] matrixMulti(int[][] m, int[][] n) {
int[][] temp = new int[matrix.length][matrix.length];
for (int k = 0; k < matrix.length; k++) {
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix.length; j++) {
temp[k][i] += m[k][j] * n[j][i];
}
}
}
return temp;
}

public static int[][] pow(int n) {
int[][] temp = new int[matrix.length][matrix.length];
if (n == 1) {
return matrix;
} else {
if (n % 2 != 0) {
temp = pow((n - 1) / 2);
temp = matrixMulti(temp, temp);
return matrixMulti(temp, matrix);
} else {
temp = pow(n / 2);
temp = matrixMulti(temp, temp);
return temp;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: