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