定义Fibonacci数列如下:
/ 0 n=0
f(n)= 1 n=1
\ f(n-1)+f(n-2) n=2
如果使用递归的方法来做,会有大量重复计算的结点。而且重复的结点数会随着n的增大而急剧增加。这意味这计算量会随着n的增大而急剧增大。事实上,用递归方法计算的时间复杂度是以n的指数的方式递增的。
将递归的计算转化为递推的计算,可以有效减少计算量。把已经得到的数列中间项保存起来,如果下次需要计算的时候我们先查找一下,如果前面已经计算过了就不用再次计算了。从下往上计算,首先根据f(0)和f(1)算出f(2),在根据f(1)和f(2)算出f(3)……依此类推就可以算出第n项了。很容易理解,这种思路的时间复杂度是O(n)。
更快的算法的时间复杂度是O(logn)。
首先有下面公式成立:
二阶矩阵 {f(n), f(n-1), f(n-1), f(n-2)} ={1, 1, 1,0}n-1
这样就转化为数的幂运算。数的幂运算可以使用快速幂算法。时间复杂度为O(logn)。