【发布时间】:2014-12-13 22:04:30
【问题描述】:
我正在阅读贪婪问题的两个属性,我试图了解以下两者之间的区别:-
- 最优子结构属性:最优全局解包含其所有子问题的最优解。
- 贪婪选择属性:通过贪婪选择局部最优选择可以获得全局最优解。
这两个不是等价的吗?两者看起来是一回事;你能给我一个满足最优子结构但不满足贪婪选择的例子吗?以及满足贪心选择但不满足最优子结构的例子?
【问题讨论】:
我正在阅读贪婪问题的两个属性,我试图了解以下两者之间的区别:-
这两个不是等价的吗?两者看起来是一回事;你能给我一个满足最优子结构但不满足贪婪选择的例子吗?以及满足贪心选择但不满足最优子结构的例子?
【问题讨论】:
对于可能不熟悉顶点覆盖或动态规划的未来读者来说,这些定义的措辞确实使它听起来很相似。
我认为改写贪心选择的一个有用方法是,最优解总是包含贪心算法选择的第一选择,尽管它不一定是说最佳解决方案**->这就是它们不同的原因,因为尽管某些东西可能是最佳的并显示了贪婪的选择属性,但您还没有证明在每一步都制定了当前的最佳解决方案。在加权图上思考Prim's MST:您可以从任何顶点开始,但这意味着算法可以在每一步为这两个解决方案选择不同的边,但它们总是从任何给定的顶点中选择权重最低的边,因此它们有贪心选择属性。但是你还没有证明每一步的整个解决方案都是绝对最优的,只是选择了最贪婪的选项。
这就是它们不同的原因,虽然贪婪选择可以导致最优子结构,但并不能证明它具有最优子结构。证明最优子结构的常见论据是交换论据和保持领先论据,它们建立在算法显示贪婪选择属性的知识之上。
【讨论】:
它们不等价:
假设我们想在树中找到最小的顶点覆盖,其中每个节点都有一个成本(覆盖的成本是这个覆盖中所有节点成本的总和)。这里可以使用动态规划:f(v, taken) 是覆盖以v 为根的子树的最小成本,v 在封面中,f(v, not taken) 是在不占用@987654325 的情况下覆盖此子树的最小成本@。最优子结构属性是正确的,因为我们可以最优地解决子问题(即为每个子树找到一个最优解),然后将它们组合起来找到全局最优解。然而,贪心选择属性在这里并不成立:选择成本最小的顶点直到所有边都被覆盖并不总是产生最佳结果。
如果无法定义子问题是什么,贪心选择属性可能成立,但最优子结构属性不成立。例如,霍夫曼码构造算法总是合并两个最小的子树(并产生一个最优解),所以它是一个贪心算法,但不清楚子问题是什么,所以说第一个没有多大意义财产。
【讨论】: