动态规划与分治的区别

时间:2013-07-31 16:18:48

标签: algorithm dynamic-programming divide-and-conquer

分而治之和动态编程的主要区别是什么?如果我们举一个例子,合并排序基本上是通过使用递归的分而治之来解决的。动态编程也是基于递归,而不是为什么Merge sort被认为是动态编程的一个例子呢?

3 个答案:

答案 0 :(得分:9)

两者的相似之处在于它们都将问题分解为小问题并解决问题。然而,在分而治之的情况下,子问题是独立的,而在动态编程中,子问题是独立的。两者都需要以某种方式重新组合子问题,但区别在于子问题是否与其他子问题(相同的“级别”)有关

D& C示例: Mergesort

在Mergesort中,你将排序分解为许多小的“子排序”,而不是排序100个项目,你排序50,然后是25,等等。但是,在打破原始之后(例如)4 “分类”,你先做哪个并不重要;订单无关紧要,因为它们是独立的。重要的是他们最终完成了。因此,每次,你都会得到一个完全独立的问题,并有自己正确的答案。

DP示例:递归斐波那契

虽然存在子问题,但每个问题都直接建立在另一个之上。如果你想要第10个数字,你必须按特定的顺序解决问题(1 + 2,2 + 3等)。因此,他们不是独立的。

答案 1 :(得分:0)

当子问题独立时使用D& C.当递归函数重复相同的递归调用时,需要动态编程。

服用斐波那契复发:f(n)= f(n-1)+ f(n-2)

例如:

f(8)= f(7)+ f(6) =(f(6)+ f(5))+ f(6)

如您所见,f(6)将被计算两次。从递归关系来看,显然有太多的重复值。最好记住这些值,而不是一遍又一遍地计算。 dp中最重要的是记住这些计算值。如果你看一下dp问题,通常使用数组或矩阵来防止重复计算。

与dp相比,d& c通常将问题划分为独立的子问题,并且不需要记住任何值。

答案 2 :(得分:0)

所以我会说D& C是一个更大的概念,DP是特殊的D& C。具体来说,当您发现子问题需要共享相同较小子问题的某些计算时,您可能不希望它们一次又一次地计算相同的事情,您将中间结果缓存到加速时间,即DP。所以,基本上,我想,DP是D& C的快速版本。