《算法图解》总结第 8 章:贪婪算法

2023-10-30

仅用于记录学习,欢迎批评指正,大神勿喷

系列文章目录

《算法图解》总结第 1 章:二分查找、大O表示法;
《算法图解》总结第 2 章:数组和链表,选择排序;
《算法图解》总结第 3 章:while循环、递归、栈;
《算法图解》总结第 4 章:分而治之、快速排序;
《算法图解》总结第 5 章:散列表;
《算法图解》总结第 6 章:广度优先搜索;
《算法图解》总结第 7 章:狄克斯特拉算法;
《算法图解》总结第 8 章:贪婪算法
《算法图解》总结第 9 章:动态规划
《算法图解》总结第 10 章:K最近邻算法
《算法图解》总结第 11 章:十种算法简介


贪婪算法

贪婪算法很简单:每步都采取最优的做法,用专业术语来说,就是每步都选择局部最优解,最终得到的就是全局最优解。(贪婪算法并非在任何情况下都行之有效,第7章乐谱换架子鼓就是一个典型例子。)
贪婪算法有时不能获得最优解,但是非常接近,有时你只需找到一个能够大致解决问题的算法,此时就可使用贪婪算法,这是一种近似算法。近似算法判断优劣的标准:
(1)速度有多快;
(2)得到的近似解与最优解的接近程度;
贪婪算法优点:易于实现,运行速度快,是不错的近似算法。

补充知识

并集、交集、差集
和数学中学的一样,这里作补充的是实现代码(Python),直接借用例子进行说明。
案例:

fruits = set(["avocado","tomato","banana"])
vegetables = set(["beets","carrots","tomato"])

并集:将集合合并

fruits | vegetables

输出结果:

{'avocado', 'banana', 'beets', 'carrots', 'tomato'}

交集:找出两个集合中都有的元素

fruits & vegetables

输出结果:

{'tomato'}

差集:从一个集合中剔除出现在另一个集合中的元素

fruits - vegetables

输出结果:

{'avocado', 'banana'}

应用案例:集合覆盖问题

案例:假设办个广播节目,要让全美50个州的听众都收听到,为支付较低的费用,尽量选择尽可能少的广播台播出。以下图为例,每个广播台能覆盖的特定区域,不同广播台的覆盖区域可能重叠。
在这里插入图片描述
将上图整理成表,显示如下:
在这里插入图片描述

案例分析

第一步:创建一个列表,包含要覆盖的州,要用集合来表示,集合类似于列表,但是集合中不能包含重复的元素

states_needed = set(["mt","wa","or","id","nv","ut","ca","az"])

第二步:创建一个散列表,表示可供选择的广播台清单

stations = {}
stations["kone"]= set(["id","nv","ut"])
stations["ktwo"]= set(["wa","id","mt"])
stations["kthree"]= set(["or","nv","ca"])
stations["kfour"]= set(["nv","ut"])
stations["kfive"]= set(["ca","az"])

第三步:定义一个集合来存储最终选择的广播台

final_stations = set()

第四步:贪婪算法实现

# 只要州还没覆盖完,一直执行while循环
while states_needed:
    # 定义最初最好的广播台
    best_station = None
    # 定义一个集合,存储已经覆盖的州
    states_covered = set()
    ''' 
    for循环迭代每个广播台,并确定它是否是最佳,items()存储键值(广播台和相应的覆盖州)
    即每次仅能确定一个最佳的广播台
    '''
    for station,states_from_station in stations.items():
        # 需要覆盖的州和当前该广播台能覆盖的州的交集
        covered = states_needed & states_from_station 
        # 如果当前广播台州交集的个数大于当前要覆盖的州
        if len(covered) > len(states_covered):
            # 就替换为最佳的广播台
            best_station = station
            # 替换已经覆盖的州
            states_covered = covered
    # for循环结束一次后,要从需要覆盖的州中减去已经覆盖过的州
    states_needed -= states_covered 
    # 打印剩余需要覆盖的州
    print('states_needed:',states_needed)
    '''
    添加最佳的广播台,并开始下一轮新的while循环直至需要覆盖的州为空 
    (注:新一轮while循环中的best_station和states_covered不是for循环后的,还是while循环中最初定义
    的那些,因为for循环只是while循环中的一块,这个必须想明白)
    '''  
    final_stations.add(best_station)   
print(final_stations)

输出结果

F:\anaconda\python.exe E:/lecode/tanlan.py  # 代码存储位置,方便自己下次找到  
states_needed: {'or', 'az', 'ca', 'wa', 'mt'}
states_needed: {'or', 'az', 'ca'}
states_needed: {'az'}
states_needed: set()
{'ktwo', 'kone', 'kthree', 'kfive'}

NP完全问题

定义

NP完全问题的简单定义是以难解著称的问题,如集合覆盖问题和旅行商问题,这两个问题的共同之处在于我们需要计算所有的解,并从中选择最小或者最短的那个,感兴趣的同学可以去 了解一下旅行商问题。这是一类很多聪明人都认为,根本不可能编写出可快速解决这些问题的算法。

如何识别NP完全问题

我们为什么会关注到NP完全问题的识别这个问题呢?若我们能识别出一个问题是NP完全问题,那么我们就可以用近似求解的方法去解决这个问题,而不用再去费力去求解完美解了。尽管我们没有办法判断某个问题是不是NP完全问题,但是还是有一些蛛丝马迹可引导我们做出判断:
(1)元素较少时算法的运行速度非常快,但随着元素数量的增加,速度会变得非常慢;
(2)涉及“所有组合”的问题通常是NP完全问题;
(3)不能将问题分成小问题,必须考虑各种可能的情况,这可能是NP完全问题;
(4)如果问题涉及序列(如旅行商问题中的城市序列)且难以解决,它可能就是NP完全问题;
(5)如果问题涉及集合(如广播台集合)且难以解决,它可能就是NP完全问题;
(6)如果问题可转换为集合覆盖问题或旅行商问题,那它肯定就是NP完全问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《算法图解》总结第 8 章:贪婪算法 的相关文章

  • Python Pandas 滚动聚合一列列表

    我有一个简单的数据框 df 和一列列表lists 我想根据以下内容生成一个附加列lists The df好像 import pandas as pd lists 1 1 2 1 2 3 3 2 9 7 9 4 2 7 3 5 create
  • 在函数内的 for 循环上使用 tqdm 来检查进度

    我正在使用 for 循环迭代目录树内的一大组文件 这样做时 我想通过控制台中的进度条来监视进度 因此 我决定使用 tqdm 来实现此目的 目前 我的代码如下所示 for dirPath subdirList fileList in tqdm
  • GUI 测试工具 PyUseCase 与 Dogtail 相比如何?

    GUI测试工具如何Py用例 http pypi python org pypi PyUseCase重命名为故事文本 http pypi python org pypi StoryText 相比于Dogtail http en wikiped
  • 如何同时运行多个功能[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有以下代码 my func1 my func2 my func3 my func4 my func5 是否可以同时计算函数的数据 而
  • 从内存地址创建python对象(使用gi.repository)

    有时我需要调用仅存在于 C 中的 gtk gobject 函数 但返回一个具有 python 包装器的对象 之前我使用过基于 ctypes 的解决方案 效果很好 现在我从 PyGtk import gtk 切换到 GObject intro
  • 使用管理员权限打开cmd(Windows 10)

    我有自己的 python 脚本来管理我的计算机上的 IP 地址 它主要在命令行 Windows 10 中执行netsh命令 您必须具有管理员权限 这是我自己的计算机 我是管理员 运行脚本时我已经使用管理员类型的用户 Adrian 登录 我无
  • 如何通过 python 中的函数运行列表?

    我试图通过我创建的函数运行我的列表 但不断收到错误 我不知道出了什么问题 温度 F temp f 19 21 21 21 23 功能 def fahrToCelsius tempFahrenheit return tempFahrenhei
  • 动态字段取决于 WTForms 的先前字段

    我正在使用 WTForms 制作表格 目前 我有这个 class UploadForm flask wtf Form fichier wtforms fields FileField u Fichier description wtform
  • 如何用函数记录一个文件?

    我有一个带有函数 lib py 但没有类的python 文件 每个函数都有以下样式 def fnc1 a b c This fonction does something param a lalala type a str param b
  • 如何找到多个 pandas 数据框中一对列与任意顺序对的交集?

    我有多个 pandas 数据框 为了简单起见 假设我有三个 gt gt df1 col1 col2 id1 A B id2 C D id3 B A id4 E F gt gt df2 col1 col2 id1 B A id2 D C id
  • 为什么需要设置WORKON_HOME环境变量?

    我已经有一段时间没有使用 python 虚拟环境了 但我也安装了虚拟环境包装器 我的问题是 在文档页面中它说要这样做 export WORKON HOME Envs mkdir p WORKON HOME source usr local
  • 获取 Keras model.summary() 作为表

    我在 Keras 中创建了相当大的模型 我正在用 LaTeX 写一篇关于它的文章 为了很好地描述 LaTeX 中的 keras 模型 我想用它创建一个 LaTeX 表 我可以手动实现它 但我想知道是否有任何 更好 的方法来实现这一点 我四处
  • 列表推导式和 for 循环中的 Lambda 表达式[重复]

    这个问题在这里已经有答案了 我想要一个 lambda 列表 作为一些繁重计算的缓存 并注意到这一点 gt gt gt j for j in lambda i for i in range 10 9 9 9 9 9 9 9 9 9 9 Alt
  • 如何通过selenium中弹出的身份验证?

    我正在尝试使用带有 Selenium 的 Python 脚本加载需要身份验证的网页 options webdriver ChromeOptions prefs download default directory r download de
  • 如何检测一个二维数组是否在另一个二维数组内?

    因此 在堆栈溢出成员的帮助下 我得到了以下代码 data needle s which is a png image base64 code goes here decoded data decode base64 f cStringIO
  • 类返回语句不打印任何输出

    我正在学习课程 但遇到了问题return语句 它是语句吗 我希望如此 程序什么也没有打印出来 它只是结束而不做任何事情 class className def createName self name self name name def
  • 从给定的项目列表创建子列表

    我首先要说的是以下问题不是为了家庭作业目的即使因为我几个月前就完成了软件工程师的工作 无论如何 今天我正在工作 一位朋友向我询问了这个奇怪的排序问题 我有一个包含 1000 行的列表 每行代表一个数字 我想创建 10 个子列表 每个子列表都
  • AWS 将 MQTT 消息存储到 DynamoDB

    我构建了一个定期发送 MQTT 消息的 python 脚本 这是发送到后端的 JSON 字符串 Id 1234 Ut 1488395951 Temp 22 86 Rh 48 24 在后端 我想将 MQTT 消息存储到 DynamoDB 表中
  • Chrome 驱动程序和 Chromium 二进制文件无法在 aws lambda 上运行

    我陷入了一个问题 我需要在 AWS lambda 上做一些抓取工作 所以我按照下面提到的博客及其代码库作为起点 这非常有帮助 并且在运行时环境 Python 3 6 的 AWS lambda 上对我来说工作得很好 https manivan
  • 从 Django 运行 shell 命令

    我正在 Django 中开发一个网页 使用 apache 服务器 需要调用 shell 命令来启用 禁用一些守护进程 我尝试这样做 os system service httpd restart 1 gt HOME out 2 gt HOM

随机推荐

  • 广点通sdk接入 _橱窗广告

    广点通sdk接入 橱窗广告 1 导入相关架包 写入相关权限和配置 android query full 0 26 7 jar GDTUnionSDK 4 8 513 jar
  • 【Elasticsearch学习笔记-基础篇3】Elasticsearch 聚集(aggregation)与过滤器(filter)

    前言 这篇主要总结一下 es 的聚集 aggregation 与过滤器 filter 不会涉及到具体的 API 操作与示例 主要总结概念性与本人理解的内容 以下是主要内容地图 在写聚集之前 我们先来看一下过滤器 过滤器 Filter 首先
  • linux安装odoo10,Centos7部署Odoo10生产环境

    该篇文章是我参考网上教程 整理出适合自己使用的方法 是通过odoo10的rpm包进行安装 一 安装odoo10 1 安装相关依赖 yum update yum install wget yum install y epel release
  • Spring Data JPA教程:审计(二)

    公众号 欢迎关注 书接上文 本文解决前面两个问题中的第二个问题 我们将为实体加上创建者和修改者的信息 首先创建一个返回授权用户信息的组件 获取授权用户信息 Spring Data JPA使用AuditorAware
  • c++基础——区分引用和指针

    目录 前言 1 引用 1 2引用的概念 1 2引用的定义 1 3引用与const 1 4引用的使用场景 2 指针 2 1概念 2 2获取对象的地址 2 3利用指针访问对象 2 3空指针 2 4野指针 2 4 1概念 2 4 2野指针的产生
  • Vs2019+Qt

    一 下载vs2019和qt 关于vs2019的配置方法不在赘述 上一篇已经讲解了 点击传送门 1 下载vs2019 直接在官网点击下载即可 是免费的 2 下载qt 在官网站下载即可 关于vs和qt安装 vs2019安装到自定义的目录就行 根
  • javascript 中函数调用方法:apply() 和 call()

    每个函数都包含两根非继承而来的方法 apply 和call 这两个方法的用途都是在特定的作用域中调用函数 实际上等于设置函数体内this对象的值 首先 apply 方法接收两个参数 一个是在其中运行函数的作用域 另一个是参数数组 其中第二个
  • Nacos - nacos-mysql.sql源文件与application.properties配置文件

    目录标题 前言 内容 初始化 MySQL 数据库 application properties 配置 前言 Nacos设置外部数据源 需要初始化nacos mysql sql源文件 修改application properties配置文件
  • android游戏开发(OpenGL ES绘制矩形平面)

    接触android将近一年了 以前学的应用开发 现在自学android游戏开发 把自己学到的分享出来一下 这也是我的第一篇博客 不说废话了 开始正文 GLRender类用于图形的渲染工作 Util类用于glrender中的数据缓冲 GLRe
  • 信号与中断的区别

    信号与中断的相似点 1 采用了相同的异步通信方式 2 当检测出有信号或中断请求时 都暂停正在执行的程序而转去执行相应的处理程序 3 都在处理完毕后返回到原来的断点 4 对信号或中断都可进行屏蔽 信号与中断的区别 1 中断有优先级 而信号没有
  • R:增加或删除列表元素

    列表创建之后可以添加新的组件 gt z lt list a abc b 12 gt z c lt Add gt z a 1 abc b 1 12 c 1 Add 还可以直接使用索引添加组件 gt z lt list a abc b 12 c
  • 深入了解java.lang.ArrayIndexOutOfBoundsException异常

    异常介绍 什么是异常 在编程过程中 异常是指在程序执行期间发生的意外或异常情况 当程序遇到异常时 会中断正常的执行流程 并且根据异常类型采取相应的处理措施 异常的分类 异常可以分为两种类型 受检异常 Checked Exception 和非
  • 在职阿里6年,一个29岁女软件测试工程师的心声

    简单的先说一下 坐标杭州 14届本科毕业 算上年前在阿里巴巴的面试 一共有面试了有6家公司 因为不想请假 因此只是每个晚上去其他公司面试 所以面试的公司比较少 其中成功的有4家 另外2家失败的原因在于 1 对于系统知识的了解不够全面 在最后
  • 【华为OD机试真题 JAVA】数组连续和

    JS版 华为OD机试真题 JS 数组连续和 标题 数组连续和 时间限制 1秒 内存限制 65536K 语言限制 不限 给定一个含有N个正整数的数组 求出有多少个连续区间 包括单个正整数 它们的和大于等于x 输入描述 第一行两个整数N x 0
  • Android自定义view之View的测量过程全解析

    Android 应用层开发中绕不开自定义 View 这个话题 虽然现在 Github 上有形形色色的开源库供大家使用 但是作为一名开发者而言 虽然不提倡重复造轮子 但是轮子都是造出来的 碰到一些新鲜的 UI 效果时 如果现有的控件无法完成任
  • 【零基础学QT】第九章 窗口美化QSS的使用

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏目录 零基础学QT 文章导航篇 专栏资料 https pan baidu com s 192A28BTIYFHmixRcQwmaHw 提取码 qtqt 点
  • 谈谈阿里与谷歌的Java开发规范

    无规矩不成方圆 编码规范就如同协议 有了Http TCP等各种协议 计算机之间才能有效地通信 同样的 有了一致的编码规范 程序员之间才能有效地合作 道理大家都懂 可现实中的我们 经常一边吐槽别人的代码 一边写着被吐槽的代码 究其根本 就是缺
  • 黑窗口DOS命令

    常用命令 操作 说明 盘符名称 盘符切换 E 回车 表示切换到E盘 dir 查看当前路径下的内容 cd目录 进入单级目录 cd itheima cd 回退到上一级目录 cd目录1 目录2 进入多级目录 cd itheima javaSE c
  • excel

    1 按照xxx以列化分 按照 分为一列 选中 数据 分列 分隔符号 下一步 其他 点击完成
  • 《算法图解》总结第 8 章:贪婪算法

    仅用于记录学习 欢迎批评指正 大神勿喷 系列文章目录 算法图解 总结第 1 章 二分查找 大O表示法 算法图解 总结第 2 章 数组和链表 选择排序 算法图解 总结第 3 章 while循环 递归 栈 算法图解 总结第 4 章 分而治之 快