在面试中,我们经常会被问到动态规划跟分治有什么区别这个问题。它们的基本思想都是把一个大问题划分成子问题,通过子问题的解来得到整体的解。那么它们的区别在哪里呢?总不会没区别吧,不然名字怎么不一样。
区别在于,分治是把问题划分成了互不相交的子问题,再将它们的解组合起来,求出原问题的解。与之相反,动态规划应用于子问题重叠的情况,即不同的子问题具有公共的更小的子问题,而且,动态规划通常会将求到的子问题的解保存起来,从而保证每个子问题只求解一次。在这种情况下,分治算法就会做许多不必要的工作,它会反复求解那些公共的子问题。举个例子,汉诺塔问题是一个典型的动态规划问题,例如我们要求解的问题是f(n),我们会通过f(n-1)的解得到f(n)的解,而f(n)和f(n-1)包含了公共的更小的子问题,例如f(1),f(2),f(3).....例如归并排序是一个典型的分治问题,假如现在要对一个A[1,n]的集合进行排序,那么就需要把这个集合先划分成两个子集A[1,n/2],A[n/2+1,n],然后分别对这两个子集排序,最后合并两个有序的子集,所以我们可以看到,我们在子集里面对一个元素排序之后,还要在合并这些子问题的过程中对这些元素再排一次序,这就是分治会反复求解子问题的例子。
(以上纯属个人观点,如果有不对的地方欢迎批评指正)。