常规的递归操作时间复杂度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函