为了账号安全,请及时绑定邮箱和手机立即绑定

为什么这样写显著提升了Fibonacci sequence性能??

为什么这样写显著提升了Fibonacci sequence性能??

jeck猫 2019-03-23 19:15:25
问题来自Algorithms(算法,第四版)的1.1.19练习题。题目如下:在计算机上运行一下程序:public class Fibonacci {    public static long F(int N)  {        if (N == 0)            return 0;        if (N == 1)             return 1;        return F(N-1) + F(N-2);    }    public static void main(String[] args)  {        for (int N = 0; N < 100; N++)            StdOut.println(N + " " + F(N));    }}计算机用这段程序在一小时内能得到的F(N)结果的最大N值是多少?开发F(N)的一个更好的实现,用数组保存已经计算的值。---------题目结束--------------首先我在计算机上(windows8.1 64位系统)运行上面程序,如下:发现用上面题目给出的方法运行到N = 40多时,程序已经明显慢下来了,问题1:慢下来是因为处理的数据太大了,而且每次都要再次计算?还是因为其他什么原因?问题2:题目中要预测计算机在一小时内能够得到F(N)结果的最大N值,这个怎么做?然后在这里提供了题目问题的代码,如下:public class Ex_1_1_19{    public static long F(int N)    {        if (N == 0) return 0;        if (N == 1) return 1;        return F(N-1) + F(N-2);    }    public static long Fib(int N)    {        long[] f = new long[N+1];        return Fib(N, f);    }    public static long Fib(int N, long[] f)    {        if (f[N] == 0)        {            if (N == 1)                f[N] = 1;            else if (N > 1)                f[N] = Fib(N-1, f) + Fib(N-2, f);        }        return f[N];    }    public static void main(String[] args)    {//        for (int N = 0; N < 100; N++)//            StdOut.println(N + " " + F(N));        for (int N = 0; N < 100; N++)            StdOut.println(N + " " + Fib(N));    }}再次运行时,居然在1秒多就运行完了:问题3:很好奇为什么这么快,自己尝试分析下,用N=0,1,2,3试,但是在Fib函数中为什么要if (f[N] == 0)呢?数组最后一个元素为0?是因为用数组 f 保存已经计算过的值了,所以不需要再重新计算了所以才快了很多吗?问题4:最后结果从93行开始,93,95,96,97,99行出现的负数,大致知道是和操作系统运算有关,但又不是很清楚,求解释?
查看完整描述

3 回答

?
MM们

TA贡献1886条经验 获得超2个赞

问题1就是保存了中间结果
问题2我也不肯定,我猜这个运算时间也是斐波那契数列
问题3的f(N)==0是用来判断这个值有没有计算过的,计算过直接调用已保存的结果,没计算过的f(N)是0,就进行if立面的计算
问题4是long长度越界了

查看完整回答
反对 回复 2019-04-15
?
茅侃侃

TA贡献1842条经验 获得超21个赞

保存中间计算结果,避免重复计算


查看完整回答
反对 回复 2019-04-15
  • 3 回答
  • 0 关注
  • 467 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号