斐波那契數列的矩陣分治求法java實現
阿新 • • 發佈:2019-02-19
平時一般求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; } } } }