前言
今天继续带大家进行新的篇章贪心算法,什么是贪心,通俗的说就是我要最好的,每次都要最好的,最终得到的结果也是最好的,就是通过局部最优到全局最优。但是如何其实现呢?一文带大家弄懂。本文用于记录自己的学习过程,同时向大家进行分享相关的内容。本文内容参考于代码随想录同时包含了自己的许多学习思考过程,如果有错误的地方欢迎批评指正!
贪心算法理论基础
什么是贪心算法
贪心算法的本质是在解决问题时,通过将问题划分为多个阶段,在每个阶段都选择当前状态下的最优解(即局部最优解),以期望通过局部最优最终达到全局最优的目标。
首先我们要明确贪心算法通常不回溯,也不从整体上考虑所有可能的情况,而是一步步推进,并在每一步中都做出看似最好的选择。虽然这种方法不能保证在所有问题中都得到最优解,但在某些特定问题中,贪心策略能够产生全局最优解。但是有些问题比如所背包问题的,就无法通过贪心算法来得到最优解了,需要用到动态规划了。
什么情况下用贪心算法
贪心算法适用于以下几类问题:
具有“最优子结构”性质的问题:什么是“最优子结构”呢?就指的是一个问题的整体最优解可以通过其子问题的最优解组合而成。也就是说,如果我们能够找到每个子问题的最佳解,并将这些解结合起来去构建出整个问题的最优解。若一个问题没有我们刚才所说的最优子结构,那么贪心策略在某一阶段的最优选择可能会破坏整体解的最优性,从而得不出最终的全局最优解。
具备“贪心选择性质”:具备贪心选择性质就是说明我们可以在每一步都做出一个当前看来最优的选择,而这一选择不会影响全局的最优解。也就是说,在不考虑后续决策的前提下,仅通过当前最优就能朝着整体最优逼近,从而无需回溯或存储所有历史状态。
怎么判断该使用贪心算法
判断一个问题是否适合用贪心算法,我们可以从以下几个方面去思考:
- 从问题中抽象出一个明确的“贪心策略”:我们要知道我们解决贪心问题的时候的最重要的就是设定一个评估标准,每次都选择当前情况的最优解。例如,在活动选择问题中,我们可以按照每个活动的结束时间从早到晚排序,然后每次选择最早结束且不与已选活动冲突的活动,这就是一个典型的贪心策略。
- 验证该问题是否满足“贪心选择性质”:在每一步做出局部最优选择之后,我们是否仍能通过这一选择构造出问题的整体最优解这是我们是否能用贪心算法解决问题的关键。换句话说,贪心策略是否不会因为过早做出某些决定而导致整体结果变差。如果这个性质不成立,贪心算法就可能得到次优甚至错误的解。这时我们通常需要考虑更全面的方法,如动态规划,它通过记录多个子问题的状态来避免贪心策略可能带来的误差。