入门算法学习,看的第一本是深入浅出的《算法图解》一书,本博客是对《算法图解》一书的学习笔记,将书中的分享的算法示例用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

【算法图解】 之 [贪婪算法(贪心算法)] 详解相关推荐

  1. 蓝桥杯 试题 算法训练 无聊的逗 C++ 详解 - 未完善

    题目: 逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中.不过他想到了一个游戏来使他更无聊.他拿出n个木棍,然后选出其中一些粘成一根长的,然后再选一些粘成另一个长的,他想知道在两根一样长的 ...

  2. JAVA中希尔排序去的讲解_java 中基本算法之希尔排序的实例详解

    java 中基本算法之希尔排序的实例详解 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shel ...

  3. EM算法(Expectation Maximization Algorithm)详解

    EM算法(Expectation Maximization Algorithm)详解 主要内容 EM算法简介 预备知识  极大似然估计 Jensen不等式 EM算法详解  问题描述 EM算法推导 EM ...

  4. 蓝桥杯 试题 算法训练 无聊的逗 C++ 详解

    题目: 逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中.不过他想到了一个游戏来使他更无聊.他拿出n个木棍,然后选出其中一些粘成一根长的,然后再选一些粘成另一个长的,他想知道在两根一样长的 ...

  5. 【JVM】对象存活判定算法、GC算法、STW、GC种类详解

    [JVM]对象存活判定算法.GC算法.STW.GC种类详解 文章目录 [JVM]对象存活判定算法.GC算法.STW.GC种类详解 GC主要关注的区域 垃圾标记阶段:对象存活判断 标记阶段:引用计数算法 ...

  6. 【目标检测算法-锚框公式推导及代码详解】

    目标检测算法-锚框公式推导及代码详解 0 沐神对锚框的宽高计算并未推导以及讲解 1 锚框宽高公式推导 1.1 基础概念 1.2 锚框宽高公式推导 1.3 图片验证计算 1.4 小结 2 代码详解 2. ...

  7. 大白话解析Apriori算法python实现(含源代码详解)

    大白话解析Apriori算法python实现(含源代码详解) 一.专业名词解释 二.算法思路 三.python代码实现 四.Aprioir的优点.缺点及改进方法 本文为博主原创文章,转载请注明出处,并 ...

  8. java贪心算法 区间调度_贪心算法-区间调度问题解之证明(示例代码)

    一.贪心算法 定义:一个算法是贪心算法,如果它是通过一些小的步骤来一个求解,并且在每一步根据局部情况选择一个决定,使得某些主要的指标得到优化. 二.区间调度问题 1. 问题:我们有一组需求{1,2,3 ...

  9. 疯子的算法总结(四)贪心算法

    一.贪心算法 解决最优化问题的算法一般包含一系列的步骤,每一步都有若干的选择.对于很多最优化问题,只需要采用简单的贪心算法就可以解决,而不需要采用动态规划方法.贪心算法使所做的局部选择看起来都是当前最 ...

  10. _28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II 、55.跳跃游戏、45.跳跃游戏II

    _28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II .55.跳跃游戏.45.跳跃游戏II 题目列表 122.买卖股票的最佳时机II 55.跳跃游戏 45 ...

最新文章

  1. 实时双频Wi-Fi如何实现下一代车内连接
  2. One-hot encoding的不足及改进
  3. linux开机启动遇到grub启动_Linux如何跳过grub启动
  4. SQL 存储过程 解析XML
  5. r语言逻辑向量相加_R语言基础教程——第3章:数据结构——向量
  6. foreach 实现 MyBatis 遍历集合与批量操作数据
  7. 前端学习(3196):虚拟dom和真实dom
  8. hello python_Python-Hello world!
  9. eclipse中使用git回到之前的版本
  10. Codeforces 797B - Odd sum
  11. python下载哪个版本好-究竟哪个版本的Python是最快的?
  12. 在linux下安装gaussian09
  13. 荣耀总裁赵明揭秘华为薪酬制度:不看资历,只看贡献
  14. 二路归并排序算法c语言实现,二路归并排序算法实现-完整C语言程序
  15. 利用dialogArguments进行网页页面传值
  16. 转:性、恐惧、爱、信念,管理者一生都逃不掉的课题
  17. 地震点、火点和气候数据收集
  18. 计算机科学第三讲——布尔逻辑和逻辑门
  19. 胡凡算法之——快速幂
  20. 万兆局域网方案_家庭基础万兆网络——最简单的方案

热门文章

  1. 平台如何跨越Low-Code与Pro-Code鸿沟
  2. 暖通空调系统智能化故障检测诊断研究综述与展望
  3. 网络游戏开发流程管理
  4. ReflectionClass
  5. MyBatis的sql动态传入表名和字段名,并判断是否为空
  6. 如果你也准备踏入网络安全行业,收藏这一篇就够了(内含282G网络安全资料)
  7. 8 个长寿的免费网络硬盘
  8. 神经网路:pytorch中Variable和view参数解析
  9. 20189312任方园《网络攻防》第十次作业
  10. 【Jquery泛舟】巧用jqGrid+fine-uploader等利器打造完美的用户管理模块