划分和征服和递归

时间:2010-02-12 05:02:41

标签: recursion divide-and-conquer

我想知道分而治之的技术是否总是将问题划分为相同类型的子问题?同一类型,我的意思是可以使用递归函数实现它。可以通过递归实现分而治之吗?

谢谢!

8 个答案:

答案 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讲很好地解释了。

https://www.coursera.org/learn/introduction-to-algorithms#

答案 5 :(得分:0)

递归是一种编程方法,您可以根据自身定义函数。该函数通常使用稍微修改的参数调用自身(为了收敛)。

  1. 将问题分为两个或更多个较小的子问题。
  2. 通过解决它们(递归地)来征服子问题。
  3. 将子问题的解决方案合并到原始问题的解决方案中。

答案 6 :(得分:0)

是所有除法和征服总是使用递归来实现。

典型的Divide and Conquer算法使用以下三个步骤解决了问题。

  1. 划分:将给定的问题分解为相同类型的子问题。
  2. 征服:递归解决这些子问题
  3. 合并:恰当地结合答案
  4. Divide And Conquer

    以下是一些标准算法,即Divide和Conquer算法。 1)二进制搜索, 2)快速排序, 3)合并排序, 4)Strassen的算法

答案 7 :(得分:0)

想象P是一个n大小的问题,而S是解决方案。在这种情况下,如果P足够大,可以划分为子问题,例如P1P2P3P4,..., Pk;假设有k个子问题,并且k个子问题中的每一个都有k个解决方案,例如S1S2S3,...,Sk;现在,如果将子问题的每个解决方案组合在一起,我们可以获得S结果。在分治策略中,曾经存在的主要问题是所有子问题都必须相同。例如,如果P是排序的,则P1P2Pn也必须排序。因此,这就是递归的本质。因此,分而治之将是递归的。