斐波那契高效算法(4种算法综合分析)

原创 2015年07月27日 17:34:41

斐波那契数列问题是算法学习者必然接触到的问题,作为经典问题,首次接触时一般是作为递归算法的案例教程。

然而递归解决斐波那契,其效率低的令人发指,有人算出其时间复杂度为O(2^n)。指数级时间复杂度。

如果面试的时候面试官问你斐波那契的求解方法,你来一个递归求解,基本上可以说,你已经game over了。

那么有没有更高效的算法呢,本文将一一介绍。

下面是斐波那契的4种解法:

1.递归    时间复杂度O(2^n)

	int f(int n){
		if(n == 1 || n == 2){
			return 1;
		}
		return f(n-1) + f(n-2);
	}

2.循环    时间复杂度O(n)

    public int f(int n) {
        // write code here
        int f0 = 1;
        int f1 = 1;
        int f2 = 0;

        for(int i = 2; i < n; i++){
            f2 = f0 + f1;
            f0 = f1;
            f1 = f2;
        }
        return f2;
    }


3.矩阵求解    时间复杂度O(logn)

    斐波那契的递推公式可以表示成如下矩阵形式,所以其


      

所以根据矩阵的分治算法,可以在O(logn)时间内算出结果。

笔试问题:

对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - 1) + F(n - 2),我们可以在线性时间内求出第nF(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围内的非负整数,请设计一个高效算法,计算第nF(n)。第一个斐波拉契数为F(0) = 1

给定一个非负整数,请返回斐波拉契数列的第n项,为了防止溢出,请将结果Mod 1000000007


    long[][] f = new long[][]{{0,1},{1,1}};
    public int getNthNumber1(int n) {
    	if(n == 0)
            return 1;
        if(n == 1)
            return 1;
        f = pow(n,f);
    	
		return (int) f[1][1];
    }

    private long[][] pow(int n,long[][] f){
    	if(n == 1)
    		return f;
    		
    	if(n == 2){
    		return fun(f,f);
    	}

    	if( n % 2 == 0){//偶数
    		f = pow(n/2,f);
    		return fun(f, f);
    	}else{
    		return fun(pow(n/2,f),pow(n/2 + 1,f));
    	}
    }
    
    private long[][] fun(long[][] f,long[][] m){
    	long[][] temp = new long[2][2];
    	temp[0][0] = (f[0][0]*m[0][0] + f[0][1]*m[1][0])%1000000007;
    	temp[0][1] = (f[0][0]*m[0][1] + f[0][1]*m[1][1])%1000000007;
    	temp[1][0] = (f[1][0]*m[0][0] + f[1][1]*m[1][0])%1000000007;
    	temp[1][1] = (f[1][0]*m[0][1] + f[1][1]*m[1][1])%1000000007;
    	return temp;
    }


4.公式求解  时间复杂度O(1)

对,你没看错,斐波那契数列是有求解公式的。其通项公式如下:


所以,任何斐波那契数都可以在O(1)时间内计算出来,但是有一点,因为牵涉到无理数,所以无法保证精度。

具体代码略。


综上,目前代码效率最高也最准确的,是第3种矩阵求解方法,笔试面试时务必掌握。


【完】


版权声明:本文为博主原创文章,未经博主允许不得转载。

斐波那契数列的最优算法(O(logN))

相信大家都对斐波那契数列已经相当的熟悉了,最多两分钟就可以写出来以下时间复杂度为O(N)的代码://递归实现 long long fib(int n) { if (n =1 || n== 2) {...
  • leex_brave
  • leex_brave
  • 2016年05月24日 15:28
  • 3107

斐波那契数列的各种算法实现

斐波那契数列,但凡学过编程的童鞋们应该都懂,背景就不介绍了(就是大兔子生小兔子的故事),无论是面试还是实际的运用,常见的一个思路就是先用最先基本的办法实现,然后根据实际要求,一步步改进,优化算法效率。...
  • woshisap
  • woshisap
  • 2012年05月14日 23:46
  • 20498

Fibonacci 数列及其计算方法

Fibonacci 数列及其计算方法斐波那契数列(Fibonacci sequence),又称黄金分割数列,这个数列最早是由印度数学家提出来的。不过更多的人学习到这个数列是因为意大利数学家列昂纳多·斐...
  • liyuanbhu
  • liyuanbhu
  • 2016年06月17日 23:02
  • 7891

斐波那契数列的递归与循环的算法实现

前半篇转载地址:http://blog.csdn.net/woshisap/article/details/7566946 斐波那契数列,但凡学过编程的童鞋们应该都懂,背景就不介绍了(就是大兔...
  • Micro_Ryan
  • Micro_Ryan
  • 2015年08月22日 09:31
  • 4500

斐波那契算法分析

学习斐波那契数列,原以为
  • duankaifei
  • duankaifei
  • 2014年08月27日 21:59
  • 606

斐波那契数列的三种算法

第一种:递归调用---输出第n项的值 以及前n项中每一个数 代码如下: 当参数过大时,递归调用的性能就大大减弱了,所以不建议使用该方法 第二种:利用数组---输出第n项的值 以及前n项中每一个数...
  • wangqing84411433
  • wangqing84411433
  • 2016年12月17日 11:20
  • 586

斐波那契高效算法(4种算法综合分析)

斐波那契数列问题是算法学习者必然接触到的问题,作为经典问题,首次接触时一般是作为递归算法的案例教程。 然而递归解决斐波那契,其效率低的令人发指,有人算出其时间复杂度为O(2^n)。指数级时间复杂度。...
  • JIEJINQUANIL
  • JIEJINQUANIL
  • 2016年09月03日 11:21
  • 1941

斐波那契数列的算法实现 —— python

斐波那契数列,简单地说,起始两项为0和1,此后的项分别为它的前两项之后。实现方式一: 根据这一特性,可采用最简单的方法计算该项,循环计算每项的值,以下为python实现代码,输出该数列的前num项d...
  • yinyan0103
  • yinyan0103
  • 2015年10月26日 19:05
  • 17136

斐波那契数列递归算法和非递归算法以及其时间复杂度分析

1、在学习数据结构这门课的过程中,发现斐波那契数列的递归算法以及非递归算法,以及其时间复杂度分析是一个小难点。所以特别总结一下。 斐波那契数列的表达式: Fibonacci数列简介: F(1)=1 ...
  • a1456123a
  • a1456123a
  • 2015年10月01日 22:08
  • 18158

算法 - 斐波那契数列

斐波那契数列中每个数都是其两个直接前项的和,其生成规则如下所示:Fn=⎧⎩⎨Fn−1+Fn−210如果n>1如果n=1如果n=0 F_n= \begin{cases} F_{n-1}+F_{n-2}...
  • moilknepho
  • moilknepho
  • 2016年04月04日 20:23
  • 321
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:斐波那契高效算法(4种算法综合分析)
举报原因:
原因补充:

(最多只允许输入30个字)