【发布时间】:2011-10-25 09:50:37
【问题描述】:
我正在阅读关于“贪婪”算法的tutorial,但我很难发现它们解决真正的“顶级编码器”问题。
如果我知道可以使用“贪婪”算法解决给定问题,那么编写解决方案的代码就很容易了。但是,如果我没有被告知这个问题是“贪婪的”,我就无法发现它。
用“贪心”算法解决的问题有哪些共同属性和模式?我可以将它们简化为已知的“贪婪”问题之一(例如 MST)吗?
【问题讨论】:
我正在阅读关于“贪婪”算法的tutorial,但我很难发现它们解决真正的“顶级编码器”问题。
如果我知道可以使用“贪婪”算法解决给定问题,那么编写解决方案的代码就很容易了。但是,如果我没有被告知这个问题是“贪婪的”,我就无法发现它。
用“贪心”算法解决的问题有哪些共同属性和模式?我可以将它们简化为已知的“贪婪”问题之一(例如 MST)吗?
【问题讨论】:
形式上,您当然必须证明拟阵属性。但是,我认为就 topcoder 而言,您更希望快速找出问题是否可以贪婪地解决。
在这种情况下,最重要的一点是optimal sub-structure property。为此,您必须能够发现问题可以分解为子问题,并且它们的最优解是整个问题最优解的一部分。
当然,贪心问题种类繁多,几乎不可能为您的问题提供一个普遍正确的答案。因此,我最好的建议是按照以下思路思考:
加上大量的经验(也不得不说),这应该可以帮助您快速发现贪婪的问题。当然,您最终可能会将问题归类为贪婪问题,但事实并非如此。在这种情况下,您只能希望在编写代码太久之前实现它。
(再次,作为参考,我假设一个 topcoder 上下文.. 对于任何更现实和实际的结果,我强烈建议在选择贪心算法之前实际验证拟阵结构。)
【讨论】:
您的问题的一部分可能是由“贪婪问题”的想法引起的。有贪心算法和问题,有贪心算法会导致最优解。贪心算法也可以解决其他难题,但结果不一定是最优的。
例如,对于装箱问题,有几种贪心算法,它们的复杂度都比指数算法好得多,但你只能确定你会得到一个低于某个阈值的解决方案。最优解。
仅对于贪心算法将导致最佳解决方案的问题,我的猜测是归纳正确性证明感觉完全自然和容易。对于你贪婪的每一步,很明显这是最好的做法。
通常情况下,具有最优、贪心解决方案的问题很容易解决,但由于复杂性限制,其他问题会迫使您提出贪心启发式解决方案。通常,有意义的减少将表明您的问题实际上至少是 NP 难的,因此您知道您必须找到一个启发式方法。对于这些问题,我非常喜欢尝试。实现您的算法并尝试找出解决方案是否“相当好”(如果您也有一个缓慢但正确的算法,您可以比较结果,否则您可能需要手动创建基本事实)。只有当你有一些运作良好的东西时,试着想想为什么,甚至尝试提出边界证明。也许它有效,也许你会发现它不起作用并需要改进的边界情况。
【讨论】:
“用于描述一系列算法的术语。大多数算法试图从一些初始配置达到一些“好的”配置,只进行合法的移动。通常有一些解决方案的“好的”度量(假设一个是成立)。 贪心算法总是试图执行它所能做的最好的合法移动。请注意,这个标准是局部的:贪心算法不会“提前考虑”,同意现在执行一些看起来平庸的举动,这将允许以后更好的举动。
例如,埃及分数的贪心算法试图找到具有小分母的表示。它不是寻找最后一个分母很小的表示,而是在每一步都采用最小的合法分母。一般来说,这会导致后续步骤的分母非常大。
贪心算法的主要优点通常是分析简单。它通常也很容易编程。不幸的是,它通常不是最理想的。” --- 爱丽儿 (http://www.everything2.com/title/greedy+algorithm?searchy=search)
【讨论】: