如何发现“贪心”算法?

时间:2011-10-25 09:50:37

标签: algorithm greedy

我正在阅读关于“贪婪”算法的tutorial,但我很难发现它们可以解决真正的“顶级编码器”问题。

如果我知道可以使用“贪婪”算法解决给定问题,则很容易对解决方案进行编码。但是,如果我没有被告知这个问题是“贪婪的”,我就无法发现它。

“贪婪”算法解决问题的常见属性和模式是什么?我可以将它们减少到已知的“贪婪”问题之一(例如MST)吗?

3 个答案:

答案 0 :(得分:11)

正式地,你必须证明matroid属性。但是,我认为就topcoder而言,你更愿意快速找到问题是否可以贪婪地接近。

在这种情况下,最重要的一点是optimal sub-structure property。为此,您必须能够发现问题可以分解为子问题,并且他们的最佳解决方案是整个问题的最佳解决方案的一部分。

当然,贪婪的问题种类繁多,几乎不可能为你的问题提供一般的正确答案。因此,我最好的建议就是沿着这些方向思考:

  • 我在某些时候可以选择不同的选择吗?
  • 此选择是否会导致可以单独解决的子问题?
  • 我是否可以使用子问题的解决方案来获得整体问题的解决方案?

加上负载和经验(也不得不说),这应该可以帮助您快速发现贪婪的问题。当然,您最终可能会将问题归类为贪婪,而不是。在这种情况下,您只能希望在处理代码太长时间之前实现它。

(同样,作为参考,我假设一个topcoder上下文......对于任何更现实和实际的结果,我强烈建议在选择贪婪算法之前实际验证拟阵结构。)

答案 1 :(得分:5)

你的问题的一部分可能是由于思考“贪婪的问题”引起的。存在贪婪算法和问题,其中存在贪婪算法,这导致最佳解决方案。还有其他难题也可以通过贪心算法解决,但结果不一定是最优的。

例如,对于bin打包问题,有几种贪心算法都比指数算法具有更好的复杂性,但你只能确定你会得到一个低于某个阈值的解决方案。最佳解决方案。

仅针对贪婪算法将导致最佳解决方案的问题,我的猜测是感应式正确性证明感觉完全自然且容易。对于你贪婪的每一步,很明显这是最好的事情。

通常,最佳,贪婪解决方案的问题很容易,而其他问题则会因为复杂性的限制而迫使您提出贪婪的启发式算法。通常一个有意义的减少将表明你的问题实际上至少是NP难度,因此你知道你必须找到一个启发式。对于那些问题,我是尝试的忠实粉丝。实现你的算法并尝试找出解决方案是否“相当不错”(理想情况下,如果你也有一个缓慢但正确的算法,你可以比较结果,否则你可能需要手动创建的基础事实)。只有你有一些运作良好的东西,试着思考为什么,甚至可能尝试提出界限证明。也许它有效,也许你会发现它不起作用并需要改进的边界情况。

答案 2 :(得分:1)

“用于描述一系列算法的术语。大多数算法尝试从某些初始配置达到一些”好“配置,只做出合法的移动。通常有一些衡量解决方案的”好处“(假设一个是找到)。 贪婪的算法总是试图执行它可以做的最佳法律移动。请注意,这个标准是本地的:贪心算法不会“提前思考”,同意现在执行一些平庸的移动,这将允许更好的移动。

例如,埃及分数的贪婪算法试图找到一个小分母的表示。不是寻找最后一个分母很小的表示,而是在每一步都采用最小的法定分母。一般来说,这会在后续步骤中产生非常大的分母。

贪婪算法的主要优点通常是分析简单。通常也很容易编程。不幸的是,它往往是次优的。“                                                                   --- ariels (http://www.everything2.com/title/greedy+algorithm?searchy=search)