动态规划:为什么需要最优的子结构

时间:2015-01-04 17:42:38

标签: algorithm dynamic-programming

我正在Dynamic Programming重新审视我的笔记。它基本上是一种记忆递归技术,它将解决方案存储到较小的子问题中,以便以后在计算解决方案时重用到相对较大的子问题。

我的问题是,为了将DP应用于递归问题,它必须具有最佳子结构。这基本上需要对问题的最佳解决方案包含对子问题的最佳解决方案。

否则可能吗?我的意思是你见过一个问题的最佳解决方案不包含子问题的最佳解决方案的情况。

如果你想加深我的理解,请分享一些例子。

6 个答案:

答案 0 :(得分:18)

动态规划中 给定问题具有最佳子结构属性,如果可以通过使用其子问题的最优解来获得给定问题的最优解。

例如,最短路径问题具有以下最优子结构属性:如果节点X位于从源节点U到目标节点V的最短路径中,则从U到V的最短路径是组合从U到X的最短路径和从X到V的最短路径。

但是最长路径问题没有最佳子结构属性。 即两个节点之间的最长路径不必是节点之间的最长路径。

例如,最长路径q-> r-> t不是从q到r的最长路径和从r到t的最长路径的组合,因为q的最长路径r是q-> s-> t-> r。

enter image description here

所以这里:问题的最佳解决方案不包含子问题的最佳解决方案。

有关详细信息,请阅读

  1. Longest path problem from wikipedia
  2. Optimal substructure from wikipedia

答案 1 :(得分:5)

据我所知,这种“最佳子结构”属性不仅对动态规划是必要的,而且首先要获得解决方案的递归公式。请注意,除Dynamic Programming上的维基百科文章外,还有一篇关于optimal substructure属性的单独文章。为了使事情更加复杂,还有一篇关于Bellman equation的文章。

答案 2 :(得分:5)

你的定义是不精确的,这是完全正确的。 DP是一种获取算法加速的技术,而不是算法本身。术语“最佳子结构”是一个模糊的概念。 (你又来了!)也就是说,每个循环都可以表示为一个递归函数:每次迭代都会解决连续函数的子问题。每个算法都有一个DP循环吗?显然不是。

“最佳子结构”和“重叠子问题”的实际含义是,子问题结果通常足以降低解决方案的渐近复杂度。换句话说,记忆是有用的!在大多数情况下,细微暗示是从指数到多项式时间的减少,O(n ^ k)到O(n ^ p),p

Ex:密集图中两个节点之间存在指数路径。 DP找到最短路径只查看它们的多项式数,因为备忘录在这种情况下非常有用。

另一方面,旅行推销员可以表示为记忆功能(例如,见this discussion),其中备忘录导致保存O((1/2)^ n)因子的时间。但是,通过n个城市的TS路径的数量是O(n!)。这是如此之大,以至于渐近运行时间仍然是超指数的:O(n!)/ O(2 ^ n)= O(n!)。这种算法通常不称为动态程序,即使它遵循与最短路径的DP非常相同的模式。显然它只是一个DP,如果它给出了一个很好的结果!

答案 3 :(得分:3)

你可以解决旅行商问题,在每一步选择最近的城市,但这是错误的方法。

答案 4 :(得分:0)

整个想法是将问题缩小到相对较小的候选者中以获得最佳解决方案,并使用“蛮力”来解决问题。

因此,更小的子问题的解决方案应该足以解决更大的问题。

这是通过递归表示的,作为较小子问题的最优解的函数。

回答这个问题:

  

否则可能吗?我的意思是你见过一个案例   问题的最佳解决方案不包含最佳解决方案   子问题。

不,这是不可能的,甚至可以证明。

答案 5 :(得分:0)

您可以尝试对任何递归问题实施动态编程,但如果它没有最佳的子结构属性,则不会得到任何更好的结果。换句话说,动态编程方法对于没有最佳子结构属性的问题没有用。