fibonacci数列的不同实现方法对比(java)
来源:互联网 发布:数据结构与算法笔记 编辑:程序博客网 时间:2024/05/14 07:31
最近开始学习算法导论相关知识,了解到Fibonacci数列的不同实现,所以用java语言实现并进行测试,发现矩阵方式和从下向上计算(f(0),f(1),…, f(n))性能远远高于递归方式。
备注:可能代码质量不高,主要为了说明问题。其中没有对输入的Number采用更严谨的验证。
package com.demo;import java.util.Date;public class FibonacciNumbers { /** * @param number * 最简单的递归调用,复杂度a^n,a为黄金分割点 * @return */ public static long Fibonacci(int number) { if (number == 0) return 0; if (number == 1) return 1; if (number >= 2) return Fibonacci(number - 1) + Fibonacci(number - 2); return -1; } /** * @param number * 时间复杂度为O(n) bottom algorithm * compute F(0), F(1), ..., F(N) * @return */ public static long Fibonacci2(int number) { long[] result = new long[number + 1]; if (number == 0) return 0; if (number == 1) return 1; if (number >= 2) { result[0] = 0; result[1] = 1; for (int i = 2; i <= number; i++) { result[i] = result[i - 1] + result[i - 2]; } } return result[number]; } /** * @param number >= 1 * 时间复杂度为O(logn) * thm:[f(n+1), f(n); f(n), f(n-1)] = [1, 1; 1 0]^n * @return */// private static long[][] prime = {{1, 1} ,{1, 0}}; public static long Fibonacci3(int number) { Element result = FibonacciKernel(number); if ( result != null) { return result.b; } return -1; } public static Element FibonacciKernel(int number) { if (number == 1) { return new Element(1,1,1,0); } if (number >= 2) { if (number % 2 == 0) { Element e = FibonacciKernel(number/2); // 为了访问方便,设置为共有属性 long a = e.a*e.a + e.b*e.c; long b = e.a*e.b + e.b*e.d; long c = e.c*e.a + e.d*e.c; long d = e.c*e.b + e.d*e.d; return new Element(a, b, c, d); } else { Element e = FibonacciKernel((number-1)/2); long a = e.a*e.a + e.b*e.c; long b = e.a*e.b + e.b*e.d; long c = e.c*e.a + e.d*e.c; long d = e.c*e.b + e.d*e.d; // e*e*prime[1, 1; 1 0] return new Element(a+b, a, c+d, c); } } return null; } public static void main(String[] args) { Date d1 = new Date(); System.out.println("45的递归算法结果: " + Fibonacci(45)); Date d2 = new Date(); System.out.println("总共消耗" + (d2.getTime() - d1.getTime()) + "ms"); System.out.println("45的非递归算法结果: " + Fibonacci2(45)); Date d3 = new Date(); System.out.println("总共消耗" + (d3.getTime() - d2.getTime()) + "ms"); System.out.println("45的矩阵方式计算结果: " + Fibonacci3(45)); Date d4 = new Date(); System.out.println("总共消耗" + (d4.getTime() - d3.getTime()) + "ms"); }}class Element { long a; long b; long c; long d; public Element(long a, long b, long c, long d) { this.a = a; this.b = b; this.c = c; this.d = d; } public Element() { }}
经过测试:
45的递归算法结果: 1134903170总共消耗19591ms45的非递归算法结果: 1134903170总共消耗0ms45的矩阵方式计算结果: 1134903170总共消耗0ms
发现后两种方式结果一样,但是理论上矩阵方式还是比非递归方式性能更高。
0 0
- fibonacci数列的不同实现方法对比(java)
- Fibonacci数列实现的几种方法(java实现)
- Fibonacci数列几种不同的编程实现方法
- fibonacci数列 java实现
- Fibonacci数列的非递归实现(Java版)
- Fibonacci数列的实现
- Fibonacci数列的实现
- 斐波拉契数列(Fibonacci)的Python实现
- Java代码实现Fibonacci数列
- 求fibonacci数列第100项的值(Java实现)
- java中著名的Fibonacci数列的实现及Java中的一维数组实现著名的Fibonacci数列。
- 多种方法实现Fibonacci(斐波那契)数列的生成
- 第十九题(最快的方法求Fibonacci数列)
- 蓝桥杯:Fibonacci数列【JAVA算法实现】
- Fibonacci(斐波那契数列)的实现
- 探索Fibonacci数列的最佳求解方法
- fibonacci数列的Python表示方法
- 计算fibonacci数列 - 递归和迭代的效率对比
- c# winform通过本地WebService接口访问SQL数据库实例
- uboot之Makefile编译过程详解
- 高性能计算
- python程序1(生成可重复或不可重复随机字符串、生成多个文件夹和文件,并将生成的字符串写入文件中)
- strstr源码学习,面试用得到
- fibonacci数列的不同实现方法对比(java)
- Android 工具下载集合
- impala数据导入汇总
- 牛客---特殊排序
- Spring @Configuration用annotation装配spring
- spring3+struts2+mybatis3框架整合
- 求有向网中任意一对顶点之间的最短路径 Floyd算法
- 巴斯光年探险阿里聚安全攻防挑战赛!决战12月28日!
- SSL JudgeOnline 1082——导弹拦截