一、求斐波那契数列矩阵乘法的方法
1)斐波那契数列的线性求解(O(N))的方式非常好理解
2)同时利用线性代数,也可以改写出另一种表示
| F(N) , F(N-1) | = | F(2), F(1) | * 某个二阶矩阵的N-2次方
3)求出这个二阶矩阵,进而最快求出这个二阶矩阵的N-2次方
4)斐波那契数列 1 1 2 3 5 8 13.....其为fn = fn-1 + fn-2 最底层n-2 是二阶矩阵 n-2次方
其二阶矩阵为 1 1 也就是[ [1,1] [1,0] ]二维数组
1 0
二、类似斐波那契数列的递归优化
如果某个递归,除了初始项之外,具有如下的形式
F(N) = C1 * F(N) + C2 * F(N-1) + … + Ck * F(N-k) ( C1…Ck 和k都是常数)
并且这个递归的表达式是严格的、不随条件转移的
那么都存在类似斐波那契数列的优化,时间复杂度都能优化成O(logN)
先判断公式最底层阶数 i fn = fn-1...+ fn-i 依赖最低层的就是阶数 i阶 * 得到公式 : * |fn,fn-1,fn-2..fn-i+1| (共i项) = |fi,fi-1,fi-2...1| (共i项) * 矩阵i*i 的 n-i次方
三、斐波那契数列矩阵乘法方式的实现
1.斐波那契数列 1,1,2,3,5,8,13....
f(n) = f(n-1) + f(n-2)2.迈台阶问题 1,2,3,5,8,13,21....
f(n) = f(n-1) + f(n-2)3.铺瓷砖问题 1,2,3,5,8,13,21....
f(n) = f(n-1) + f(n-2)4.生牛问题 1,2,3,4,6,9,13,19...
f(n) = f(n-1) + f(n-3)
package class26;
/**
* 斐波那契数列矩阵乘法方式的实现
*/
public class FibonacciProblem {
/**
* 斐波那契数列
* @param n
* @return
*/
public static int f1(int n) {
if (n < 1) {
return 0;
}
if (n == 1 || n == 2) {
return 1;
}
return f1(n - 1) + f1(n - 2);
}
public static int f2(int n) {
if (n < 1) {
return 0;
}
if (n == 1 || n == 2) {
return 1;
}
int res = 1;
int pre = 1;
int tmp = 0;
for (int i = 3; i <= n; i++) {
tmp = res;
res = res + pre;
pre = tmp;
}
return res;
}
/**
* 总结一个 递推公式
* 斐波那契数列 : f(n) = f(n-1) + f(n-2) 最底层n-2 2阶 转换成矩阵乘法 降低时间复杂度
* |f(n),f(n-1)| = |f(2),f(1)| * 矩阵[[1,1],[1,0]]的n-2次方
*
* 其他同类型的固化公式: fn = 6*f(n-1) + 3* f(n-5)