【问题标题】:Difference between Dynamic Programming and Divide and Conquer动态规划与分而治之的区别
【发布时间】:2013-08-01 06:59:46
【问题描述】:

分而治之和动态规划之间的主要区别是什么?如果我们举个例子,归并排序基本上是通过使用递归的分而治之来解决的。动态编程也基于递归而不是合并排序被认为是动态编程的一个例子?

【问题讨论】:

    标签: algorithm dynamic-programming divide-and-conquer


    【解决方案1】:

    两者的相似之处在于它们都将问题分解为小问题并解决了这些问题。然而,在分治法中,子问题是独立的,而在动态规划中,子问题是相互依赖的。两者都需要以某种方式重新组合子问题,但区别在于子问题是否与(相同“级别”的)其他子问题相关

    D&C 示例:合并排序

    在 Mergesort 中,您将排序分解为许多小的“子排序”,即不是排序 100 个项目,而是排序 50,然后是 25,等等。但是,在将原始项目分解为(例如)4 之后“子排序”,不管你先做什么;顺序无关紧要,因为它们是独立的。重要的是他们最终会完成。因此,每一次,你都会得到一个完全独立的问题,并有自己的正确答案。

    DP 示例:递归斐波那契

    虽然存在子问题,但每个问题都直接构建在另一个问题之上。如果你想要第 10 位,你必须以特定的顺序解决问题(1+2、2+3 等)。因此,它们不是独立的。

    【讨论】:

    • 就像斐波那契数列一样,下一个输出依赖于之前的输出,所以我们称之为依赖序列。但是我们不能在合并排序的情况下这么说吗?就像比较数字然后合并分区时一样?
    • 每一个可以解决的问题,都可以用递归来解决。 D&C 只是递归,您将问题拆分为独立的 peer 子问题。 DP 只是递归,您多次重复使用某些子问题的解决方案。为此,该问题必须具有 2 个属性,称为最优子结构和重叠子问题。
    • @IanPanzica mmm 我不知道我是否称它为封装。也许“继承”是一个恰当的描述(DP继承自D&C)。我不太确定你的问题是什么。如果它“它们必须重叠吗?”,建立在前面的解决方案之上是什么使 DP,DP。我认为这就是您所说的“重叠”。如果它的“DP 和 D&C 一样快吗?”,我会认为它们通常是一样的。这将取决于算法,因为 DP 和 D&C 只是概念,但总的来说它们都可以很快。
    • 下面是我要问的更简洁的陈述:动态编程范式提供的算法解决方案正确地包含分而治之范式提供的算法解决方案。这是真的吗?
    • @IanPanzica 恕我直言,没有。尽管它们是非常相似的过程,但这种细微的差异是很重要的。可能有很多问题可以用这两种方法解决,但它们是不同的(尽管密切相关)概念。
    【解决方案2】:

    当子问题独立时使用 D&C。当递归函数重复相同的递归调用时需要动态编程。

    采用斐波那契递归:f(n)=f(n-1)+f(n-2)

    例如:

    f(8) = f(7) + f(6) = ( f(6) + f(5) ) + f(6)

    如您所见,f(6) 将被计算两次。从递推关系来看,显然重复值太多了。最好记住这些值,而不是一遍又一遍地计算。 dp 中最重要的是记住这些计算值。如果您查看 dp 问题,通常使用数组或矩阵来防止重复计算。

    与dp相比,d&c一般将问题划分为独立的子问题,不需要记忆任何值。

    【讨论】:

      【解决方案3】:

      所以我会说 D&C 是一个更大的概念,而 DP 是一种特殊的 D&C。具体来说,当你发现你的子问题需要共享相同较小子问题的一些计算时,你可能不希望它们一次又一次地计算相同的东西,你缓存中间结果以加快时间,这就是 DP。所以,本质上,我认为 DP 是 D&C 的快速版本。

      【讨论】:

        猜你喜欢
        • 2012-11-12
        • 2012-02-17
        • 2017-02-24
        • 2011-09-03
        • 2015-06-23
        • 2011-04-05
        • 2020-11-20
        • 1970-01-01
        • 2017-04-29
        相关资源
        最近更新 更多