【问题标题】:how much time will fibonacci series will take to compute?计算斐波那契数列需要多少时间?
【发布时间】:2014-12-16 05:58:11
【问题描述】:

我已经通过应用蛮力技术创建了递归调用树,但是当我给这个算法 100 个值时,它需要数万亿年的时间来计算..

你们建议我做的事情是通过给出 100 个值来快速运行

这是我到目前为止所做的

function fib(n) {
    if (n =< 1) {
      return n;
    } else {
        return fib(n - 1) + fib(n - 2);
    }
}

【问题讨论】:

  • “万亿年” - 你的意见是什么?
  • 有高效的算法来计算斐波那契数。您需要做的就是在询问之前先谷歌一下。
  • 记忆技术也很有用。

标签: time-complexity pseudocode fibonacci


【解决方案1】:

您可以有一个“缓存”,在其中保存已计算的斐波那契数。每次尝试计算时

fib(n-1) /* or */ fib(n-2) ;

您将首先查看已计算出的数字数组。如果它在那里,您将节省大量时间。 因此,每次计算斐波那契数时,请将其保存到数组或列表中的相应索引处。

function fib(n) 
{

if (n =< 1) 
{
  return n;
}
if(fiboList[n] != defaultValue)
{
  return fiboList[n];
}
else 
{
    int fibo = fib(n-1) + fib(n-2);
    fiboList[n] = fibo;
    return fibo;
}

}

【讨论】:

  • 这里的默认值是什么意思
  • 无论你选择什么,例如,它可能是-1。
  • 这个想法是您创建一个数组,并使用默认值初始化该数组中的每个数字,例如 -1。因此,如果 array[n] 为 -1,则您知道尚未计算特定的斐波那契数。如果你在 array[n] 找到不同的值,那是 fibo[n] 的结果,所以你不必走所有的递归方式。
【解决方案2】:

你也可以用循环来做:

int a = 1;
int b = 1;
for(int i = 2; i < 100; i++){
    int temp = a + b;
    a = b;
    b = temp;
}
System.out.println("Fib 100 is: "+b);

运行时是线性的,避免了递归调用带来的开销。

编辑:请注意结果是错误的。由于 Fib(100) 比 Integer.MAX_VALUE 大,您必须使用 BigInteger 或类似方法才能获得正确的输出,但“逻辑”将保持不变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 2020-01-18
    • 2017-07-22
    • 2013-08-12
    • 1970-01-01
    相关资源
    最近更新 更多