zoukankan      html  css  js  c++  java
  • 斐波那契数列的实现算法

    最近在看算法方面的书籍,看到了一个很古老的问题-斐波那契数列,这个题目在大学的时候肯定接触过,我们还在考试中考过,但是只是局限于当时课本上的内容,并没有仔细的考虑过这个题目的实现方法,今天就来小小的探究一下

    最常见的实现算法就是递归,这个问题也是一个很基础的递归算法实现的例子;

    求斐波那契数列第n个元素java代码来实现递归的方法如下:

    public static long FibonacciDemo1(long n) {
            if (n <= 0) return 0;
            if (n == 1) return 1;
    
            return FibonacciDemo1(n - 1) + FibonacciDemo1(n - 2);
    }

    递归方法实现是看起来最简洁的,但是并不是最好的;因为要求第n个元素的数据,就要先求第n-1和第n-2,同理要分别求f(n-2)+f(n-3)和f(n-3)+f(n-4),会存在大量的冗余计算;
    例如要求f(10)的值需要分别做的计算如下:
    在n逐渐增大的同时,运算时间也在指数增加,时间复杂度为O(2^n)

    为了解决这个问题,提高运算效率,可以修改为一下方法

    public static long FibonacciDemo2(long n) {
            if (n <= 0) return 0;
    
            long element1 = 1;
            long element2 = 0;
            long result = 0;
    
            for (int i = 0; i < n; i++) {
                result = element1 + element2;
                element1 = element2;
                element2 = result;
            }
    
            return result;
    }
    虽然不再采用递归方法,并且代码看起来也更加的臃肿,但是在n趋向于大时,运算效率要远远高于递归方法,时间复杂度为
    O(n)
    
    

     面试中,可能面试官并没有要求使用递归来实现一些算法,而我们常用的方法可能会禁锢我们的思维,有时候往往越普通的方法,能起到不一样的作用;但是这还不是最终的解答

    我们来讨论一个时间复杂度为O(logn)的算法解答方法

  • 相关阅读:
    2019-7-29-WPF-元素裁剪-Clip-属性
    2018-2-13-C#-枚举转字符串
    2018-2-13-C#-枚举转字符串
    2018-2-13-WPF-DelegateCommand-出现Specified-cast-is-not-valid
    什么是可串行化MVCC
    年轻就该多尝试,教你20小时Get一项新技能
    初识一周Linux(Ubuntu)我学会了什么
    Red Hat Linux的ftp安装和配置方法
    copy_{to, from}_user()的思考
    自定义注解!绝对是程序员装逼的利器!!
  • 原文地址:https://www.cnblogs.com/spiders/p/9337478.html
Copyright © 2011-2022 走看看