【问题标题】:divide and conquer and recursion分治与递归
【发布时间】:2011-01-16 00:37:00
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: recursion divide-and-conquer


    【解决方案1】:

    “总是”是一个可怕的词,但我想不出不能使用递归的分而治之的情况。根据定义,分治法会产生与初始问题相同形式的子问题——这些子问题会不断分解,直到达到某种基本情况,并且划分的数量与输入的大小相关。递归是这类问题的自然选择。

    请参阅Wikipedia article 了解更多信息。

    【讨论】:

    • 并且递归问题总是可以使用迭代方法编写,反之亦然,因此不需要仅使用递归方法编写分治法,尾递归与迭代一样有效解决问题的方法。
    • 函数递归很可能会导致 StackOverflow 错误(是的,站点名称 ;-))。因此,应该使用 FIFO 循环,其中函数的逻辑将附加任何新问题(而不是再次调用 self)。
    【解决方案2】:

    根据定义,分治算法是一种可以通过递归求解的算法。所以答案是肯定的。

    【讨论】:

      【解决方案3】:

      通常,是的! Merge sort 就是一个例子。这是相同的animated version

      【讨论】:

        【解决方案4】:

        是的。在分而治之的算法技术中,我们将给定的较大问题划分为较小的子问题。这些较小的子问题必须与较大的问题相似,只是它们的大小更小。

        例如,对大小为 N 的数组进行排序的问题与对大小为 N/2 的数组的排序问题没有什么不同。除了后者的问题规模小于前者。

        如果较小的子问题与较大的子问题不相似,那么分治法就不能用于解决较大的问题。换句话说,一个给定的问题可以使用分而治之的技术来解决,只有当给定的更大问题可以分成与更大问题相似的更小的子问题。

        【讨论】:

          【解决方案5】:

          对于这个问题,检查归并排序算法就足够了。在了解了使用分而治之(也包括递归)的合并排序算法的实现之后,您将看到如果没有递归实现它会有多困难。

          其实这里最重要的是算法的复杂度,用大哦符号和nlogn表示合并排序。

          对于归并排序示例,还有另一个版本,称为 自下而上归并排序。它是它的简单且非递归版本。

          它比典型系统上的递归、自上而下的归并排序慢约 10%。您可以参考以下链接了解更多信息。第 3 讲解释得很好。

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

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              【解决方案7】:

              是的,所有分而治之总是使用递归来实现。

              典型的分治算法使用以下三个步骤解决问题。

              1. 划分:将给定问题分解为相同类型的子问题。
              2. 征服:递归解决这些子问题
              3. 组合:适当组合答案

              以下是一些标准算法,即分而治之的算法。 1)二分查找, 2)快速排序, 3)合并排序, 4) 施特拉森算法

              【讨论】:

              • D&C 必须“总是使用递归来实现”是不正确的。从您自己的示例来看,二分搜索是我们无需递归即可轻松实现的东西。
              【解决方案8】:

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

              【讨论】:

                猜你喜欢
                • 2012-02-25
                • 1970-01-01
                • 1970-01-01
                • 2021-05-11
                • 2011-12-06
                • 2014-04-21
                • 1970-01-01
                • 2021-03-14
                • 2020-09-21
                相关资源
                最近更新 更多