『算法』『数据结构』浅谈贪心算法,理解程序员必懂必会的计算机常见算法——贪心算法

开通VIP,畅享免费电子书等14项超值服

首页

好书

留言交流

下载APP

联系客服

2023.02.25湖南

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它所做出的是在某种意义上的局部最优解。

贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。贪心选择是采用从顶向下、以迭代的方法做出相继选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题。对于一个具体问题,要确定它是否具有贪心选择的性质,我们必须证明每一步所作的贪心选择最终能得到问题的最优解。通常可以首先证明问题的一个整体最优解,是从贪心选择开始的,而且作了贪心选择后,原问题简化为一个规模更小的类似子问题。然后,用数学归纳法证明,通过每一步贪心选择,最终可得到问题的一个整体最优解。

贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,每一步都要确保能获得局部最优解。每一步只考虑一个数据,他的选取应该满足局部优化的条件。若下一个数据和部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加算法停止。

贪心策略适用的前提是:局部最优策略能导致产生全局最优解。实际上,贪心算法适用的情况很少。一般对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可以做出判断。

大多数可以使用贪心算法的问题都有以下特点:(1)原问题复杂度过高;(2)求全局最优解的数学模型难以建立;(3)求全局最优解的计算量过大;(4)没有太大必要一定要求出全局最优解,“比较优”就可以。

严格来说,贪婪算法可解决的问题通常大部分都有如下的特性:(1)随着算法的进行,将积累起其它两个集合:一个包含已经被考虑过并被选出的候选对象,另一个包含已经被考虑过但被丢弃的候选对象。(2)有一个函数来检查一个候选对象的集合是否提供了问题的解答。该函数不考虑此时的解决方法是否最优。(3)还有一个函数检查是否一个候选对象的集合是可行的,也即是否可能往该集合上添加更多的候选对象以获得一个解。和上一个函数一样,此时不考虑解决方法的最优性。(4)选择函数可以指出哪一个剩余的候选对象最有希望构成问题的解。(5)最后,目标函数给出解的值。(6)为了解决问题,需要寻找一个构成解的候选对象集合,它可以优化目标函数,贪婪算法一步一步的进行。起初,算法选出的候选对象的集合为空。接下来的每一步中,根据选择函数,算法从剩余候选对象中选出最有希望构成解的对象。如果集合中加上该对象后不可行,那么该对象就被丢弃并不再考虑;否则就加到集合里。每一次都扩充集合,并检查该集合是否构成解。如果贪婪算法正确工作,那么找到的第一个解通常是最优的。

贪婪算法并没有固定的算法解决框架,算法的关键是贪婪策略的选择,根据不同的问题选择不同的策略。

必须注意的是策略的选择必须具备无后效性,即某个状态的选择不会影响到之前的状态,只与当前状态有关,所以对采用的贪婪的策略一定要仔细分析其是否满足无后效性。

整数转罗马数字问题:

解题思路:这道题要将4,9,40,90,400,900的符号单列出来。然后我们使用贪心算法,每次运算都将总数减去最大的可能数值,直到减到0。(就像假如你要付67块钱,肯定先找出一张50块,再找出一张10块,再找出一张5块,最后找出两张1块)。

下面附上Python3的题解代码

以下是LeetCode题库中一些用到贪心算法的经典例题的题目及解析,有题干,有题解代码、有解题思路(持续更新):

THE END
1.《贪心算法详解》求解活动安排问题贪心法(一)基本概念 贪心算法是一种基于局部最优选择的算法设计策略。在每一步决策中,贪心算法总是选择当前状态下看起来最优的选项,而不考虑整体的最优解。这种局部最优选择的策略在某些情况下可以得到全局最优解,但在其他情况下可能会得到次优解甚至是错误的解。 https://blog.csdn.net/weixin_47266126/article/details/144418709
2.朴素贪心算法入门:轻松掌握贪心算法基础本文介绍了朴素贪心算法的基本概念和特点,解释了其与动态规划的区别,并通过活动选择问题、最小生成树和零钱找零问题等案例来说明朴素贪心算法的应用。文章还探讨了如何证明贪心算法的正确性,并列举了贪心算法在实际生活和计算机科学中的应用场景。 贪心算法简介 贪心算法的基本概念 贪心算法是一种在每个步骤中都采取当前https://www.imooc.com/article/357919
3.贪心法(一):贪心法的基本思想51CTO博客贪心法(一):贪心法的基本思想,在实际问题中,经常会遇到求一个问题的可行解和最优解的问题,这就是所谓的最优化问题。每个最优化问题都包含一组限制条件和一个优化函数,符合条件的解决方案称为可行解,使优化函数取得最佳值的可行解称为最优解。贪心法是求解这类问题的https://blog.51cto.com/u_15127681/4529569
4.1.问题求解算法通过实例掌握动态规划的基本思想与算法设计方法●引导要点:以空间换时间的关键是存储效率; 动态规划与指数时间的有效降低 论题2-13:贪心算法 ●学习目的: 掌握利用贪心策略设计算法的思路与方法; 掌握用分摊进行算法分析的思想与方法●引导要点:贪心算法的正确性证明 论题2-14:用于动态等价关系的数据结构 ●学习目的:https://cs.nju.edu.cn/jxcgj/kctxsf.html
5.Python高级算法——贪心算法(GreedyAlgorithm)贪心算法是一种优化问题的解决方法,它每步选择当前状态下的最优解,最终希望通过局部最优的选择得到全局最优解。在本文中,我们将深入讲解Python中的贪心算法,包括基本概念、算法思想、具体应用场景,并使用代码示例演示贪心算法在实际问题中的应用。 基本概念 https://cloud.tencent.com/developer/article/2369179
6.python常用的算法——贪心算法(又称贪婪算法),你知道吗?贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的的时在某种意义上的局部最优解。 贪心算法并不保证会得到最优解,但是在某些问题上贪心算法的解就是最优解。要会判断一个问题能否用贪心算法来计算。贪心算法和其他算法比较有明显的区https://zhuanlan.zhihu.com/p/99057907
7.八大算法思想(五)贪心算法在从零开始学动态规划中我们已经谈过三种最基本的背包问题:零一背包,部分背包,完全背包。很容易证明,背包问题不能使用贪心算法。然而我们考虑这样一种背包问题:在选择物品i装入背包时,可以选择物品的一部分,而不一定要全部装入背包。这时便可以使用贪心算法求解了。计算每种物品的单位重量价值作为贪心选择的依据指标,选择https://www.jianshu.com/p/e05d46015648
8.Awesome? Kahn 算法实际上用的是贪心算法思想。? 定义数据结构的时候,如果 s 需要先于 t 执行,那就添加一条 s 指向 t 的边。所以,如果某个顶点入度为 0, 也就表示,没有任何顶点必须先于这个顶点执行,那么这个顶点就可以执行了。? 我们先从图中,找出一个入度为 0 的顶点,将其输https://github.com/Ty-Chen/Awesome-Backend/blob/5ad253a0f2e82d9b83892a60e01a1e0a855d70b3/Data%20Structure%20and%20Algorithm.md
9.贪心算法基本思想和典型例题(转)贪心算法基本思想和典型例题(转)贪?算法基本思想和典型例题(转)贪?算法 ?、算法思想 贪?法的基本思路:——从问题的某?个初始解出发逐步逼近给定的?标,以尽可能快的地求得更好的解。当达到某算法中的某?步不能再继续前进时,算法停?。该算法存在问题:1. 不能保证求得的最后解是https://wenku.baidu.com/view/b353a645deccda38376baf1ffc4ffe473368fdc7.html
10.贪心算法机器之心贪心法,又称贪心算法、贪婪算法、或称贪婪法,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。比如在旅行推销员问题中,如果旅行员每次都选择最近的城市,那这就是一种贪心算法。 思想 贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根https://www.jiqizhixin.com/graph/technologies/d939b81d-166f-4a73-974f-a44976c15148