【基础算法复习】斐波那契系列问题(二)
一、绪论
斐波那契数列求解是一个经典的递归问题,一种版本(有多种描述方式)问题描述为“给定整数N,代表台阶数目,一次可以跨2个或者1个台阶,返回有多少种走法”。问题不难,使用递归即可求解,关键方程为Fa[i] = Fa[i-1] + Fa[i-2]; 且Fa[i<2] = 1 ;(int i>0)但是递归过程中,花费的时间是呈现几何程度增长的,这里我们讨论要求实现时间复杂度为O(logN)的求解方式。
二、目的
解决斐波那契问题一般来说有三个方式,他们的时间复杂度分别是O(2的n次方)、O(N)、O(logN)可以看出来,他们的时间复杂度越来越小,也可以说,实现的方式不同,效率也有很大的差异。下面简单填一下他们各自的实现思路。
1、普通递归,通过Fa[i] = Fa[i-1] + Fa[i-2]; 算式迭代,可以非常轻松地完成斐波那契数列的求解,但是缺点也显而易见 ;
2、动态规划,状态转移方程依然和上述的方式一样,但是不同点在于,动态规划的状态按照斐波那契数列从左到右依次求解每一项的值 ;
3、矩阵动态规划,斐波那契数列表达式,可以使用矩阵来表示,很容易证明,严格满足Fa[i] = Fa[i-1] + Fa[i-2]的方程可以用矩阵的n次方相乘来表示。
三、编程实现
O(2的n次方)
1 //实现O(2的n次方) 2 public int f1(int n){ 3 if(n<1){ 4 return 0 ; 5 } 6 if(n==1 || n==2){ 7 return 1; 8 } 9 return f1(n-1)+f1(n-2) ; 10 }
O(N)
1 public int f2(int n){ 2 if(n<1){ 3 return 0 ; 4 } 5 if(n==1 || n==2){ 6 return 1; 7 } 8 9 int n1=1 ; 10 int n2=1 ; 11 int tmp =0; 12 for(int i=3;i<=n;i++){ 13 tmp=n1 ; 14 n1=n1+n2; 15 n2=tmp ; 16 } 17 return n1 ; 18 }
O(logN)