【问题标题】:How to spot a "greedy" algorithm?如何发现“贪婪”算法?
【发布时间】:2011-10-25 09:50:37
【问题描述】:

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

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

用“贪心”算法解决的问题有哪些共同属性和模式?我可以将它们简化为已知的“贪婪”问题之一(例如 MST)吗?

【问题讨论】:

    标签: algorithm greedy


    【解决方案1】:

    形式上,您当然必须证明拟阵属性。但是,我认为就 topcoder 而言,您更希望快速找出问题是否可以贪婪地解决。

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

    当然,贪心问题种类繁多,几乎不可能为您的问题提供一个普遍正确的答案。因此,我最好的建议是按照以下思路思考:

    • 我是否可以在某个时候在不同的备选方案之间进行选择?
    • 这种选择是否会导致可以单独解决的子问题?
    • 我能否使用子问题的解决方案来推导出整体问题的解决方案?

    加上大量的经验(也不得不说),这应该可以帮助您快速发现贪婪的问题。当然,您最终可能会将问题归类为贪婪问题,但事实并非如此。在这种情况下,您只能希望在编写代码太久之前实现它。

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

    【讨论】:

    • 我认为您的意思是“拟阵属性”而不是“单半属性”。您还可以更具体地了解“最佳子结构”属性吗?我从动态编程中知道这个属性,你将问题分解成几个子问题,然后重新组合它们。然而,以最小生成树为例,我很难看出有什么相似之处,因为算法总是不断地添加到以前的解决方案中。
    • 你说得对,当然我指的是拟阵。如果您将问题视为删除边并必须将剩余的图连接到已包含的顶点集,则可以看到 MST 子结构。
    【解决方案2】:

    您的问题的一部分可能是由“贪婪问题”的想法引起的。有贪心算法和问题,有贪心算法会导致最优解。贪心算法也可以解决其他难题,但结果不一定是最优的。

    例如,对于装箱问题,有几种贪心算法,它们的复杂度都比指数算法好得多,但你只能确定你会得到一个低于某个阈值的解决方案。最优解。

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

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

    【讨论】:

      【解决方案3】:

      “用于描述一系列算法的术语。大多数算法试图从一些初始配置达到一些“好的”配置,只进行合法的移动。通常有一些解决方案的“好的”度量(假设一个是成立)。 贪心算法总是试图执行它所能做的最好的合法移动。请注意,这个标准是局部的:贪心算法不会“提前考虑”,同意现在执行一些看起来平庸的举动,这将允许以后更好的举动。

      例如,埃及分数的贪心算法试图找到具有小分母的表示。它不是寻找最后一个分母很小的表示,而是在每一步都采用最小的合法分母。一般来说,这会导致后续步骤的分母非常大。

      贪心算法的主要优点通常是分析简单。它通常也很容易编程。不幸的是,它通常不是最理想的。” --- 爱丽儿 (http://www.everything2.com/title/greedy+algorithm?searchy=search)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-17
        • 2021-09-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多