一、求斐波那契数列矩阵乘法的方法
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

本文介绍了使用矩阵快速幂技巧优化斐波那契数列的计算,详细阐述了矩阵乘法在求解斐波那契数列中的应用,将时间复杂度降至O(logN)。此外,还探讨了类似斐波那契数列结构的递归优化方法,并列举了矩阵乘法在不同问题(如迈台阶问题、铺瓷砖问题、生牛问题)中的应用。最后提出了一种字符串匹配问题,寻找由0和1组成的字符串中,所有0字符左侧都有1紧邻的情况。

2174

被折叠的 条评论
为什么被折叠?



