【发布时间】:2011-01-16 00:37:00
【问题描述】:
我想知道分而治之的技术是否总是将一个问题分成相同类型的子问题?通过相同的类型,我的意思是可以使用具有递归的函数来实现它。分治法总能用递归实现吗?
谢谢!
【问题讨论】:
标签: recursion divide-and-conquer
我想知道分而治之的技术是否总是将一个问题分成相同类型的子问题?通过相同的类型,我的意思是可以使用具有递归的函数来实现它。分治法总能用递归实现吗?
谢谢!
【问题讨论】:
标签: recursion divide-and-conquer
“总是”是一个可怕的词,但我想不出不能使用递归的分而治之的情况。根据定义,分治法会产生与初始问题相同形式的子问题——这些子问题会不断分解,直到达到某种基本情况,并且划分的数量与输入的大小相关。递归是这类问题的自然选择。
请参阅Wikipedia article 了解更多信息。
【讨论】:
根据定义,分治算法是一种可以通过递归求解的算法。所以答案是肯定的。
【讨论】:
通常,是的! Merge sort 就是一个例子。这是相同的animated version。
【讨论】:
是的。在分而治之的算法技术中,我们将给定的较大问题划分为较小的子问题。这些较小的子问题必须与较大的问题相似,只是它们的大小更小。
例如,对大小为 N 的数组进行排序的问题与对大小为 N/2 的数组的排序问题没有什么不同。除了后者的问题规模小于前者。
如果较小的子问题与较大的子问题不相似,那么分治法就不能用于解决较大的问题。换句话说,一个给定的问题可以使用分而治之的技术来解决,只有当给定的更大问题可以分成与更大问题相似的更小的子问题。
【讨论】:
对于这个问题,检查归并排序算法就足够了。在了解了使用分而治之(也包括递归)的合并排序算法的实现之后,您将看到如果没有递归实现它会有多困难。
其实这里最重要的是算法的复杂度,用大哦符号和nlogn表示合并排序。
对于归并排序示例,还有另一个版本,称为 自下而上归并排序。它是它的简单且非递归版本。
它比典型系统上的递归、自上而下的归并排序慢约 10%。您可以参考以下链接了解更多信息。第 3 讲解释得很好。
【讨论】:
递归是一种编程方法,您可以在其中根据自身定义函数。该函数通常会通过稍微修改的参数调用自身(为了收敛)。
【讨论】:
想象P 是n 大小的问题,S 是解决方案。在这种情况下,如果P足够大,可以划分为子问题,例如P1,P2,P3,P4,...,Pk;假设有 k 个子问题,并且每个 k 个子问题都会有 k 个解决方案,例如 S1、S2、S3、...、Sk;现在,如果我们将子问题的每个解决方案组合在一起,我们可以得到 S 结果。在分而治之的策略中,主要问题是什么,所有子问题都必须相同。例如,如果P 是排序的,那么P1、P2 和Pn 也必须是排序的。这就是它本质上是递归的。因此,分而治之将是递归的。
【讨论】: