【基础算法复习】斐波那契系列问题(二)

一、绪论

  斐波那契数列求解是一个经典的递归问题,一种版本(有多种描述方式)问题描述为“给定整数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)

posted @ 2017-03-30 10:29  胖胖胖好汉  阅读(337)  评论(0编辑  收藏  举报