Algorithm 动态规划与贪婪算法有何不同?

Algorithm 动态规划与贪婪算法有何不同?,algorithm,dynamic-programming,greedy,Algorithm,Dynamic Programming,Greedy,在我正在使用的这本书中,据说动态规划侧重于优化的原则,“优化问题的任何实例的最优解都由其子实例的最优解组成” 然而,贪婪技术专注于扩展部分构造的解决方案,直到您找到完整问题的解决方案。有人说,这必须是“在这一步骤上所有可行选择中最好的地方选择” 由于两者都涉及局部最优,那么其中一个不是另一个的子集吗?DP算法使用以下事实(对于某些问题)-大小n问题的最佳解决方案由大小n'问题的最佳解决方案组成。不同之处在于,动态规划要求您记住较小状态的答案,而贪婪算法是局部的,因为所需的所有信息都处于当前状态。

在我正在使用的这本书中,据说动态规划侧重于优化的原则,“优化问题的任何实例的最优解都由其子实例的最优解组成”

然而,贪婪技术专注于扩展部分构造的解决方案,直到您找到完整问题的解决方案。有人说,这必须是“在这一步骤上所有可行选择中最好的地方选择”


由于两者都涉及局部最优,那么其中一个不是另一个的子集吗?

DP算法使用以下事实(对于某些问题)-大小
n
问题的最佳解决方案由大小
n'问题的最佳解决方案组成。不同之处在于,动态规划要求您记住较小状态的答案,而贪婪算法是局部的,因为所需的所有信息都处于当前状态。当然,也有一些交叉点。

动态规划适用于具有以下特性的问题:

  • 重叠子问题,以及
  • 最优子结构
最优子结构意味着您可以贪婪地解决子问题,并结合解决方案来解决更大的问题动态规划与贪婪算法的区别在于,在动态规划中,存在重叠的子问题,这些子问题通过记忆来解决。“记忆化”是一种技术,通过这种技术,子问题的解决方案可以更快地解决其他子问题

这个答案引起了一些注意,所以我将给出一些例子

考虑一下“用美元、镍币和便士兑换零钱”的问题。这是一个贪婪的问题。它展示了最优子结构,因为您可以求解美元数。然后,求出镍币的数量。然后是硬币的数目。然后可以有效地组合这些子问题的解决方案。它并没有真正表现出重叠的子问题,因为解决每个子问题对其他子问题没有多大帮助(可能一点点)

考虑“Fibonnaci数”问题,它展示了最优子结构,因为你可以从F(9)和F(8)有效地(通过加法)求解F(10)。这些子问题重叠,因为它们都共享F(7)。如果在解F(8)时记住F(7)的结果,则可以更快地解F(9)

关于动态规划与“重新考虑决策”有关的评论:这显然不适用于任何线性动态规划算法,如上面的Fibonacci问题


本质上,将具有最优子结构的问题想象为一个有向无环图,其节点表示子问题(其中整个问题由一个索引为零的节点表示),其有向边表示子问题之间的依赖关系。然后,贪婪问题是一棵树(除根节点外,所有节点都有单位索引)。一个动态规划问题有一些节点的独立度大于1。这说明了重叠的子问题。

关键区别在于贪婪算法“静态”地组成解决方案,即解决方案中的每个局部选择都可以最终确定,而不需要知道其他局部选择。然而,动态算法会为子问题创建一组可能的解决方案,并且在考虑所有子问题后,只生成全局问题的单个解决方案。报告说得很好:

贪婪算法所做的选择可能取决于迄今为止所做的选择,但不取决于未来的选择或子问题的所有解决方案。它迭代地做出一个又一个贪婪的选择,将每个给定的问题简化为一个较小的问题。换句话说,贪婪算法从不重新考虑自己的选择。这是与动态规划的主要区别,动态规划是穷举的,保证能找到解决方案。在每个阶段之后,动态规划根据前一阶段的所有决策做出决策,并可能重新考虑前一阶段的算法路径

贪婪方法:

  • 贪婪方法的重点是扩展部分构造的解
  • 它提供了许多结果,例如可行解
  • 更有效率
  • 动态规划:

  • 关注最优性原则
  • 它提供了具体的答案
  • 效率较低

  • 贪婪和动态解决方案的概念并不是相互排斥的,我认为这在大多数答案中造成了很多混乱。我相信amit的回答强调了最重要的属性:贪婪的解决方案基于本地信息做出决策。因此,贪婪的解决方案可能最终会找到一个局部最优解,而不是全局最优解。 动态解决方案将一个问题分解为更小的子问题,然后将结果汇总,以获得更大更复杂问题的答案。那么-问题可能是动态的和贪婪的吗?答案是——是的,这是可能的。Dijkstra算法就是一个例子。对于这个算法,你在每一步上都做了一个贪婪的选择,但是你把问题简化成了一个更简单的子问题


    还有一些贪婪算法的例子不是DP-s:比如说爬山是一种贪婪算法,它不会将一个问题分解成多个子问题——它只解决一个子问题。也有不贪婪的DPs示例,例如,使用记忆计算第n个斐波那契数不是贪婪的

    DP和贪婪的区别在于,DP将在每个子问题上寻找全局最优,而贪婪将只寻找局部最优。所以,关于这个场景:

    假设你正在爬山,你想爬得尽可能高。路上