求斐波那契数列有很多种方法,暴力,递归,矩阵快速幂等等
但是前两者在所求项过大时会导致运行时间内存过大,矩阵快速幂恰恰解决了这两个弊端
矩阵快速幂包含快速幂思想和些许线性代数知识来达到快速运算的目的
首先我们来了解一下相关线性代数知识:
矩阵A*矩阵B=矩阵C
由图中所表示的可以理解为 f(x+1)=f(x)+f(x-1)即斐波那契数列的通式
若要求项数较大的数n斐波那契数,那么只用将矩阵A进行n-1次幂运算
算法实现包括包括: 构建表示矩阵的结构体,矩阵乘法的实现,矩阵快速幂
- 构建表示矩阵的结构体
struct matrix
{
long long mat[10][10];
matrix()
{
memset(mat, 0 ,sizeof(mat));
}
}
由于斐波那契数列中的数值会超出int的范围,所以此处用了 long long ,构造函数是将数据初始化为0
- 矩阵乘法的实现
matrix mul(matrix A,matrix B)
{
matrix C;
for(int i=1;i<10;i++)
for(int j=1;j<10;j++)
for(int k=1;k<10;k++)
{
C.mat[i][j]=A.mat[i][K]*B.mat[k][j]+C.mat[i][j]
}
return C;
}
矩阵乘法很好实现,用三层循环就可以实现
- 矩阵快速幂
matrix quickmi(matrix A,long long n)
{
matrix B;
for(int i=1;i<10;i++)
B.mat[i][i]=1;
while (n>0)
{
if(n&1)
B=mul(A,B);
A=mul(A,A);
n>>=1;
}
return B;
}
矩阵快速幂和普通快速幂是一样的思想,只是将基数由实数变成矩阵进行快速运算
如果不是很了解快速幂,可以看看这个博客快速幂
注: 片段代码或者语言如有错误望谅解并请指出。
扫描二维码关注公众号,回复:
2437136 查看本文章