矩阵乘法优化递归式

序:

在OI比赛中,很多情况下我们可以能通过打表(找规律)或者某些方式发现一个递归式。
例如:f(n) = f(n - 1)+f(n - 2),(斐波那契数列)。

通常情况下,我们计算f(n)的时间复杂度就是O(n)(分别计算f(1), f(2) … f(n - 1)).
但是当n很大又或者还有其他处理的复杂度一叠加便会超时。

如果不学习矩阵乘法优化的话,我们恐怕永远不会想到计算递推式还可以进行优化。
实际上利用矩阵乘法,我们可以将O(n)的计算递归式的复杂度降至O(logn)


优化递归式的特征

形如f(n) = a1 * f(n - 1) + a2 * f(n - 2) + … + ak * f(n - k)+c (c为常数)


本文讨论的范畴
  • 形如 f(n) = f(n-1) + f(n-2) + .. + f(n-k) 的递归式(1)

  • 形如f(n) = a1 * f(n-1) + a2 * f(n-2) + .. + ak * f(n-k) 的递归式(2)

  • 形如f(n) = a1 * f(n-1) + a2 * f(n-2) + .. + ak * f(n-k) + c 的递归式(3)

实际上理解了最简单的第一个递归式的原理,就很容易理解后面的两种情况。每个前式都是后式的一种特殊情况。


理论基础

首先给出斐波那契数列求第n项的O(logn)的做法,由它引出原理。

已知 :
f(n) = f(n -1) + f(n - 2); – (1)
f(n - 1) = f(n - 1); – (2)
由(1)(2)可以得到这样的一个式子:
[ f(n) ] = [1, 1] * [f(n - 1)]
[f(n - 1)] [1, 0] * [f(n - 2)]

这就核及到矩阵乘法的运算规则。矩阵乘法的计算方式如下所示:

A = X * Y。必须满足row(X) = colom(Y)。
A[i][j] = sum{x[i][k] * x[k][j]}。
row(A) = row(X), colom(A) = colom(Y)..

对于上式,f(n) = f(n - 1) + f(n - 2),f(n - 1) = f(n - 1) + 0,满足斐波那契数列的规则。
我们设右边靠左的式子为A,靠右的为F。

那么计算f(n),我们只需要计算A^(n - 1) * F。复杂度O(n)。
但是做幂运算,可以通过快速幂将复杂度从O(n)降到O(logn),因此总复杂度科技降到O(logn)。

通过这个例子我们能发现什么?很显然的便是A与Y(左式与右二式,一下皆简称为A,X,Y)本质上是一个东西ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值