【发布时间】:2015-07-22 09:16:57
【问题描述】:
维基百科这样说动态编程:
在数学、计算机科学、经济学和生物信息学中,动态规划是一种通过将复杂问题分解为一组更简单的子问题来解决复杂问题的方法。它适用于表现出重叠子问题和最优子结构性质的问题。在适用时,该方法比不利用子问题重叠的其他方法(如深度优先搜索)花费的时间要少得多。
也从Introduction to Algorithms (Cormen),我了解到dynamic programming 是一种用于解决repeating computations 具有already been computed once 的方法。通俗地说,
如果你要一次又一次地计算一些东西,最好把它存储在某个地方。
将其应用于斐波那契我可以将其算法编写如下:
arr[3] = {1,1,1} //first two index for computation , last to keep track
fibbDyn(n){
if(n>=1 || a[2]>n ) return n; // return on base conditions
else {
res = arr[0] + fibbDyn(n-1);
arr[0]=arr[1];
arr[1]=res;
arr[2]+=1; // increment value by 1
return res;
}
}
虽然我相信这个算法遵循动态规划的例子,因为它减少了在 原始递归 fibbonaci 版本中完成的额外计算:
fibb(n){
if (n>=1)return n;
else return fibb(n-1) + fibb(n-2);
}
由于在每个递归步骤 else return fibb(n-1) + fibb(n-2) 有两个单独的调用,因此这里重复了许多计算。
迭代解决方案可能如下所示:
int FibonacciIterative(int n)
{
if (n == 0) return 0;
if (n == 1) return 1;
int prevPrev = 0;
int prev = 1;
int result = 0;
for (int i = 2; i <= n; i++)
{
result = prev + prevPrev;
prevPrev = prev;
prev = result;
}
return result;
}
所以我的问题是,斐波那契问题的迭代解决方案会被归类为动态规划吗?
我不同意的理由是,迭代解决方案不会展示Overlapping subproblems,例如递归解决方案正在展示。在迭代解决方案中,不会进行冗余和重复计算,因此不应将其包含在动态规划中。
相关文章:optimal substructure,overlapping subproblems, dynamic programming.
【问题讨论】:
-
我也不是在征求意见,而不是强烈的主观答案,因此它遵循 SO 准则。在投票之前发表评论说明任何问题:)