【算法图解】 之 [贪婪算法(贪心算法)] 详解
入门算法学习,看的第一本是深入浅出的《算法图解》一书,本博客是对《算法图解》一书的学习笔记,将书中的分享的算法示例用Python3语言实现。
如果你也想要阅读这本书,百度云盘链接:https://pan.baidu.com/s/1s967vfgEBd1vSrfwVI9Y3g
提取码:【be9k】
贪婪算法
- 贪婪算法(又称贪心算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
- 贪婪算法很简单:每步都采取最优的做法。用专业术语说,就是你每步都选择局部最优解,最终得到的就是全局最优解。
贪婪算法工作原理
你希望在这间教室上尽可能多的课。如何选出尽可能多且时间不冲突的课程呢?
这个问题好像很难,不是吗?实际上,算法可能简单得让你大吃一惊。具体做法如下。
(1) 选出结束最早的课,它就是要在这间教室上的第一堂课。
(2) 接下来,必须选择第一堂课结束后才开始的课。同样,你选择结束最早的课,这将是要在这间教室上的第二堂课。
重复这样做就能找出答案!下面来试一试。美术课的结束时间最早,为10:00 a.m.,因此它就是第一堂课。
英语课不行,因为它的时间与美术课冲突,但数学课满足条件。最后,计算机课与数学课的时间是冲突的,但音乐课可以。
很多人都说,这个算法太容易、太显而易见,肯定不对。但这正是贪婪算法的优点——简单易行!
贪婪算法很简单:每步都采取最优的做法。在这个示例中,你每次都选择结束最早的课。用专业术语说,就是你每步都选择局部最优解,最终得到的就是全局最优解。
贪婪算法–案例
每个广播台都覆盖特定的区域,不同广播台的覆盖区域可能重叠。
如何找出覆盖全美50个州的最小广播台集合呢?听起来很容易,但其实非常难。具体方法如下。
(1) 列出每个可能的广播台集合,这被称为幂集(power set)。可能的子集有2n
个。
(2) 在这些集合中,选出覆盖全美50个州的最小集合。
- 问题是计算每个可能的广播台子集需要很长时间。由于可能的集合有2n个,因此运行时间为O(2n)。如果广播台不多,只有5~10个,这是可行的。
- 但如果广播台很多,结果将如何呢?
- 随着广播台的增多,需要的时间将激增。假设你每秒可计算10个子集,所需的时间将如下。
没有任何算法可以足够快地解决这个问题!怎么办呢?
贪婪算法可化解危机!使用下面的贪婪算法可得到非常接近的解。
(1) 选出这样一个广播台,即它覆盖了最多的未覆盖州。即便这个广播台覆盖了一些已覆盖的州,也没有关系。
(2) 重复第一步,直到覆盖了所有的州。
这是一种近似算法(approximation algorithm)。在获得精确解需要的时间太长时,可使用近似算法。
判断近似算法优劣的标准如下:速度有多快;
得到的近似解与最优解的接近程度。
贪婪算法是不错的选择,它们不仅简单,而且通常运行速度很快。在这个例子中,贪婪算法
的运行时间为O(n^2),其中n为广播台数量。
下面是解决这个问题的代码。
state_needed = {'mt', 'wa', 'or', 'id', 'nv', 'ut', 'ca', 'az'} # 需要覆盖的州的集合stations = {} # 用集合的形式记录广播台清单
stations["kone"] = {"id", "nv", "ut"} # 表示:kone广播台可以覆盖id、nv、ut地区
stations["ktwo"] = {"wa", "id", "mt"} # 表示:ktwo广播台可以覆盖wa、id、mt地区
stations["kthree"] = {"or", "nv", "ca"}
stations["kfour"] = {"nv", "ut"}
stations["kfive"] = {"ca", "az"}finaly_stations = set() # 最终选择的广播台while state_needed: # 循环需要覆盖的州的集合,直到覆盖完全,才停止循环best_station = None # 最合适的广播台best_states_covered = set() # 记录覆盖的交集地区for station, states in stations.items(): # 遍历每一个广播台coverd = state_needed & states # covered包含同时出现在‘需要覆盖’的和‘广播站覆盖’的那些州if len(coverd) > len(best_states_covered): # 检查该广播台覆盖的州是否比best_states_coverd 多best_station = station # 如果多,就选择这个station为最合适的广播台 best_states_covered = coverd # 记录这次覆盖的交集地区state_needed -= coverd # 减少下次需要覆盖的地区finaly_stations.add(best_station) # 将这个最优广播站添加到finaly_stations集合中print(finaly_stations)----------------------
{'kone', 'kfive', 'kthree', 'ktwo'}
运行时间
————————————————
版权声明:本文为CSDN博主「梅雨琪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42739440/article/details/97009253
【算法图解】 之 [贪婪算法(贪心算法)] 详解相关推荐
- 蓝桥杯 试题 算法训练 无聊的逗 C++ 详解 - 未完善
题目: 逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中.不过他想到了一个游戏来使他更无聊.他拿出n个木棍,然后选出其中一些粘成一根长的,然后再选一些粘成另一个长的,他想知道在两根一样长的 ...
- JAVA中希尔排序去的讲解_java 中基本算法之希尔排序的实例详解
java 中基本算法之希尔排序的实例详解 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shel ...
- EM算法(Expectation Maximization Algorithm)详解
EM算法(Expectation Maximization Algorithm)详解 主要内容 EM算法简介 预备知识 极大似然估计 Jensen不等式 EM算法详解 问题描述 EM算法推导 EM ...
- 蓝桥杯 试题 算法训练 无聊的逗 C++ 详解
题目: 逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中.不过他想到了一个游戏来使他更无聊.他拿出n个木棍,然后选出其中一些粘成一根长的,然后再选一些粘成另一个长的,他想知道在两根一样长的 ...
- 【JVM】对象存活判定算法、GC算法、STW、GC种类详解
[JVM]对象存活判定算法.GC算法.STW.GC种类详解 文章目录 [JVM]对象存活判定算法.GC算法.STW.GC种类详解 GC主要关注的区域 垃圾标记阶段:对象存活判断 标记阶段:引用计数算法 ...
- 【目标检测算法-锚框公式推导及代码详解】
目标检测算法-锚框公式推导及代码详解 0 沐神对锚框的宽高计算并未推导以及讲解 1 锚框宽高公式推导 1.1 基础概念 1.2 锚框宽高公式推导 1.3 图片验证计算 1.4 小结 2 代码详解 2. ...
- 大白话解析Apriori算法python实现(含源代码详解)
大白话解析Apriori算法python实现(含源代码详解) 一.专业名词解释 二.算法思路 三.python代码实现 四.Aprioir的优点.缺点及改进方法 本文为博主原创文章,转载请注明出处,并 ...
- java贪心算法 区间调度_贪心算法-区间调度问题解之证明(示例代码)
一.贪心算法 定义:一个算法是贪心算法,如果它是通过一些小的步骤来一个求解,并且在每一步根据局部情况选择一个决定,使得某些主要的指标得到优化. 二.区间调度问题 1. 问题:我们有一组需求{1,2,3 ...
- 疯子的算法总结(四)贪心算法
一.贪心算法 解决最优化问题的算法一般包含一系列的步骤,每一步都有若干的选择.对于很多最优化问题,只需要采用简单的贪心算法就可以解决,而不需要采用动态规划方法.贪心算法使所做的局部选择看起来都是当前最 ...
- _28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II 、55.跳跃游戏、45.跳跃游戏II
_28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II .55.跳跃游戏.45.跳跃游戏II 题目列表 122.买卖股票的最佳时机II 55.跳跃游戏 45 ...
最新文章
- 实时双频Wi-Fi如何实现下一代车内连接
- One-hot encoding的不足及改进
- linux开机启动遇到grub启动_Linux如何跳过grub启动
- SQL 存储过程 解析XML
- r语言逻辑向量相加_R语言基础教程——第3章:数据结构——向量
- foreach 实现 MyBatis 遍历集合与批量操作数据
- 前端学习(3196):虚拟dom和真实dom
- hello python_Python-Hello world!
- eclipse中使用git回到之前的版本
- Codeforces 797B - Odd sum
- python下载哪个版本好-究竟哪个版本的Python是最快的?
- 在linux下安装gaussian09
- 荣耀总裁赵明揭秘华为薪酬制度:不看资历,只看贡献
- 二路归并排序算法c语言实现,二路归并排序算法实现-完整C语言程序
- 利用dialogArguments进行网页页面传值
- 转:性、恐惧、爱、信念,管理者一生都逃不掉的课题
- 地震点、火点和气候数据收集
- 计算机科学第三讲——布尔逻辑和逻辑门
- 胡凡算法之——快速幂
- 万兆局域网方案_家庭基础万兆网络——最简单的方案