zoukankan      html  css  js  c++  java
  • 【基础算法复习】斐波那契系列问题(二)

    一、绪论

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

  • 相关阅读:
    币值转换
    抓老鼠啊~亏了还是赚了?
    第十二周作业
    第十一周作业
    第十周作业
    第九周作业
    第八周作业
    第七周作业
    第五周实验报告和总结
    第四次实验报告及总结
  • 原文地址:https://www.cnblogs.com/panghaohan/p/6644624.html
Copyright © 2011-2022 走看看