zoukankan      html  css  js  c++  java
  • 用矩阵幂求解线性递推序列

    在上一篇文章中我们探讨了如何快速求解幂运算的方法,并且最终给出了一个时间复杂度为O(logn)的算法,那么在这一片文章中,我想说一说快速幂运算的一个应用,也就是利用矩阵的快速幂运算求解线性递推序列。
    首先我们来了解下什么是线性递推序列,在这里给大家看一个大家一定很熟悉例子,那就是斐波那契数列,它的递推公式是:

    从上面这个方程中我们可以看到很明显的递推关系,实际上我们在做运算的时候,如果一步一步的按照递推式计算,将会消耗大量的时间,于是我们求助于其它的方式。
    首先,对于一般的k阶线性递推函数y,应当有这样的形式:

    若对于这个递推函数,如果对所有不小于k的n有:

    直观来看,这个递推函数应该是长成这个样子的:

    当给定了从X(0) ~ X(k – 1) 的k个初始值的时候,我们就能利用这个递推公式计算出所整个序列。那么解决问题的关键就落在了递推函数f的身上。
    观察递推函数f的形式,我们发现它可以用两个向量乘积的形式来表达:

    为了使用这个函数计算的递推序列能够方便的进入下次的跌打运算,我们把系数向量扩充成对角线为1的一个伴随矩阵,也就是我们通过矩阵乘法的运算之后能够达到下面的效果:

    依赖于矩阵乘法的结合性,我们就可以得出下面的公式:

    当我们给定递推公式以及其前k个项后,我们就能够通过矩阵乘幂的方法求解其第n项的数值,而在前一篇文章我们已经给出了快速求解矩阵幂的方法,所以求解一个递推序列第n项值的复杂度也被降低为了O(logn)。
    下面我给读者准备了POJ上的一道题目,其解法就是依赖于本篇文章和前一篇文章所描述的内容:POJ 3070 Fibonacci,有兴趣的读者一定要试一试哦~

  • 相关阅读:
    伸展树(SplayTree)的实现
    map的访问
    #pragma warning(disable 4786)
    debian sftp/ssh197
    debian 配置静态ip197
    deepin 安装tar.gz197
    npm构建vue项目197
    linux 常用命令197
    application/force-download 不生效197
    reids 安装197
  • 原文地址:https://www.cnblogs.com/zhaoxinshanwei/p/3675427.html
Copyright © 2011-2022 走看看