反向跟踪和动态编程之间的区别

时间:2010-08-28 23:43:27

标签: algorithm data-structures

我听说动态编程和反向跟踪之间的唯一区别是DP允许子问题重叠。 (fib(n)= fib(n-1)+ fib(n-2))。这样对吗 ?还有其他差异吗?我也想知道使用这些技术解决的一些常见问题。

8 个答案:

答案 0 :(得分:36)

动态编程方法有两种典型实现:从下到上从上到下

自上而下的动态编程只不过是普通的递归,通过记忆中间子问题的解决方案得到了增强。当给定的子问题出现在第二(第三,第四......)时间时,它不是从头开始解决的,而是立即使用先前记忆的解决方案。这种技术名为 memoization (在'i'之前没有'r')。

这实际上是你的Fibonacci序列的例子应该说明的。只需使用Fibonacci序列的递归公式,但在此过程中构建fib(i)值表,并为此问题获得从上到下的DP算法(例如,如果您需要计算fib(5)第二次,你从表中得到它而不是再次计算它。)

自下而上的动态编程中,该方法也基于将子解决方案存储在内存中,但它们以不同的顺序(从小到大)求解,结果一般算法的结构不是递归的。 LCS algorithm是一个经典的自下而上的DP示例。

自下而上的DP算法通常更有效,但它们通常更难(有时甚至是不可能)构建,因为要预测哪些原始子问题需要解决整个问题并不总是很容易原始问题,以及从小的子问题中获取哪条路径以最有效的方式获得最终解决方案。

答案 1 :(得分:21)

动态问题也需要“最佳子结构”。

根据维基百科:

  

动态编程是一种方法   打破复杂问题   他们进入更简单的步骤。它是   适用于展示的问题   重叠的属性   子问题只是轻微的   更小和最佳的子结构。

     

回溯是一种通用算法   找到所有(或一些)解决方案   一些计算问题,那   逐步建立候选人   解决方案,并放弃每个部分   候选人c(“回溯”)尽快   它确定c不可能   完成有效的解决方案。

有关“最佳子结构”的详细讨论,请阅读the CLRS book

我能想到的回溯的常见问题是:

  1. Eight queen puzzle
  2. Map coloring
  3. Sodoku?
  4. DP问题:

    1. 麻省理工学院的这个website收集了大量的DP问题,并提供了很好的动画解释。
    2. 来自伯克利教授的
    3. A chapter from a book

答案 2 :(得分:5)

DP允许通过将其分解为子问题来解决大型计算密集型问题,其解决方案仅需要了解先前的解决方案。通过选择Needleman-Wunsch并解决样本,您将获得一个非常好的主意,因为它很容易看到应用程序。

在修剪解决方案树的情况下,回溯似乎更复杂,因为已知特定路径不会产生最佳结果。

因此可以说Backtracking优化了内存,因为DP假定所有计算都已执行,然后算法又回到最低成本节点。

答案 3 :(得分:5)

另一个区别可能是动态编程问题通常依赖于最优性原则。最优性原则表明,每个子序列的最佳决策或选择顺序也必须是最优的。

回溯问题通常不是最佳选择!它们只适用于承认部分候选解决方案概念的问题。

答案 4 :(得分:0)

具有边界功能的状态空间树的深度第一节点生成称为回溯。这里当前节点依赖于生成它的节点。

具有记忆功能的深度第一节点生成状态空间树称为自顶向下动态编程。这里当前节点依赖于它生成的节点。

答案 5 :(得分:0)

我可以用一个非常简单的句子说:动态编程是一种解决优化问题的策略。优化问题是关于最小或最大结果(单个结果)。但是在回溯中,我们使用暴力手段,而不是针对优化问题。它用于当您有多个结果并且想要全部或部分结果时。

答案 6 :(得分:0)

说我们有一棵解决方案树,其叶子是原始问题的解决方案,而其非叶子节点是部分问题的次优解决方案。我们尝试遍历解决方案的解决方案树。

动态编程更类似于BFS:我们发现所有可能的次优解决方案都代表了非叶子节点,并且只在这些非叶子节点下将树生长了一层。

回溯更类似于DFS:如果树下的解决方案不是我们期望的,我们将树尽可能深地生长,并在一个节点上修剪树。

然后从上述理论中得出一个推论:动态编程通常比回溯占用更多的空间,因为BFS通常比DFS占用更多的空间(O(N)vs O(log N))。实际上,动态编程需要在上一步中存储所有次优解决方案,以供以后使用,而回溯则不需要。

答案 7 :(得分:0)

恕我直言,差异非常小,因为(DP和BCKT)都用于探索解决问题的所有可能性。

今天,我看到两个子标题:

  1. BCKT是解决问题的蛮力解决方案。 DP不是强力解决方案。因此,您可能会说: DP比BCKT更好地探索了解决方案空间。在实践中,当您想使用DP策略解决问题时,建议首先构建一个递归解决方案。嗯,该递归解决方案也可以视为BCKT解决方案。

  2. 有数百种方法比蛮力探索“更优化”地探索解决方案空间(欢迎来到优化世界)。 DP之所以称为DP,是因为DP的核心是实现数学递归关系,即当前值是过去值(从上到下)的组合。因此,我们可以说DP是DP,因为问题空间可以通过使用递归关系来满足其解决方案空间的需求。如果您基于另一个想法来探索解决方案空间,那么那将不是DP解决方案。如同在任何问题中一样,基于问题结构本身,问题本身可以促进使用一种或多种优化技术。一些问题的结构使得可以使用DP优化技术。从这个意义上讲,BCKT更为通用,尽管并非所有问题都允许BCKT。

示例:Sudoku使BCKT能够探索其整个解决方案空间。但是,它不允许使用DP来更有效地探索其解决方案空间,因为在任何可以导出的地方都没有递归关系。但是,还有其他优化技术可以解决该问题并提高蛮力BCKT。

示例:只需获取经典数学函数的最小值即可。此问题不允许BCKT探索问题的状态空间。

示例:使用DP可以解决的任何问题也可以使用BCKT解决。从这个意义上讲,可以将问题的递归解决方案视为BCKT解决方案。

希望这会有所帮助。

相关问题