矩阵加速计算斐波那契数列

摘要

    通过矩阵加速计算,将计算斐波那契数列的时间复杂度优化到O\left ( logn \right ),空间复杂度O\left ( 1 \right )

 

目录

一、斐波那契数列

二、传统计算方法

    1.递归法

    2.记忆化递归

三、矩阵加速计算斐波那契数列

    1.斐波那契数矩阵

    2.C++代码实现矩阵加速斐波那契数列

    3.快速幂

    4.全部代码

 

一、斐波那契数列

    斐波那契数列,又称黄金分割数列,是指这样一个数列:0,1,1,2,3,5,8,13,……

     在数学上通常以如下递归方法定义:F(0)=0, F(1)=1,F(n)=F(n-1)+F(n-2)(n\geq 2, n\in N+)

二、传统计算方法

1.递归法

   即使用最普通的递归算法进行计算,代码如下:

int Fib(int n){
    if(n == 0) return 0;
    if(n == 1) return 1;
    return Fib(n-1)+Fib(n-2);
}

    该算法时间复杂度为O\left ( \left (\frac{2}{\sqrt{5} -1} \right ) ^{n}\right ),时间复杂度推导可参考该篇博客点击跳转。可见当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);
}

   由此算法时间复杂度可以优化到O\left ( n \right ),但显然这种做法是以空间换时间,需要耗费相对较大的空间复杂度O\left ( n \right )。虽然时间复杂度已经优化到线性,但面对较大的数据仍然略显吃力。

三、矩阵加速计算斐波那契数列

1.构造斐波那契矩阵

    笔者假定读者已经熟悉矩阵乘法的计算规则,如果不是,请参考此处

    我们首先构造这样一个2x2的矩阵:

    \begin{bmatrix} F\left ( n+1 \right ) & F\left ( n \right )\\ F\left ( n \right )& F\left ( n-1 \right ) \end{bmatrix}

    再构造这样一个2x2的矩阵:

    \begin{bmatrix} 1&1 \\ 1&0 \end{bmatrix}

   如果我们把如上两个矩阵会得到什么效果?

 

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值