【问题标题】:Dynamic Programming : Why the need for optimal sub structure动态规划:为什么需要最优子结构
【发布时间】:2015-03-02 08:02:20
【问题描述】:

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

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

还有可能吗?我的意思是你有没有见过问题的最优解不包含子问题的最优解的情况。

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

【问题讨论】:

  • “问题的最优解不包含子问题的最优解的情况” 这是事物的默认状态。通常有必要选择子问题最优性的定义才能使 DP 起作用——因此,我不确定您的其他问题是否真的能以令人满意的方式回答。

标签: algorithm dynamic-programming


【解决方案1】:

据我了解,这种“最佳子结构”属性不仅对于动态编程是必要的,而且对于首先获得解决方案的递归公式也是必要的。请注意,除了关于 Dynamic Programming 的 Wikipedia 文章之外,还有一篇关于 optimal substructure 属性的单独文章。为了让事情更复杂,还有一篇关于Bellman equation的文章。

【讨论】:

  • 我不认为这种说法是正确的。除了寻找最优解之外,递归还可以应用于许多其他问题。反过来说是对的,任何用动态规划解决的问题都可以用递归解决,但复杂度可能很高
  • 我部分同意,但这是有争议的。有些人认为斐波那契数列的评估或二项式系数的计算不是动态规划,因为它们不是优化问题。不过,我不同意这种观点。
【解决方案2】:

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

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

例如:密集图中的两个节点之间的路径数量呈指数级增长。 DP 仅查看其中的多项式即可找到最短路径,因为备忘录在这种情况下非常有用。

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

【讨论】:

    【解决方案3】:

    您可以尝试对任何递归问题进行动态规划,但如果它没有最优的子结构属性,您将不会得到任何更好的结果。换句话说,动态规划方法对于在没有最优子结构属性的问题上实现是没有用的。

    【讨论】:

      【解决方案4】:

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

      所以最好是较小的子问题的解决方案应该足以解决较大的问题。

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

      回答这个问题:

      还有可能吗?我的意思是你有没有见过这样的案例 问题的最优解不包含最优解 子问题。

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

      【讨论】:

        【解决方案5】:

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

        例如最短路径问题具有以下最优子结构性质: 如果一个节点 X 位于从源节点 U 到目的节点 V 的最短路径上,那么从 U 到 V 的最短路径是组合从 U 到 X 的最短路径和从 X 到 V 的最短路径。

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

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

        所以这里:问题的最优解不包含子问题的最优解。

        更多详情可以阅读

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

        【讨论】:

        • 最短路径与最长路径是一个很好的例子。然而,正如其他人所观察到的,这取决于如何定义子问题:如果我们选择将最短路径问题分解为“任意两个给定节点 u 和 v 之间的最短路径是什么?”形式的子问题,那么最短路径问题会为我们提供最优子结构。 ,而最长的路径没有。但是如果我们选择问“两个给定节点 u 和 v 之间的最长路径是什么,它只使用给定集合 X 中的节点?”,这个分解给出我们是最优子结构——但它需要指数级的子问题。
        • 具体来说,这是一个 DP-ready 递归,用于查找 u 和 v 之间的最长路径,它仅使用 X 中的节点:L(u, v, X) = the max, over all x in X, of (the max, over all subsets Y of X that contain both u and x, of (L(u, x, Y) + L(y, v, X-Y+{x})))
        • 是的,非常周到,确实必须在 u 到 v 之间包含一个节点 z(让我们只取节点而不是设置),当问题将分为寻找从 u 到 z 的最长路径时,会将这个问题转换为最优子结构和 z 到 v,但该路径仍然不必是 u 到 v 之间的最长路径。因此,为了在这个问题中有效地引入最优子结构,我们需要强制节点。
        • @UmeshMishra 您不应该为您使用的示例提供参考吗? :D
        【解决方案6】:

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

        【讨论】:

        • TSP 实际上有一个“最优子结构”:令 G(V,E) 是一个(完全)图,S ∈ V。TSP(G,S) = min(TSP(G', S')) 其中 S' ∈ V, S' ≠ S 且 G' = G - S)。问题是要存储每个“内部变量”,您需要 n!空间:)
        • 更准确地说,这取决于方法。据我了解,最优子结构在问题中并不是真正固有的,而是取决于公式。显然,主要问题是找到具有最佳子结构的问题的合适建模。
        • @greybeard 怎么样?此外,每个计算都必须执行一次这一事实意味着 n!时间复杂度也是如此(这不足为奇)。
        • @Rerito 在我看来,最佳子结构具有新数据不会取消先前计算的特性。假设在计算 Levenshtein 距离时,字符串末尾的新字符不会取消字符串开头的计算结果。在 TSP 新边缘可以完全取消之前的最短路径。否则 TSP 将通过动态规划来解决。
        • @Codor 我同意。最优的子结构可能并不明显。
        猜你喜欢
        • 2016-02-07
        • 1970-01-01
        • 1970-01-01
        • 2012-11-24
        • 2018-03-17
        • 1970-01-01
        • 2014-09-09
        • 2018-04-22
        • 2021-01-23
        相关资源
        最近更新 更多