动态与贪婪算法:关于Neil G对同一主题的回答的辩论

时间:2015-09-18 13:15:20

标签: algorithm dynamic-programming greedy

我试图理解动态算法和贪婪算法之间的差异,以及This answer by Neil G was quite helpful,但是,他所做的这一陈述引起了评论部分的争论。

  

动态编程和贪婪算法之间的区别在于动态编程,子问题重叠。这意味着通过“记忆”某些子问题的解决方案,您可以更快地解决其他子问题。

评论不是解决疑问的最佳场所,所以我正在创建这篇文章。我的问题是:

  • 最小生成树具有最佳子结构以及重叠子问题。此外,在MST中,局部最优选择是全局最优的。因此动态和贪婪属性都适合吗?上面引用的部分如何支持这个?

  • 最佳子结构的属性如何与“局部最优然后全局最优”的属性不同?我的头脑是:如果某些东西有一个最佳的子结构,那么所有局部最优的选择也必须是全局最优的吗?有人可以解释我在哪里出错吗?

    英语不是我的母语,所以请随意纠正语言中的任何错误。

  • 1 个答案:

    答案 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倍。