基本算法思想之贪心算法

贪心算法

基本概念
  • 概念
    所谓贪心算法,就是把整个问题分解成多个步骤,在每个步骤都选取当前步骤的最佳方案,知道所有步骤结束。对每一步骤,既不考虑之前步骤对当前步骤的影响,也不考虑当前步骤对后续步骤的影响,只需要选出当前步骤的最佳方案。简单来说,就是走一步看一步,只考虑当前的状况。

  • 理解
    了解了贪心算法的概念,下面我们来以最少硬币问题为例,介绍一下贪心算法的应用规则和局限性。

    话说有一个人,他带着面值分别为 1元、5元和 10元的硬币去买东西(每种面值的硬币都很充足),但是,对于一件价格为 27元 的商品,他希望用最少数量的硬币来买这件商品,现在问你他要怎样支付。
    按照常识,我们知道,要想支付的硬币数量最少,要优先使用 两个 面值为 10元 的硬币,然后再使用 一个 面值为 5元 的硬币,最后 两个 使用 1元 的硬币,这样,我们使用使用的硬币数量最少。

    上面说到的选择支付方案就是贪心思想的应用。拿硬币的时候,我们并没有从整体出发,而是只看当前,使当前使用的硬币数量最少,再考虑下一个步骤。换句话说,就是 局部最优达到全局最优 ,从而得到解决问题的最佳方案。

    但是,局部最优一定就能够达到全局最优吗?答案是否定,甚至在有最优解的情况下无法得到这个最优解。
    同样还是上面的问题,现在更改一下面值。
    (1)这个人有 1元、2元、4元、5元、6元 面值的硬币,买一个 9元 的商品,按照贪心的思想,付钱的方案就是 6元X1 + 2元X1 + 1元X1 ,一共三个硬币,但是很明显,这不是我们希望的最佳方案,最佳方案是 5元X1 + 4元X1 ,一共两个硬币。
    (2)这个人现在换成了 2元、3元、5元的硬币,还是支付 9元 ,还是按照贪心的思想,一个 5元硬币,加上一个 3元硬币,现在我们还需要 一个1元硬币,但是他没有 1元硬币,所以此时无解。但是实际上是有解的,使用贪心的算法反而使问题陷入了无解。
    所以,局部最优并不一定会达到全局最优,贪心算法需要问题满足一定条件。就上面的硬币来说,要能够使用贪心算法,面值必须满足当 前面值大于比它小的所有硬币的面值之和 ,这样就可以使用贪心算法。对于任意面值的硬币,就需要采用动态规划算法了,贪心算法就不能解决问题了。

  • 应用
    对贪心思想有了一定的了解之后,就看看什么样的问题可以使用贪心算法。

    当问题满足下面的特征时,可以应用贪心算法:
    1.最优子结构性质。简单地说,当一个问题的最优解包含他的子问题的最优解,能够由局部最优得到全局最优,就说这个问题有最优子结构性质。
    2.贪心选择性质。也就是说,问题的最优解能够在一系列
    子问题的最优解中通过选择得到。

    贪心算法没有固定的结构,关键在于如何选择解题策略,与其说是算法,更像是一种思想,就是由局部最优扩展到全局最优的思想。
    虽然在某些问题中无法由贪心算法得到最优解(如旅行商问题),但是如果是只需要最优解的一个近似解,仍然可以使用贪心的算法。

发布了9 篇原创文章 · 获赞 1 · 访问量 1339

猜你喜欢

转载自blog.csdn.net/weixin_44193527/article/details/104399321