2012年5月7日---基于斐波那契数列的时间复杂度分析
来源:互联网 发布:js删除所有cookie 编辑:程序博客网 时间:2024/06/10 04:10
在算法中,时间复杂度是衡量一个算法好坏的重要标准。
递归调用在算法中可以非常直观有效的解决我们的问题,但是由于其调用的时候需要花大量的时间,所以我们一般都会刻意的避免使用递归去完成我们的算法。
在这里,我就用斐波那契数列的递归构造和非递归构造来分析递归和非递归的时间复杂度。
先看具体的代码极其运行的时间:
- /*
- * 比较递归和非递归求斐波那契数的时间效率
- * @version 2012/5/7
- * @author akon
- */
- package com.akon405.www;
- public class Fibonacci {
- //递归求斐波那契数列
- public int rFibonacci(int n){
- int x=n;
- if(x<=1){
- return x;
- }
- x=rFibonacci(x-1)+rFibonacci(x-2);
- return x;
- }
- //非递归求斐波那契数列
- public int uRFibonacci(int n){
- int x=1;
- int y=1;
- int tmp;
- for(int i=2;i<n;i++){
- tmp=x;
- x=y;
- y=y+tmp;
- }
- return y;
- }
- public static void main(String[] args) {
- double d1,d2,d3;
- Fibonacci f=new Fibonacci();
- System.out.println("递归求斐波那契数列:");
- d1=System.currentTimeMillis();
- for(int i=1;i<=40;i++){
- System.out.println(f.rFibonacci(i));
- }
- d2=System.currentTimeMillis();
- d3=d2-d1;
- System.out.println("递归求斐波那契数列的时间:"+d3);
- System.out.println("非递归求斐波那契数列:");
- d1=System.currentTimeMillis();
- for(int i=1;i<=40;i++){
- System.out.println(f.uRFibonacci(i));
- }
- d2=System.currentTimeMillis();
- d3=d2-d1;
- System.out.println("非递归求斐波那契数列的时间:"+d3);
- }
- }
- 运算结果:(只保留部分结果)
- <pre name="code" class="java">递归求斐波那契数列:
- 1
- 1
- 2
- 3
- 5
- .
- .
- 102334155
- 递归求斐波那契数列的时间:4322.0
- 非递归求斐波那契数列:
- 1
- 1
- 2
- 3
- 5
- .
- .
- 102334155
- 非递归求斐波那契数列的时间:3.0
- </pre>
- 通过结果就可以大致看出,递归调用的时间是非递归调用的很多倍。并且这种情况在n越大的时候越明显。
在分析算法的时间复杂度的时候,我们也可以得到相同的结果,非递归使用的是for循环,其时间复杂度为O(n)。而递归的时间复杂度则比较复杂,其分析出来为O(2^n)。
这里需要说明的就是,非递归的for循环其时间复杂度O(n)虽然很小,但是其空间复杂度缺比递归调用差得多。因为,for循环在每次循环的时候,都把相应的数值保存下来了,而递归调用却不会保存相应的数值。
0 0
- 2012年5月7日---基于斐波那契数列的时间复杂度分析
- 斐波那契数列时间复杂度分析
- 斐波那契数列算法及时间复杂度分析
- 斐波那契数列时间复杂度分析
- 斐波那契数列算法的三种C#实现及时间复杂度分析
- 二分查找算法,斐波那契数列的递归及非递归。(分析时间复杂度及空间复杂度)
- 斐波那契数列数列的三种时间复杂度的实现方法
- 写出斐波那契数列的递归与迭代代码,并分析时间和空间复杂度。
- 斐波那契数列计算时间复杂度之彻底分析
- 关于斐波那契数列三种解法及时间复杂度分析
- 斐波那契数列递归算法和非递归算法以及其时间复杂度分析
- C语言-斐波那契(Fibonacci)数列三种不同求法时间复杂度分析
- [网易2012年某笔试题] 求斐波那契数列, 要求时间复杂度尽可能小(简单题,不熟悉斐波那契的同学可参考)
- 复杂度分析之斐波那契数列
- 斐波那契数列时间复杂度和通项公式的一些记录
- 斐波那契数列的递归与非递归算法实现及其时间复杂度
- 斐波那契数列的时间复杂度详释与改进方法
- 斐波那契数列的三种解法及时间复杂度
- 2012年4月25日---红黑树的现实和操作
- Java7中的switch支持String的实现细节
- Unity3D调用系统窗口选择本地文件
- 融资租赁业务的基本知识
- 共享池之六:shared pool latch/ library cache latch /lock pin 简介
- 2012年5月7日---基于斐波那契数列的时间复杂度分析
- 算法训练-移动小球
- 喷水装置1
- 配置自己的FileFileAppender
- 2012/5/12---求100以内的质数
- 孙鑫VC++深入详解(5):菜单
- Java设计模式之工厂方法模式
- hibernate.cfg.xml配置文件,连接oracle数据库和mysql 数据库
- 升级ADT22.6后,Android模拟器无法创建