《算法图解》总结第 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:查找围绕某个 GPS 位置的圆的 GPS 坐标的优雅方法

    我有一组以十进制表示的 GPS 坐标 并且我正在寻找一种方法来查找每个位置周围半径可变的圆中的坐标 这是一个例子 http green and energy com downloads test circle html我需要什么 这是一个圆
  • 使用 python requests 模块时出现 HTTP 503 错误

    我正在尝试发出 HTTP 请求 但当前可以从 Firefox 浏览器访问的网站响应 503 错误 代码本身非常简单 在网上搜索一番后我添加了user Agent请求参数 但也没有帮助 有人能解释一下如何消除这个 503 错误吗 顺便说一句
  • 元组有什么用?

    我现在正在学习 Python 课程 我们刚刚介绍了元组作为数据类型之一 我阅读了它的维基百科页面 但是 我无法弄清楚这种数据类型在实践中会有什么用处 我可以提供一些需要一组不可变数字的示例吗 也许是在 Python 中 这与列表有何不同 每
  • 如何用python脚本控制TP LINK路由器

    我想知道是否有一个工具可以让我连接到路由器并关闭它 然后从 python 脚本重新启动它 我知道如果我写 import os os system ssh l root 192 168 2 1 我可以通过 python 连接到我的路由器 但是
  • Python 中的哈希映射

    我想用Python实现HashMap 我想请求用户输入 根据他的输入 我从 HashMap 中检索一些信息 如果用户输入HashMap的某个键 我想检索相应的值 如何在 Python 中实现此功能 HashMap
  • 如何使用 opencv.omnidir 模块对鱼眼图像进行去扭曲

    我正在尝试使用全向模块 http docs opencv org trunk db dd2 namespacecv 1 1omnidir html用于对鱼眼图像进行扭曲处理Python 我正在尝试适应这一点C 教程 http docs op
  • Python zmq SUB 套接字未接收 MQL5 Zmq PUB 套接字

    我正在尝试在 MQL5 中设置一个 PUB 套接字 并在 Python 中设置一个 SUB 套接字来接收消息 我在 MQL5 中有这个 include
  • 独立滚动矩阵的行

    我有一个矩阵 准确地说 是 2d numpy ndarray A np array 4 0 0 1 2 3 0 0 5 我想滚动每一行A根据另一个数组中的滚动值独立地 r np array 2 0 1 也就是说 我想这样做 print np
  • 立体太阳图 matplotlib 极坐标图 python

    我正在尝试创建一个与以下类似的简单的立体太阳路径图 http wiki naturalfrequent com wiki Sun Path Diagram http wiki naturalfrequency com wiki Sun Pa
  • 在Python中连接反斜杠

    我是 python 新手 所以如果这听起来很简单 请原谅我 我想加入一些变量来生成一条路径 像这样 AAAABBBBCCCC 2 2014 04 2014 04 01 csv Id TypeOfMachine year month year
  • Python beautifulsoup 仅限 1 级文本

    我看过其他 beautifulsoup 得到相同级别类型的问题 看来我的有点不同 这是网站 我正试图拿到右边那张桌子 请注意表的第一行如何展开为该数据的详细细分 我不想要那个数据 我只想要最顶层的数据 您还可以看到其他行也可以展开 但在本例
  • 如何在不丢失注释和格式的情况下更新 YAML 文件 / Python 中的 YAML 自动重构

    我想在 Python 中更新 YAML 文件值 而不丢失 Python 中的格式和注释 例如我想改造 YAML 文件 value 456 nice value to value 6 nice value 界面类似于 y yaml load
  • “隐藏”内置类对象、函数、代码等的名称和性质[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我很好奇模块中存在的类builtins无法直接访问的 例如 type lambda 0 name function of module
  • 在Python中检索PostgreSQL数据库的新记录

    在数据库表中 第二列和第三列有数字 将会不断添加新行 每次 每当数据库表中添加新行时 python 都需要不断检查它们 当 sql 表中收到的新行数低于 105 时 python 应打印一条通知消息 警告 数量已降至 105 以下 另一方面
  • 如何使用 pybrain 黑盒优化训练神经网络来处理监督数据集?

    我玩了一下 pybrain 了解如何生成具有自定义架构的神经网络 并使用反向传播算法将它们训练为监督数据集 然而 我对优化算法以及任务 学习代理和环境的概念感到困惑 例如 我将如何实现一个神经网络 例如 1 以使用 pybrain 遗传算法
  • Python3 在 DirectX 游戏中移动鼠标

    我正在尝试构建一个在 DirectX 游戏中执行一些操作的脚本 除了移动鼠标之外 我一切都正常 是否有任何可用的模块可以移动鼠标 适用于 Windows python 3 Thanks I used pynput https pypi or
  • 仅第一个加载的 Django 站点有效

    我最近向 stackoverflow 提交了一个问题 标题为使用mod wsgi在apache上多次请求后Django无限加载 https stackoverflow com questions 71705909 django infini
  • python import inside函数隐藏现有变量

    我在我正在处理的多子模块项目中遇到了一个奇怪的 UnboundLocalError 分配之前引用的局部变量 问题 并将其精简为这个片段 使用标准库中的日志记录模块 import logging def foo logging info fo
  • Python ImportError:无法导入名称 __init__.py

    我收到此错误 ImportError cannot import name life table from cdc life tables C Users tony OneDrive Documents Retirement retirem
  • 将 Python 中的日期与日期时间进行比较

    所以我有一个日期列表 datetime date 2013 7 9 datetime date 2013 7 12 datetime date 2013 7 15 datetime date 2013 7 18 datetime date

随机推荐

  • 广点通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 章 分而治之 快