关闭

从斐波那契数列窥探动态规划

标签: 动态规划分治法
449人阅读 评论(0) 收藏 举报
分类:

利用动态规划求解斐波那契数列

public class Fibonacci 
{
	static int f[]=new int[100];
	static long startTime=0;
	public static void init()
	{
		for(int i=0;i<f.length;i++)
			f[i]=-1;
	}
	public static void main(String[] args)
	{
		init();
		
		startTime=System.currentTimeMillis();
		fibonacci(40);
		System.out.println("time:"+(System.currentTimeMillis()-startTime));
		
		fibonacci2(40);
		
		startTime=System.currentTimeMillis();
		System.out.println(fibonacci3(40));
		System.out.println("time:"+(System.currentTimeMillis()-startTime));
	}
	static int fibonacci(int i) //递归是一种自上而下的动态规划。
	{
		if(i==0)
		{
			return 0;
		}
		else if(i==1)
		{
			return 1;
		}
		else 
		{
			return fibonacci(i-1)+fibonacci(i-2);
		}
	}
	static int fibonacci2(int n) //一般的动态规划,就是这种自下而上的动态规划
	{
		int[] array=new int[n+1];
		array[0]=0;
		array[1]=1;
		long startTime=System.currentTimeMillis();
		for(int i=2;i<n+1;i++){
			array[i]=array[i-1]+array[i-2];
		}
		for(int i=1;i<n+1;i++){
			System.out.print(array[i]+"  ");
		}
		System.out.println();
		System.out.println("time:"+(System.currentTimeMillis()-startTime));
		return array[40];
	}
	static int fibonacci3(int n)  //备忘录法,跟自顶向下的动态规划递归是一样的,不同的是备忘录法利用了一个数组来记录每个子问题的解,从而避免重复求解,将问题简化。
	{
			if(f[n]>=0)
				return f[n];
			if(n == 0)
			{
				f[0] = 0;
				return f[0];
			}
			if(n == 1)
			{
				f[1] = 1;
				return f[1];
			}
			f[n] = fibonacci3(n-1) + fibonacci3(n-2);
			return f[n];
	}
}

结果如下:

time:545
1  1  2  3  5  8  13  21  34  55  89  144  233  377  610  987  1597  2584  4181  6765  10946  17711  28657  46368  75025  121393  196418  317811  514229  832040  1346269  2178309  3524578  5702887  9227465  14930352  24157817  39088169  63245986  102334155  
time:0
102334155
time:0

相比较:备忘录法和自下向上的动态规划效率差不多,而自顶向下的递归则效率很慢。是以空间换时间的做法。

动态规划分为三种:自上而下有两种,备忘录法和递归。自下而上有一种,就是一般我们所使用的。

而备忘录和递归不同,备忘录法利用了一个额外数组来存储,计算过程中子问题的解,从而避免了递归方法中重复求解子问题的问题。

除了以上几种方法外还有求通项公式的方法直接得出F(n)=(1/√5)*{[(1+√5)/2]^n - [(1-√5)/2]^n}。求解更快速,但这是利用数学的方法,编程时不支持这样做。

结论:

动态规划求解的问题的一般要具有3个性质:

(1) 最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。

(2) 无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。

(3) 有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。(该性质并不是动态规划适用的必要条件,但是如果没有这条性质,动态规划算法同其他算法相比就不具备优势



0
0
查看评论

求解斐波那契数列的动态规划方法

这篇文章主要介绍了用递归的方法和用动态规划的方法解决斐波那契数列的差别。
  • u012991190
  • u012991190
  • 2016-03-24 15:32
  • 2129

每周一刷——从斐波那契数列到动态规划

在csdn上看到一篇博客,博客的内容有有关图像方面的paper,有有关机器学习的理论推导和python实践,文风简洁而不拖沓,非常喜欢,仿佛找到了同类,翻到“about me”以及一些求职的博文,方向选择之困惑,在求学期间学习方法之反思(实践、实践、还是实践)。仿佛看到了自己,看到了自己的明天,这位...
  • lanchunhui
  • lanchunhui
  • 2015-10-12 20:10
  • 2543

动态规划的方法求解斐波那契数列

参考http://www.xuebuyuan.com/2068492.html 如果一个递归算法需要对相同的子问题进行多次重复计算,那么我们通常可以采用动态规划对其进行优化。 动态规划的具体实现可以分为两类:一类是自顶向下的备忘录方法(制表或者记忆),增加一个子问题解的记录,每当需要用到一个子问题的...
  • u011499425
  • u011499425
  • 2016-09-29 22:42
  • 682

算法——动态规划篇——斐波那契数列

动态规划求解斐波那契数列,与常规的递归方式求解的比较,动态规划空间换时间,不重复求解,效率很高。。。
  • xxx823952375
  • xxx823952375
  • 2014-05-20 09:53
  • 2523

动态规划入门之求解斐波那契数列

动态规划入门之求解斐波那契数列斐波那契数列,除了可以用跟递归方法来处理,还可以使用动态规划方法(DP)来求解。区别在于,如果使用动态规划方法,中间结果要“缓存”起来,以备后续使用,就可以将时间复杂度优化为O(N)。具体做法就是将每次调用fibonacci(i)的结果“缓存”起来。在普通电脑上,递归版...
  • yanglr2010
  • yanglr2010
  • 2016-10-17 20:18
  • 832

斐波那契数列3种解法(朴素递归、动态规划、数学归纳)及算法分析

本文来自网易公开课的第3讲分治法。让我对分治法的使用有了一个新的认识。今天论述的主要对象是斐波那契数列,先了解一下什么是斐波那契数列。 斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,...
  • u011638883
  • u011638883
  • 2013-11-28 15:41
  • 5200

斐波那契数列(一)--对比递归与动态规划(JAVA)

兔子繁殖问题: 这是一个有趣的古典数学问题,著名意大利数学家Fibonacci曾提出一个问题:有一对小兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。按此规律,假设没有兔子死亡,第一个月有一对刚出生的小兔子,问第n个月有多少对兔子? 相信上面的题目稍微有点经验...
  • qq_39630587
  • qq_39630587
  • 2017-12-19 21:30
  • 48

斐波那契数列时间复杂度和通项公式的一些记录

真没啥好说的QAQ。但是前阵子公司的技术BOSS和咱纠结这个数列的一些问题,于是我只好记录一下一些东西,表示自己还是学到了一点东西滴~        话说真查便发现这玩意鼎鼎大名无处不在,反正我高数不好大部分看不懂,就觉得不明觉厉……   ...
  • woodenhouse
  • woodenhouse
  • 2012-10-08 19:52
  • 2719

动态规划8:斐波那契数列

动态规划8:斐波那契数列
  • qq_27703417
  • qq_27703417
  • 2017-05-04 15:41
  • 253

安全入门之一之局域网窥探

摘要 为什么会出现所谓的msn/QQ sniffer[1][2],为什么一台机器能捕获其它机器的信息。 这些现象让大多数不懂网络的人感到困惑,也感到害怕,因为个人隐私可能 被某些不良人员(包括很多只是好奇的人)所利用,更严重的是一些信息可以 被利用来作出更大的危害,那么我们来了解下这其中的原理,以及...
  • luohui925
  • luohui925
  • 2007-08-02 10:48
  • 639
    个人资料
    • 访问:102864次
    • 积分:1948
    • 等级:
    • 排名:千里之外
    • 原创:93篇
    • 转载:43篇
    • 译文:0篇
    • 评论:8条
    最新评论