贪婪算法回顾

回顾

还记的贪婪算法么? 如果你不记得了, 看了下面这个例子你一定会想起来, 因为这个例子太普遍了, 几乎每个将贪婪算法的地方, 第一个例子都是它, 言归正传.

问题: 现在有如下课程表, 要将这些课尽可能多的安排在教室A内.

课程名开始时间结束时间
语文课9:0010:00
数学课9:3010:30
音乐课10:0011:00
政治课10:3011:30
美术课11:0012:00

首先将所有课程都安排在教师A是不现实的, 因为时间上存在冲突. 那改怎么安排呢?

这个问题很难, 对吧. 算了, 至少我第一次看的时候, 完全没有头绪. 但看了下面的思路, 你又会发现, 啊?这么简单么?

具体思路

  1. 选出结束时间最早的课程, 将它加到教室A的第一节课
  2. 找出在当前教室A最后一节课的结束时间之后开始, 并且结束时间最早的课程, 将其加到教室A的课表中
  3. 重复步骤2

经过上面的步骤, 得出的课表为:

课程名开始时间结束时间
语文课9:0010:00
音乐课10:0011:00
美术课11:0012:00

如何, 是不是感觉这个算法太简单了, 简单到我都不敢相信最终的结果是正确的.

但是这正是贪婪算法的优点, 简单, 容易实施.

贪婪算法的思想就是(个人理解), 每一步都找到当前状态的最优解, 继续.

显然,贪婪算法并不总是能够找到最优解

来了, 又来了, 又是一个被用烂了的例子, 但我就是要用, 哼.

问题: 现在有一个小偷, 带着一个可以装35kg重东西的包包, 他要将最贵重的东西带走, 那么, 贪婪算法思路如下:

  1. 将可装下的最贵的东西装入背包
  2. 重复步骤1

但是, 如果物品如下:

  1. 物品A: 价值300, 重量30kg
  2. 物品B: 价值200, 重量20kg
  3. 物品C: 价值150, 重量15kg

按照上面的思路, 装入的内容为: 物品A, 总价值300

但是, 很显然, 如果装入的是: 物品B+物品C, 总价值350

这时, 贪婪算法找出的就不是最优解了.

如果换一种思路呢?

  1. 将可装下的最轻的东西装入背包
  2. 重复步骤2

你很惊喜的发现, 结果就是我们要的, 但是, 不好意思, 这只是这种情况下的满足.

如果换一种情况呢? 如果物品A价值是500, 其它条件不变呢?

很显然, 在这里, 物品有价值和重量两个值需要考量, 并不能够单单拿出一个来进行判断(之前的教室问题只需要考虑时间), 需要综合考虑.

其实我个人觉得, 这个例子举得并不恰当, 这种问题本就不适合使用贪婪算法来进行求解. 但是到处都用这个例子, 那我就用吧, 因为我也想不出更好的例子了…

最终的结果虽然不是最优解, 但是也比较接近了. 主要是算法简单啊

总结

贪婪算法是不是感觉优点动态规划的意思? 没错, 贪婪算法可以说是动态规划的一种特例,也就是说, 所有使用贪婪算法能够解决的问题都可以通过动态规划来解决, 但是反过来并不成立.

其实, 贪婪算法个人感觉并不能叫做贪婪算法, 应该叫贪婪思想, 嘿嘿. 因为它并不是一个具体的算法, 而是一种解决问题的思路:

每一步都寻找当前状态的最有解(局部最优解), 最终得到的就是由所有局部最优解组成的全局最优解, 或接近全局最优解的解

有点只顾眼前利益, 不看长远利益的感觉哈. 这种思路听起来, 简单、容易实现, 甚至简单到让人怀疑他的正确性, 你的怀疑是对的, 并不是每次局部最优解的组合就是全局最优解, 但他的优点就是简单啊, 而且对于上面第一个例子中这样的方法就很好的解决了.

最后, 贪婪算法, 重点在于一个贪字, 哈哈, 请记住贪婪算法的精髓就是

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508482.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【安全】基础概念梳理-基本加密方式、数字签名、证书

一、两种基本加密方式 1.1 对称加密 对称加密是指双方持有相同的密钥进行通信,加密速度快。常见的对称加密算法有DES、3DES、AES等。存在问题:通信双方如何获得相同的密钥? 1.2 非对称加密 非对称加密,又称为公开密钥加密&#…

PHP 自动加载

回顾 开始的时候, 如果想在一个php文件中使用其它文件的类或方法, 需要通过include/require方法将文件包含进来. 这种方法的缺点也很明显: 如果需要引入很多文件, 就需要很多的include语句, 不仅不美观, 而且也难免会又遗漏如果多个文件中定义了相同名称的常量, 会导致抛出重…

【坑】云相关

1. NAT NAT(Network Address Translation,网络地址转换:当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但又想和因特网上的主机通信(并不需要加密&…

Pycharm 2019 添加 docker 解释器

打开docker的tls 点击设置: 搜索docker, 添加: 点击解释器选项 添加 选择docker 这里说缺少映射, 先不管 接下来, 创建一个新项目, 在选择解释器的时候, 如果选择刚刚添加的, 会报错, 先选一个能用的, 进到项目再换 在右下角的解释器小部件, 选择我们刚刚添加的 然后就可以正常…

【待补】Wireshark+BLE dongle: BLE数据包捕获以及分析

文章目录前言1. 捕获BLE数据包2. 分析BLE数据包2.1 过滤掉不感兴趣的BLE数据包2.2 利用Wireshark内嵌工具生成图表前言 硬件:Nordic 52840 dongle 软件: Wireshark 1. 捕获BLE数据包 待补充。 2. 分析BLE数据包 2.1 过滤掉不感兴趣的BLE数据包 以自…

js动态添加div

问题 有没有遇到过这样的需求, 在页面上会有不定个input, 点击添加按钮就添加 每次写这玩意好麻烦啊, 把他封装起来, 需要的时候调用就好了 思路 因为每个input标签的name如果相同的话, 在后端接收的时候会出错, 所以我的解决办法就是在name后加上一个数字, 后端用一个循环进…

【坑】Sketch算法——Count-Min Sketch和Universal Sketch

文章目录参考链接一、Sketch算法用来做什么?二、Min-count sketch基础思想:进阶:特点:三、Universal Sketch参考链接 [1] Count-Min Sketch: https://blog.csdn.net/pipisorry/article/details/64126199 [2] Cormode G, Muthukrishnan S. An improved …

css中的单位

前端开发中, 做适配是少不了的, 这就用到了css中的各种长度单位, 做一下总结 在css中, 长度单位分为以下几种 绝对单位: px、in、cm、mm、pt、pc百分比单位: vw、vh、vmin、vmax、%相对单位: em、rem、ex、ch 各单位介绍 px 不用过多介绍, 精确像素 in 寸 cm 厘米 mm…

【5G入门】MCS调制编码方案简介

​ 目录参考资料:1. MCS简介MCS是什么如何选择MCS有哪些MCS可供选择如何配置MCS示例参考资料: 链接: 5G NR Modulation and Coding Scheme – Modulation and Code Rate. 1. MCS简介 MCS是什么 MCS(Modulation and Coding Scheme&#xf…

caffe初体验

caffe是一个深度学习的框架, 具体我也不太清楚, 可以自行百度吧, 我也是刚刚知道有这么一个框架, 才疏学浅啊. 在安装完caffe, 我的第一个想法就是, 别管他是个啥东西, 总得先让我运行一些看一看吧. 刚好, 官方就准备了一些数据, 供我们运行一下看一看使用. 因为我是通过dock…

【安全】进阶的Mosquitto:搭建一个安全的MQTT服务

目录一、基础版Mosquitto安装及运行Mosquitto安装Mosquitto运行二、基础安全版Mosquitto安装及运行(需要输入密码)Mosquitto安装Mosquitto配置Mosquitto测试效果三、安全版Mosquitto安装及运行Mosquitto安装TLS安装Mosquitto配置Mosquitto测试效果注意一…

PHP注释标记整理

什么是注释标记 我们在平常写代码或看别人写的代码时, 在方法的说明注释中经常会有这样的注释: /*** param $num* return array*/上面的*param* return 就是注释标记 注释标记用于生成文档, param指明需要接收的参数, return指明返回值 在使用 phpDocumentor 等工具生成文档…

PHP 循环引用的问题

问题 为了引出问题, 先来看下面一段代码: <?php $arr [a, b,c, d, ];foreach ($arr as &$each){echo $each; } echo PHP_EOL; foreach ($arr as $each){echo $each; }这段代码很简单, 输出数组的元素两次, 感觉会输出两次 abcd? 不好意思, 输出结果如下:  是不是感…

redis常规命令记录

概述 因为redis是单线程执行&#xff0c;所以不用关心并发问题。 简单记录一下redis的操作命令&#xff0c;留作查阅&#xff0c;回头再整理一下事物等操作。 reids中存储的是kev-value形式, 其中的value有几种: 字符串: 就是简单的string 字符串列表: 有序可重的列表 字符…

代码整洁之道-函数

什么是一个好的函数或者叫方法&#xff0c;只要能让函数明确的表达其意图&#xff0c;让读者能够一眼看出是一个怎样的函数&#xff0c;其接收什么参数&#xff0c;返回什么结果&#xff0c;做了什么事情。能做到这&#xff0c;大概就能算作一个好的函数了&#xff0c;看上去很…

代码整洁之道-格式

对于代码的格式&#xff0c;每个人都有不同的代码风格&#xff0c;这没什么。但是对于一个团队来说&#xff0c;最好能够统一代码风格&#xff0c;在同一个项目中&#xff0c;如果到处充斥着不同的代码风格&#xff0c;相比读起来并不是那么让人舒适&#xff0c;比如在什么地方…

代码整洁之道-对象和数据结构

现在&#xff0c;有一个计算面积的需求&#xff0c;其中一种实现如下&#xff1a; class Square{public $side; } class Geometry{public function area($shape){if($shape instanceof Square){return $shape->side * $shape->side;}return 0;} }有人看了&#xff0c;你…

代码整洁之道-类

在面向对象的编程中&#xff0c;类是其中的基本单位&#xff0c;就像面向过程中的函数一样。所以在说类时&#xff0c;可以借鉴一下前面的函数&#xff0c;不如只做一件事&#xff0c;也就是所说的单一职责。 函数应该短小&#xff0c;对于类来说&#xff0c;也是这样。函数的…

Deepin nginx lumen配置

Deepin nginx lumen配置 正常安装 sudo apt install nginx sudo apt install php-fpm 启动后将 /etc/nginx/sites-enabled/default 配置文件 copy一份到 /etc/nginx/conf.d/lumen_demo.conf 然后按照该配置文件改改&#xff0c;修改后的配置文件如下&#xff1a; server {lis…

代码整洁之道小结

以下总结一些不好的代码规范&#xff0c; 借此警示自己不要犯这种错误 注释 1.不恰当的注释 注释应该仅用来描述有关代码和设计的技术性信息。像修改历史等信息不应出现在注释中 2.废弃的注释 过时、无关或错误的注释就是废弃的注释&#xff0c;不要写这种注释&#xff0c…