【问题标题】:How to choose the space of optimal substructures for dynamic programming algorithms?动态规划算法如何选择最优子结构的空间?
【发布时间】:2012-09-05 09:55:57
【问题描述】:

我正在阅读 Cormen 等人的 Introduction to Algorithms 的动态编程章节。我试图了解如何表征子问题的空间。他们举了两个动态规划的例子。这两个问题都有一个大小为 n 的输入

  1. 棒材切割问题(最优切割尺寸为n的棒材)
  2. 矩阵括号问题。(括号矩阵乘积 A1 .A2 .A3 ...An 以最佳方式获得最少数量的标量乘法)

对于第一个问题,他们选择一个形式的子问题,在其中进行长度为 k 的切割,假设切割产生的左子问题不能被进一步切割正确的子问题可以进一步切割,从而给我们一个大小为 (n-k) 的子问题。

但是对于第二个问题,选择 Ai...Aj 类型的子问题,其中 1

【问题讨论】:

  • 在切杆问题中,您可以拥有长度 > 1 的第一根杆,因此可以为问题的前半部分假设固定长度(显然您必须计算最优值k)。在矩阵括号问题中,两个子问题都是复合的:你不能只说“我会在这里剪掉,前半部分我们已经完成了”,因为你也需要在前半部分一直用括号括起来。

标签: algorithm recursion dynamic-programming


【解决方案1】:

这是一门艺术。动态规划问题的类型很多,要定义一种方法来计算出我们想要解决子问题的空间维度并不容易。

这取决于子问题如何相互作用,并且很大程度上取决于空间每个维度的大小。

动态编程是描述子问题的缓存或记忆以更有效地解决更大问题的通用术语。但是有很多不同的问题可以通过动态规划以很多不同的方式解决,我无法解释全部,除非你有一个特定的动态规划问题需要解决。

我只能建议在解决问题时尝试:

  • 如果您知道如何解决一个问题,您可以使用类似的技术来解决类似的问题。
  • 尝试不同的方法,并根据每个维度的输入大小估计复杂度的顺序(时间和内存),然后给定每个维度的大小,看看它是否足够快地执行,并且在内存限制内。李>

一些可以描述为动态规划的算法,包括:

【讨论】:

  • 我不是在问动态编程。我了解它的工作原理,但想知道在选择最佳子结构空间时是否有某种经验法则
  • 如果没有关于问题一般性质的更多信息,就无法给出一般的经验法则。这就像集成,每种类型的公式都有不同的规则。
  • @Geek 他写道。这是一门艺术。没有办法定义通用方法。您要求的经验法则如下:“阅读并理解其他人编写的大量解决方案。获得经验。搜索您的问题与您所了解的问题之间的相似性。从著名的动态方法解决方案中窃取想法到知名的问题”。没有别的了:)
【解决方案2】:

Vazirani 关于动态编程的技术说明 http://www.cs.berkeley.edu/~vazirani/algorithms/chap6.pdf 有一些有用的方法可以在给定输入的情况下创建子问题。我在下面的列表中添加了一些其他方法:

  1. 输入 x_1、x_2、..x_n。子问题是 x_1...x_i。

  2. 输入 x_1、x_2....x_n。子问题是 x_i, ...x_j。

  3. 输入 x_1、x_2...x_n 和 y_1、y_2..y_m。子问题是 x_1, x_2, ..x_i 和 y_1, y_2, ..y_j。

  4. 输入是有根树。子问题是有根子树。

  5. 输入是一个矩阵。子问题是与原始矩阵共享一个角的不同长度的子矩阵。

  6. 输入是一个矩阵。子问题是所有可能的子矩阵。

通常使用哪些子问题取决于问题。尝试这些已知的变化,看看哪一个最适合您的需求。

【讨论】:

    猜你喜欢
    • 2016-02-07
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2012-03-26
    相关资源
    最近更新 更多