摘要
通过矩阵加速计算,将计算斐波那契数列的时间复杂度优化到,空间复杂度
。
目录
一、斐波那契数列
二、传统计算方法
1.递归法
2.记忆化递归
三、矩阵加速计算斐波那契数列
1.斐波那契数矩阵
2.C++代码实现矩阵加速斐波那契数列
3.快速幂
4.全部代码
一、斐波那契数列
斐波那契数列,又称黄金分割数列,是指这样一个数列:0,1,1,2,3,5,8,13,……
在数学上通常以如下递归方法定义:
二、传统计算方法
1.递归法
即使用最普通的递归算法进行计算,代码如下:
int Fib(int n){
if(n == 0) return 0;
if(n == 1) return 1;
return Fib(n-1)+Fib(n-2);
}
该算法时间复杂度为,时间复杂度推导可参考该篇博客点击跳转。可见当n较大时,时间复杂度将会非常大,满足不了时间要求。
2.记忆化递归(动态规划)
本质还是用递归的方法。但朴素递归存在重复计算的缺陷。如图是计算斐波那契数列的递归树。

可见,在递归过程中,很多量被重复计算过很多次。如果我们在计算的同时,将计算过的量存储起来,即加入“记忆化”,可以使计算变得相对高效。
int f[MaxN] = {0};
int Fib(int n){
if(n == 0) return 0;
if(n == 1) return 1;
if(f[n]!=0) return f[n];
return f[n] = Fib(n-1)+Fib(n-2);
}
由此算法时间复杂度可以优化到,但显然这种做法是以空间换时间,需要耗费相对较大的空间复杂度
。虽然时间复杂度已经优化到线性,但面对较大的数据仍然略显吃力。
三、矩阵加速计算斐波那契数列
1.构造斐波那契矩阵
笔者假定读者已经熟悉矩阵乘法的计算规则,如果不是,请参考此处。
我们首先构造这样一个2x2的矩阵:
再构造这样一个2x2的矩阵:
如果我们把如上两个矩阵会得到什么效果?

最低0.47元/天 解锁文章
1749

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



