我试图理解动态算法和贪婪算法之间的差异,以及This answer by Neil G was quite helpful,但是,他所做的这一陈述引起了评论部分的争论。
动态编程和贪婪算法之间的区别在于动态编程,子问题重叠。这意味着通过“记忆”某些子问题的解决方案,您可以更快地解决其他子问题。
评论不是解决疑问的最佳场所,所以我正在创建这篇文章。我的问题是:
英语不是我的母语,所以请随意纠正语言中的任何错误。
答案 0 :(得分:4)
我认为贪婪和动态解决方案之间差异的解释并不好。贪婪的解决方案仅使用本地信息进行选择,即当前位置看起来最佳。因此,贪婪的解决方案可能会陷入困境。在局部最优而不是全局。动态编程是一种技术,您可以将一个更复杂的问题分解为更简单的子问题,然后组合子问题的结果以获得初始问题的结果。解决方案可以 贪婪和动态。看看我对原始主题的回答。
然而,你的这句话:
If something has an optimal substructure, then all locally optimal
choices must also be globally optimal right?
错了。以0,1背包为例:你是一个小偷,每晚闯入一些商店。你有一个背包,它有一个固定的重量容量。该商店有一些产品,每个产品都有相关的价格和重量。抢尽可能的最高价格。
现在举一个例子,你有容量50的背包和价格和重量的产品(21,20),(30,22),(22,21)和(9,9)。如果您做出本地最优的选择(即每次选择具有最高价格/重量比的项目),您将选择产品(30,22)和(21,20),而此解决方案不是最佳选择。最佳解决方案是采用(21,20),(22,21)和(9,9),导致利润增加2倍。