我正在阅读关于贪婪问题的两个属性,我试图理解下面两者之间的区别: -
阿伦的两个等价物?这两个看起来是一样的;你能给我一个满足最优子结构的例子,但贪婪的选择不是吗?还有一个例子,当贪婪的选择得到满足但最佳的子结构不是吗?
答案 0 :(得分:2)
它们不等同:
假设我们想要在树中找到每个节点都有成本的最小顶点覆盖(覆盖的成本是此封面中节点的所有成本的总和)。可以在此处使用动态编程:f(v, taken)
是覆盖v
中的子树的最低成本,其中v
位于封面中,f(v, not taken)
是最低成本在不考虑v
的情况下覆盖此子树。最优子结构属性是正确的,因为我们可以最佳地解决子问题(即,找到每个子树的最优解),然后将它们组合起来找到全局最优解。但是,贪婪的选择属性在这里不成立:选择具有最小成本的顶点直到覆盖所有边缘并不总能产生最佳结果。
贪婪的选择属性可能成立,但如果无法定义子问题,则最佳子结构属性不会成立。例如,霍夫曼代码构造算法总是合并两个最小的子树(并产生一个最优的解决方案),所以它是一个贪婪的算法,但不清楚子问题是什么,所以谈论第一个没有多大意义财产。
答案 1 :(得分:0)
对于可能不熟悉顶点覆盖或动态编程的未来读者而言,这些定义的措辞确实使其听起来相似。
我认为,重新表达贪婪选择的一种有用方法是,最佳解决方案始终包含贪婪算法选择的第一选择,尽管不一定必须是贪婪算法中的第一选择。最佳解决方案**->这就是它们之所以不同的原因,因为尽管某些事物可能是最佳的并且显示了贪婪的选择属性,但您尚未证明在每一步上都做出了当前最佳方案。在加权图上考虑Prim's MST:您可以从任何顶点开始,但这意味着算法可以针对这两种解决方案在每一步选择不同的边,但是它们总是从权重最低的任何给定顶点中选择边,因此他们有贪婪的选择属性。但是您还没有证明每个步骤的整个解决方案都绝对是最佳选择,只是选择最贪婪的选项。
这就是为什么它们不同的原因,尽管贪婪的选择可以带来最佳的子结构,但并不能证明它具有最佳的子结构。证明最优子结构的常见参数是交换参数和保持超前参数,它们是基于该算法显示贪婪选择属性而建立的。