我想知道分而治之的技术是否总是将问题划分为相同类型的子问题?同一类型,我的意思是可以使用递归函数实现它。可以通过递归实现分而治之吗?
谢谢!
答案 0 :(得分:13)
“永远”是一个可怕的词,但我想不出你不能使用递归的分而治之的情况。根据定义,分而治之创造了与初始问题相同形式的子问题 - 这些子问题不断被分解,直到达到某种基本情况,并且分割数量与输入的大小相关。递归是解决这类问题的自然选择。
有关更多信息,请参阅Wikipedia article。
答案 1 :(得分:6)
根据定义,分而治之算法可以通过递归来解决。所以答案是肯定的。
答案 2 :(得分:1)
通常,是的! Merge sort就是一个例子。这是同一个animated version。
答案 3 :(得分:1)
是。在分而治之的算法技术中,我们将给定的更大问题分成更小的子问题。这些较小的子问题必须与较大的问题相似,只是它们的尺寸较小。
例如,排序大小为N的数组的问题与排序大小为N / 2的数组的问题没有什么不同。除了后者的问题规模小于前者。
如果较小的子问题与较大的子问题不相似,则分而治之技术不能用于解决更大的问题。换句话说,只有当给定的较大问题可以分成较小的子问题时才能使用分而治之技术来解决给定问题。
答案 4 :(得分:1)
检查合并排序算法对于这个问题就足够了。在理解了具有分而治之(也是递归)的合并排序算法的实现之后,您将看到在没有递归的情况下实现它是多么困难。
实际上,最重要的是算法的复杂性,用big-oh表示法和nlogn表示合并排序。
对于mergesort exapmle,还有另一个名为自下而上合并排序的版本。它是简单且非递归的版本。
它比典型系统上的递归,自上而下的mergesort慢约10%。您可以参考以下链接获取更多信息。第3讲很好地解释了。
答案 5 :(得分:0)
递归是一种编程方法,您可以根据自身定义函数。该函数通常使用稍微修改的参数调用自身(为了收敛)。
答案 6 :(得分:0)
是所有除法和征服总是使用递归来实现。
典型的Divide and Conquer算法使用以下三个步骤解决了问题。
答案 7 :(得分:0)
想象P
是一个n
大小的问题,而S
是解决方案。在这种情况下,如果P
足够大,可以划分为子问题,例如P1
,P2
,P3
,P4
,..., Pk
;假设有k个子问题,并且k个子问题中的每一个都有k个解决方案,例如S1
,S2
,S3
,...,Sk
;现在,如果将子问题的每个解决方案组合在一起,我们可以获得S结果。在分治策略中,曾经存在的主要问题是所有子问题都必须相同。例如,如果P
是排序的,则P1
,P2
和Pn
也必须排序。因此,这就是递归的本质。因此,分而治之将是递归的。