为啥归并排序不是动态编程
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/…以上是关于为啥归并排序不是动态编程的主要内容,如果未能解决你的问题,请参考以下文章