1. 程式人生 > >斐波那契數列的矩陣分治求法java實現

斐波那契數列的矩陣分治求法java實現

平時一般求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[n][n];
	}

	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;
			}
		}
	}
}