为啥归并排序不是动态编程

Posted

技术标签:

【中文标题】为啥归并排序不是动态编程【英文标题】:Why mergesort is not Dynamic programming为什么归并排序不是动态编程 【发布时间】:2013-03-13 20:17:39 【问题描述】:

我读过这些话:

为了使动态规划适用,问题必须具有两个关键属性:最优子结构和重叠子问题。如果可以通过组合非重叠子问题的最优解来解决问题,则该策略称为“分而治之”。这就是为什么归并排序和快速排序不属于动态规划问题。

我有 3 个问题:

    为什么mergesort和quicksort不是动态规划? 我认为合并排序也可以划分小问题和小问题然后做同样的事情等等。 Dijkstra 算法是否使用动态算法? 是否有使用动态规划的应用示例?

【问题讨论】:

“应用程序”是什么意思 【参考方案1】:

    这里的关键词是“重叠子问题”和“最优子结构”。当您执行快速排序或合并排序时,您会递归地将数组分解为不重叠的较小部分。在任何给定的递归级别期间,您永远不会对原始数组的相同元素进行两次操作。这意味着没有机会重复使用以前的计算。另一方面,许多问题确实涉及在重叠子集上执行相同的计算,并且具有有用的特性,即在计算更大问题的最优解时可以重复使用子问题的最优解。

    李>

    Dijkstra 算法是动态规划的经典示例,因为它重新使用先前的计算来发现两个节点 A 和 Z 之间的最短路径。假设 A 的直接邻居是 B 和 C。我们可以找到最短的通过将 A 和 B 之间的距离与我们计算的从 B 到 Z 的最短路径相加来实现从 A 到 Z 的路径;并且类似地寻找从 C 到 Z 的最短路径。那么从 A 到 Z 的最短路径将是这两条路径中较短的一条。这里的关键见解是,在计算长度为 3 的最短路径时,我们可以对长度为 2 的路径重新使用最短路径计算,依此类推。这样做会产生更高效的算法。

    动态编程可用于解决多种类型的问题——有关示例,请参阅http://en.wikipedia.org/wiki/Dynamic_programming#Examples:_Computer_algorithms。

【讨论】:

看这篇好博客blog.csdn.net/zhongyangzhong/article/details/8719214 @erlandson Dijkstra 的算法是一种贪心算法,对吧..?是动态规划吗?【参考方案2】:

    要使动态规划适用于问题,应该有

    我。子问题中的最优结构:

这意味着,当您将问题分解为更小的单元时,这些更小的单元也需要被分解为更小的单元以获得最佳解决方案。例如,在归并排序中,如果我们将一个数字数组分成两个子数组,对它们进行排序并组合它们,则可以对其进行排序。在对这两个子数组进行排序时,重复您在上一句中遵循的相同过程。因此,当我们找到其子问题的最优解(我们对子数组进行排序并组合它们)时,就会得到最优解(排序数组)。合并排序满足此要求。此外,子问题必须是独立的,它们才能遵循最佳结构。这也可以通过合并排序来实现,因为子问题的解决方案不会受到彼此解决方案的影响。例如,数组两部分的解不受彼此排序的影响。

二。重叠子问题:

这意味着在求解解决方案时,您制定的子问题会重复,因此只需求解一次。在归并排序的情况下,这个要求在正常情况下只会很少满足。像 2 1 3 4 9 4 2 1 3 1 9 4 这样的数字数组可能是合并排序的重叠子问题的良好候选者。在这种情况下,子问题 sort(2 1 3) 的解决方案可以存储在一个表中以供重复使用,因为它在计算过程中会被调用两次。但正如你所看到的,随机数字数组具有这种重复设计的可能性非常小。因此,如果我们将动态编程技术(如记忆化)用于归并排序等算法,那只会是低效的。

    是的。 Dijkstra 的算法使用@Alan 在评论中提到的动态编程。 link

    是的。如果我可以在这里引用***, “动态编程在生物信息学中被广泛用于序列比对、蛋白质折叠、RNA 结构预测和蛋白质-DNA 结合等任务。” 1

1https://en.wikipedia.org/wiki/Dynamic_programming

【讨论】:

您说 Dijkstra 的算法没有使用 DP,因为它使用了贪心策略。这两件事并不相互排斥。贪心算法可以使用 DP,只要它使用记忆化并且解决的问题具有最优子结构和重叠子问题。参考:en.wikipedia.org/wiki/…

以上是关于为啥归并排序不是动态编程的主要内容,如果未能解决你的问题,请参考以下文章

代码与算法集锦-归并排序+树状数组+快排+深度优先搜索+01背包(动态规划)

编程-链表之希尔排序堆排序归并排序快速排序

分治算法-归并排序快速排序

排序算法:归并排序

python实现归并排序,归并排序的详细分析

python实现归并排序,归并排序的详细分析。