常规的递归操作时间复杂度O(2^N), 循环操作时间复杂度O(N)
这里介绍一种时间复杂度O(logN)的解法
思路:
将 F(n) = F(n-1) + F(n-2) 变换为矩阵乘法形式:
[F(n),F(n-1)] = [F(1), F(0)] * [[1 1] [1 0]]^(n-1),
其中**[F(1), F(0)]=[1, 0],在矩阵运算时相当于取后面矩阵运算结果第一行**
例如: [F(2), F(1)] = [F(1), F(0)] * [[1 1] [1 0]] = [F(0)+F(1), F(1)]
结果F(n)可以有两种获取方法:
第一种,取矩阵运算结果第一行第一列元素,由[F(n),F(n-1)] = [F(1), F(0)] * [[1 1] [1 0]]^(n-1)得,矩阵运算n-1次
第二种,取矩阵运算结果第一行元素之和得,由[F(n-1),F(n-2)] = [F(1), F(0)] * [[1 1] [1 0]]^(n-2), F(n) = F(n-1)+F(n-2),矩阵运算n-2次,本文写的是第二种方法,见fib函数
在具体进行矩阵乘法时候采用位运算化简乘法过程:
Matrix^9
= Matrix^ 1001(二进制)
= Matrix^8 * Matirx^1
= Matrix^1000 * Matirx^1(二进制)
相当于分解为次幂的二进制位为1的数的乘积来简化计算,具体代码在matrixpower函数中,multimatirx为两个矩阵乘法运算的函数
class Solution:
def fib(self, n: int) -> int:
if n < 2:
return n
res = self.matrixpower(n-2)
res = res[0][0] + res

本文介绍了使用矩阵快速幂方法解决斐波那契数列问题,通过矩阵变换将时间复杂度降低到O(logN),具体算法包括矩阵乘法的位运算优化,实现了在较短时间内计算斐波那契数列项的值。
最低0.47元/天 解锁文章
1689

被折叠的 条评论
为什么被折叠?



