计算fibonacci数列logn的算法

本文介绍了如何使用矩阵快速幂算法以O(logn)的时间复杂度计算Fibonacci数列。传统递归或循环方法会进行大量重复计算,效率低下。通过矩阵乘法,我们可以避免这个问题,只需计算矩阵的幂次,大大减少了计算次数。文章详细阐述了算法原理,并给出了代码实现。
摘要由CSDN通过智能技术生成

        计算fibonacci数列通常有两种方法,非常符合fibonacci数列公式表达的方法就是使用递归,当x = 1或x = 2时,fab(x) = 1; x > 2时,fac(x) = fac(x - 1) + fac(x - 2);

int fibonacci(int n)
{
    if (n <= 2)
        return 1;
    else
        return fibonacci(n - 1) + fibonacci(n - 2);
}


        这样可以很方便的使用递归实现算法,但是使用递归计算的话效率非常的低下,因为在后续的计算中执行了大量的重复计算,比如计算fib(4) = fib(3) + fib(2),然后fib(3)递归计算fib(2), fib(1);fib(2)要计算fib(1),从而fib(2)和fib(1)被重复计算了,所以带来了没必要的计算。为了避免这种额外的计算开销,所以有了的循环计算数列的方法。

#include <iostream>
using namespace std;

int main(int argc, char const *argv[])
{
    int a1 = 1, a2 = 1, n;
    cin >> n;
    for (int i = 3; i <= n; i++)
    {
        int t = a1 + a2;
        a1 = a2;
        a2 = t;
    }
    cout << a2 << endl;
	return 0;
}

        因为fibonacci数列的都一项都只与前两项相关,并且起始的两项数据是已知的,所以我们保留两个变量,保存每次计算的前两个数,每次循环中不断求出新的数列项,然后更新这两个变量的值,以便下次循环使用,同样也能实现fibonacci数列常数时间的计算。

还有一个fibonacci数列的通项公式是通项公式是

a(n)=(√5/5)*{[(1+5)/2]^n - [(1-5)/2]^n},但我没用过。

        本文的重点是下面这种计算fibonacci数列的方法,其时间复杂度O(log(n));我们用矩阵去实现这个算法,预备知识,矩阵乘法:http://zh.wikipedia.org/wiki/%E7%9F%A9%E9%99%A3%E4%B9%98%E6%B3%95,我们设定基础矩阵为,然后不断用它乘以自己依次得到

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值