【发布时间】:2011-04-05 07:26:57
【问题描述】:
我听说动态规划和回溯之间的唯一区别是 DP 允许子问题重叠,例如
fib(n) = fib(n-1) + fib (n-2)
对吗?还有其他区别吗?
另外,我想知道使用这些技术解决的一些常见问题。
【问题讨论】:
我听说动态规划和回溯之间的唯一区别是 DP 允许子问题重叠,例如
fib(n) = fib(n-1) + fib (n-2)
对吗?还有其他区别吗?
另外,我想知道使用这些技术解决的一些常见问题。
【问题讨论】:
动态问题也需要“最优子结构”。
根据维基百科:
动态规划是一种 通过打破来解决复杂的问题 将它们简化为更简单的步骤。它是 适用于表现出的问题 1) 重叠的性质 只是轻微的子问题 更小和 2) 最优子结构。
回溯是一种通用算法 寻找所有(或部分)解决方案 一些计算问题,即 逐步建立候选人 解决方案,并放弃每个部分 候选人 c(“回溯”)尽快 它确定c不可能 完成一个有效的解决方案。
关于“最优子结构”的详细讨论,请阅读the CLRS book。
我能想到的常见回溯问题有:
DP 问题:
【讨论】:
动态规划方法有两种典型的实现方式:自下而上和自上而下。
自上而下的动态规划只不过是普通的递归,通过记忆中间子问题的解决方案来增强。当给定的子问题第二次(第三次、第四次……)出现时,它不是从头开始解决的,而是立即使用先前记忆的解决方案。这种技术以 memoization 的名称而闻名(在 'i' 之前没有 'r')。
这实际上是您的斐波那契数列示例应该说明的内容。只需使用斐波那契数列的递归公式,但在此过程中构建fib(i) 值的表,您将获得针对此问题的自上而下的 DP 算法(例如,如果您需要计算 @987654324 @第二次,你从表中得到它而不是再次计算它)。
在自下而上的动态规划中,该方法也是基于将子解决方案存储在内存中,但它们以不同的顺序(从小到大)求解,并且生成的一般该算法的结构不是递归的。 LCS algorithm 是一个经典的自下而上的 DP 示例。
自下而上的 DP 算法通常更有效,但它们通常更难构建(有时甚至是不可能的),因为预测您需要哪些原始子问题来解决整个问题并不总是那么容易原始问题,以及您必须从小的子问题采取哪条路径才能以最有效的方式获得最终解决方案。
【讨论】:
DP 允许通过将其分解为子问题来解决大型、计算密集型问题,这些子问题的解决方案只需要知道直接的先前解决方案。拿起 Needleman-Wunsch 并解决一个示例,您将获得一个非常好的主意,因为它很容易查看应用程序。
如果已知特定路径不会产生最佳结果,那么在修剪解决方案树的情况下,回溯似乎更加复杂。
因此,可以说回溯优化了内存,因为 DP 假设所有计算都已执行,然后算法返回逐步遍历成本最低的节点。
【讨论】:
另一个区别可能是动态规划问题通常依赖于最优性原理。最优性原则指出,一个最优决策序列或选择每个子序列也必须是最优的。
回溯问题通常不是最优的!它们只能应用于承认部分候选解概念的问题。
【讨论】:
具有边界函数的状态空间树的深度优先节点生成称为回溯。这里当前节点依赖于生成它的节点。
具有记忆功能的状态空间树的深度优先节点生成称为自顶向下动态规划。这里当前节点依赖于它生成的节点。
【讨论】:
我可以用非常简单的一句话说:动态规划是一种解决优化问题的策略。优化问题是关于最小或最大结果(单个结果)。但是在回溯中,我们使用蛮力方法,而不是优化问题。它适用于当您有多个结果并且想要全部或部分结果时。
【讨论】:
假设我们有一棵解树,其叶子是原始问题的解,其非叶子节点是部分问题的次优解。我们尝试遍历解决方案树。
动态规划更像是 BFS:我们发现所有可能的次优解都代表非叶节点,并且只在这些非叶节点下将树增长一层。
回溯更像是 DFS:我们将树生长得尽可能深,如果节点下的解不是我们所期望的,我们会在一个节点处修剪树。
那么从上述理论得出一个推论:动态规划通常比回溯占用更多空间,因为 BFS 通常比 DFS 占用更多空间(O(N) vs O(log N))。事实上,动态规划需要记住上一步中的所有次优解以供以后使用,而回溯则不需要。
【讨论】:
恕我直言,区别非常细微,因为(DP 和 BCKT)都用于探索解决问题的所有可能性。
至于今天,我看到了两个细节:
BCKT 是对问题的强力解决方案。 DP不是蛮力解决方案。因此,您可能会说:DP 比 BCKT 更优化地探索解决方案空间。在实践中,当你想使用 DP 策略解决问题时,建议首先构建一个递归解决方案。嗯,这个递归解也可以认为是 BCKT 解。
有数百种方法可以比蛮力探索“更优化”地探索解决方案空间(欢迎来到优化世界)。 DP 是 DP,因为它的核心是实现数学递归关系,即当前值是过去值的组合(自下而上)。因此,我们可以说,DP 是 DP,因为问题空间满足通过使用递归关系探索其解决方案空间。如果您基于另一个想法探索解决方案空间,那么那将不是 DP 解决方案。与任何问题一样,问题本身可能有助于根据问题结构本身使用一种或另一种优化技术。一些问题的结构可以使用DP优化技术。从这个意义上说,BCKT 更通用,尽管并非所有问题都允许 BCKT。
示例:数独使 BCKT 能够探索其整个解决方案空间。但是,它不允许使用 DP 更有效地探索其解空间,因为在任何地方都没有可以推导出的递归关系。但是,还有其他优化技术可以解决该问题并改进蛮力 BCKT。
示例:只需求经典数学函数的最小值。此问题不允许 BCKT 探索问题的状态空间。
示例:任何可以使用 DP 解决的问题也可以使用 BCKT 解决。从这个意义上说,问题的递归解可以认为是BCKT解。
希望这会有所帮助。
【讨论】: