分治算法和动态规划算法的区别是什么?这两个术语有什么不同?我不明白它们之间的区别。

请举一个简单的例子来解释两者之间的区别,以及它们相似的理由。


当前回答

分而治之和动态规划的另一个区别是:

分而治之:

在子问题上做更多的工作,因此有更多的时间消耗。 分治法中子问题是相互独立的。

动态规划:

只解决一次子问题,然后将其存储在表中。 在动态规划中,子问题不是相互独立的。

其他回答

我假设你已经阅读了维基百科和其他关于这方面的学术资源,所以我不会重复使用任何信息。我还必须提醒,我不是计算机科学专家,但我将分享我对这些主题的理解……

动态规划

把问题分解成离散的子问题。Fibonacci序列的递归算法是动态规划的一个例子,因为它通过首先求解fib(n-1)来求解fib(n)。为了解决原来的问题,它解决了一个不同的问题。

分而治之

These algorithms typically solve similar pieces of the problem, and then put them together at the end. Mergesort is a classic example of divide and conquer. The main difference between this example and the Fibonacci example is that in a mergesort, the division can (theoretically) be arbitrary, and no matter how you slice it up, you are still merging and sorting. The same amount of work has to be done to mergesort the array, no matter how you divide it up. Solving for fib(52) requires more steps than solving for fib(2).

我认为分治法是递归方法,动态规划是表填充。

例如,归并排序是一种分治算法,因为在每一步中,您将数组分成两部分,递归地在两部分上调用归并排序,然后合并它们。

Knapsack是一种动态规划算法,因为您正在填充表示整个背包子问题的最优解的表。表中的每一项都对应于给定物品1-j的袋子中所能携带的最大重量w。

分治法在每一级递归中涉及三个步骤:

把问题分成子问题。 通过递归求解子问题来克服子问题。 将子问题的解合并到原问题的解中。 这是一种自顶向下的方法。 它在子问题上做更多的工作,因此有更多的时间 消费。 如。斐波那契数列的第n项可以用O(2^n)个时间复杂度计算。

动态规划包括以下四个步骤: 1. 描述最优解的结构。 2. 递归地定义最优解的值。 3.计算最优解的值。 4. 从计算的信息构造一个最优解。

这是一种自底向上的方法。 由于我们使用了之前计算的值,而不是再次计算,因此比分治算法花费的时间更少。 如。斐波那契数列的第n项可以用O(n)个时间复杂度来计算。

为了便于理解,让我们将分而治之视为一种暴力解决方案,并将其优化视为动态规划。 注意:具有重叠子问题的分治算法只能用dp进行优化。

分而治之

分而治之的工作原理是将问题划分为子问题,递归地征服每个子问题,并将这些解决方案组合起来。

动态规划

动态规划是一种解决具有重叠子问题的问题的技术。每个子问题只解决一次,每个子问题的结果存储在一个表中(通常实现为数组或哈希表),以供将来引用。这些子解可以用来获得原始解,存储子问题解的技术称为记忆。

你可能会想到DP =递归+重用

理解差异的一个经典例子是,这两种方法都可以获得第n个斐波那契数。看看麻省理工学院的材料。


分而治之法

动态规划方法

分而治之和动态规划的另一个区别是:

分而治之:

在子问题上做更多的工作,因此有更多的时间消耗。 分治法中子问题是相互独立的。

动态规划:

只解决一次子问题,然后将其存储在表中。 在动态规划中,子问题不是相互独立的。