【发布时间】:2016-06-17 05:20:50
【问题描述】:
让我们考虑使用动态规划来实现斐波那契数列。
// Fibonacci Series using Dynamic Programming
class fibonacci
{
static int fib(int n)
{
/* Declare an array to store Fibonacci numbers. */
int f[] = new int[n+1];
int i;
/* 0th and 1st number of the series are 0 and 1*/
f[0] = 0;
f[1] = 1;
for (i = 2; i <= n; i++)
{
/* Add the previous 2 numbers in the series
and store it */
f[i] = f[i-1] + f[i-2];
}
return f[n];
}
public static void main (String args[])
{
int n = 9;
System.out.println(fib(n));
}
}
我们使用动态规划使得递归工作的重复不会发生。但是这里每次调用该函数时,都会生成一个新数组。那么如何说这个算法更优化呢?
【问题讨论】:
-
每次? .我猜每个函数调用都会创建一次数组。假设你想找到第 100 个斐波那契数。所以一个 100 的数组只会被创建一次来存储数字。
-
如果不想每次调用
fib时都创建数组,就不要在fib中创建。 -
另外,添加递归的也会占用 O(n) 空间,因为它会创建一棵树。
-
这是来自 GeeksForGeeks 的解决方案。观察代码的第 6 行。每次为每个单独的函数调用创建一个新数组时
-
“更优化”比什么?这个问题要么是另一个“请写一个高效的 Fib 版本”,要么是要求将使用 O(n) 存储的 Fibonacci 版本与未指定的算法进行比较。
标签: algorithm dynamic-programming