矩阵优化递推的思想在于把递推的层数化为矩阵的幂数,也就是说设计一个矩阵 A,使得 An 中的某个元素就是递推的第 n 项,即 fn。这么做就可以将 O(n) 的递推优化为 O(log2n)的矩阵快速幂(矩阵 A 的行列数为常数,因此快速幂中的矩阵乘法复杂度为常数),本质上是一种倍增做法
具体的讲,假如是我们现在有如下线性递推关系
fn,fn−1,fn−2,…,f2,f1fn={fn−1,fn−2,…,fn−k−1}
其中第二行的 {} 代表一种运算,意味着 fn 可以由 fn−1 到 fn−k 的这些数做某种运算得出
那我们将这种递推关系转化为矩阵乘法形式(A 为 (k+1)×(k+1) 的方阵),得:
[fnfn−1…fn−k]=[fn−1fn−2…fn−k−1]A=[fn−2fn−3…fn−k−2]A2=⋯=[fkfk−1…f0]An−k
这样,我们只需要计算到 fk ,剩下就交给矩阵快速幂 O(log2n) 计算 An−k 即可
那么,如何设计矩阵 A 呢?
我们以计算斐波拉契数列为例,首先我们可以很快得出形如上式的矩乘形式
[fnfn−1]=[fn−1fn−2]A=⋯=[f1f0]An−1
那么 A 一定为一个 2×2 的矩阵,我们令其为 [abcd] 代入上式 [fnfn−1]=[fn−1fn−2]A 得到如下:
[fnfn−1]=[(a⋅fn−1+c⋅fn−2)(b⋅fn−1+d⋅fn−2)]
因此可以得到
fn=a⋅fn−1+c⋅fn−2fn−1=b⋅fn−1+d⋅fn−2
代入 n 较小的值,手工计算出 fn,fn−1 和 fn−2,最后得解 {a=b=c=1d=0
因此,A=[1110]
本文作者:MessageBoxA
本文链接:https://www.cnblogs.com/SkyNet-PKN/p/17451485.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步