35.浅谈贪心算法

概述

相信大家或多或少都对贪心算法有所耳闻,今天我们从一个应用场景展开

假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号?

广播台覆盖地区
k1北京、上海、天津
k2广州、北京、深圳
k3成都、上海、杭州
k4上海、天津
k5杭州、大连
  1. 贪心算法是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法;
  2. 贪心算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。

思路分析

如何找出覆盖所有地区的广播台的集合呢,使用穷举法实现,列出每个可能的厂播台的集合,这被称为幂集。假设总的有n个广播台,则广播台的组合总共有2” -1 个,假设每秒可以计算10个子集,如:

广播台数量子集总数2n需要的时间
5323.2秒
101024102.4秒
32429496729613.6年
1001.2676506e+304*1023

可以看出,对于组合问题,采用穷举法的代价太高了。对于此类问题,我们通常采用贪心算法:
目前并没有算法可以快速计算得到准备的值, 使用贪心算法,则可以得到非常接近的解,并且效率高。选择策略上,因为需要覆盖全部地区的最小集合:

  1. 遍历所有的广播电台,找到一个覆盖了最多未覆盖的地区的电台(此电台可能包含一些已覆盖的地区,但没有关系);
  2. 将这个电台加入到一个集合中(比如ArrayList),想办法把该电台覆盖的地区在下次比较时去掉;
  3. 重复第1步直到覆盖了全部的地区。

问题详解

根据上例,我们首先是确定了目标区域的,即假定allArea = {
“北京”、“上海”,“天津”,“广州”,“成都”,“深圳”,“杭州”,“大连”
}
首先我遍历所有电台发现,K1,K2,K3都覆盖了三个城市,按照顺位,不妨先选择K1作为maxKey;
那么接下来我就会将K1覆盖的城市从allArea中5剔除,得到allArea = {“广州”,“成都”,“深圳”,“杭州”,“大连”}
然后我会继续在allArea中匹配最优解,此时,K2,K3,K5都覆盖了两个城市,继续根据顺位选择K2作为maxKey,则allArea 继续剔除 覆盖城市,得到 allArea = {“成都”,“杭州”,“大连”}
依次类推,就可以得到贪心算法的最优解: K1,K2,K3,K5

代码实现

public class GreedyAlgorithm {public static void main(String[] args) {//创建广播电台HashMap<String, HashSet<String>> broadcasts = new HashMap<>();//初始化电台HashSet<String> hashSet1 = new HashSet<>();hashSet1.add("北京");hashSet1.add("上海");hashSet1.add("天津");HashSet<String> hashSet2 = new HashSet<>();hashSet2.add("广州");hashSet2.add("北京");hashSet2.add("深圳");HashSet<String> hashSet3 = new HashSet<>();hashSet3.add("成都");hashSet3.add("上海");hashSet3.add("杭州");HashSet<String> hashSet4 = new HashSet<>();hashSet4.add("上海");hashSet4.add("天津");HashSet<String> hashSet5 = new HashSet<>();hashSet5.add("杭州");hashSet5.add("大连");//加入到Mapbroadcasts.put("K1",hashSet1);broadcasts.put("K2",hashSet2);broadcasts.put("K3",hashSet3);broadcasts.put("K4",hashSet4);broadcasts.put("K5",hashSet5);//allAreas所有地区(未覆盖地区)HashSet<String> allAreas = new HashSet<>();allAreas.add("北京");allAreas.add("上海");allAreas.add("天津");allAreas.add("广州");allAreas.add("深圳");allAreas.add("成都");allAreas.add("杭州");allAreas.add("大连");//创建ArrayList,存放选择的电台集合ArrayList<String> selects = new ArrayList<>();//定义一个临时的集合,在遍历过程中存放  某个电台覆盖的地区 和 当前还没有覆盖地区的交集//其实就是某个K和AllAreas的交集HashSet<String> tempSet = new HashSet<>();String maxKey = null;//定义一个maxKey,保存在一次遍历过程中,能够覆盖最大未覆盖地区的电台key//如果maxKey不为空,最终会加入到selects中while (allAreas.size()!=0){//若allAreas不为0,则表示还没有覆盖到所有的地区//每次循环要置空maxKey,杜绝上次循环的影响maxKey = null;//遍历broadcasts,取出对应的Keyfor (String key : broadcasts.keySet()) {//每进行一次,要清空tempSettempSet.clear();HashSet<String> areas = broadcasts.get(key);//当前key能覆盖的地区tempSet.addAll(areas);//求出temp和allAreas集合的交集,交集赋给tempSettempSet.retainAll(allAreas);//如果当前集合包含的未覆盖地区的数量比maxKey指向的集合的地区还多,就需要重置maxKeyif (tempSet.size()>0 &&(maxKey==null||tempSet.size()>broadcasts.get(maxKey).size()))//体现贪心算法的特点,每一次都要最优解maxKey = key;}//maxKey != null,就应该将maxKey 加入selectsif (maxKey!=null){selects.add(maxKey);//将maxKey指向的广播电台覆盖的地区从allAreas中移除allAreas.removeAll(broadcasts.get(maxKey));}}System.out.println("得到的结果:"+selects);}}

小结

  1. 贪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似最优解的结果;
  2. 比如上题的算法选出的是K1,K2,K3,K5,符合覆盖了全部的地区;
  3. 但是我们发现 K2,K3,K4,K5 也可以覆盖全部地区,如果K2 的使用成本低于K1,那么我们上题的 K1,K2,K3,K5 虽然是满足条件,但是并不是最优的;
  4. 对于实际应用中丰富的条件如何权衡,还需要大家根据实际情况分析,算法只是提供一种思路,灵活变通才能展现它最强大的力量。

关注我,共同进步,每周至少一更。——Wayne

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

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

相关文章

Qt5开发及实例V2.0-第二十二章-Qt.Quick Controls 2新颖界面开发

Qt5开发及实例V2.0-第二十二章-Qt.Quick Controls 2新颖界面开发 第22章 Qt Quick Controls 2新颖界面开发22.1 Qt Quick Controls 2简介22.1.1 第一个Qt Quick Controls 2程序22.1.2 Qt Quick Controls 2程序的构成 22.2 Qt Quick Controls 2与1的比较22.2.1 ApplicationWindo…

紫光展锐6nm国产5G处理器T820_国产手机芯片5G方案

紫光展锐T820是一款采用先进6nm EUV工艺的芯片&#xff0c;采用134三丛集八核心CPU架构&#xff0c;由1个主频为 2.7GHz 的 Arm Cortex-A76 大核和 3个主频为2.3GHz 的Arm Cortex-A76大核以及4个主频为2.1GHz的 Arm Cortex-A55组成 &#xff0c;支持高达3MB 三级缓存&#xff0…

MySQL 篇

目录 1、数据库三范式 2、数据库事务的特性 3、MySQL数据库引擎 4、说说 InnoDB 与 MyISAM 的区别 5、索引是什么&#xff1f; 6、索引数据结构 7、MySQL 索引类型有哪些&#xff1f; 8、索引有什么优缺点&#xff1f; 9、索引设计原则 9、使用索引应该注意些什…

ubuntu 开启笔记本摄像头并修复画面颠倒问题

文章目录 基本环境状况&#xff1a; 没找到摄像头检查 opencv检查系统应用 键盘右侧&#xff0c;硬件层面开启摄像头画面镜像问题 基本环境 笔记本&#xff1a; 联想拯救者 系统&#xff1a; ubuntu 22.04 状况&#xff1a; 没找到摄像头 检查 opencv 使用 cv::VideoCaptu…

实验室安全教育与考试

目录 我的错题&#xff08;2个&#xff09;新知识题目&#xff08;10个&#xff09;刚开始不太理解的题目&#xff08;10个&#xff09;写在最后&#xff08;免责声明&#xff09; 我的错题&#xff08;2个&#xff09; 18.发生电气火灾时可以使用的灭火设备包括&#xff1a;&…

【100天精通Python】Day65:Python可视化_Matplotlib3D绘图mplot3d,绘制3D散点图、3D线图和3D条形图,示例+代码

1 mpl_toolkits.mplot3d 功能介绍 mpl_toolkits.mplot3d 是 Matplotlib 库中的一个子模块&#xff0c;用于绘制和可视化三维图形&#xff0c;包括三维散点图、曲面图、线图等。它提供了丰富的功能来创建和定制三维图形。以下是 mpl_toolkits.mplot3d 的主要功能和功能简介&am…

银行竞争度-地级市HHI+CRn(2000-2022年)

地级市的银行竞争度数据&#xff0c;其计算方法参考了姜付秀&#xff08;2019&#xff09;的方法。原始来源于中国银监会的金融许可证信息&#xff0c;用以测算各银行在各城市的年度分支机构数量&#xff0c;进而构建各城市银行业的赫芬达尔一赫希曼指数&#xff08;HHI&#x…

《动手学深度学习 Pytorch版》 7.1 深度卷积神经网络(AlexNet)

7.1.1 学习表征 深度卷积神经网络的突破出现在2012年。突破可归因于以下两个关键因素&#xff1a; 缺少的成分&#xff1a;数据 数据集紧缺的情况在 2010 年前后兴起的大数据浪潮中得到改善。ImageNet 挑战赛中&#xff0c;ImageNet数据集由斯坦福大学教授李飞飞小组的研究人…

js对象属性

在面向对象的语言中有一个标志&#xff0c;那就是都有类&#xff0c;通过类可以创建任意多个相同属性、方法的对象。在js中没有类的存在&#xff0c;所以js中的对象&#xff0c;相对于类语言中对象有所不同。 js中定义对象为&#xff1a;“无序属性的集合&#xff0c;其属性可…

虹科案例 | LIN/CAN总线汽车零部件测试方案

文章来源&#xff1a;虹科汽车电子 点此阅读原文 虹科的LIN/CAN总线汽车零部件测试方案是一款优秀的集成套装&#xff0c;基于Baby-LIN系列产品&#xff0c;帮助客户高效完成在测试、生产阶段车辆零部件质量、功能、控制等方面的检测工作。 1、汽车零部件测试的重要性&#xf…

乐鑫科技全球首批支持蓝牙 Mesh Protocol 1.1 协议

乐鑫科技 (688018.SH) 非常高兴地宣布&#xff0c;其自研的蓝牙 Mesh 协议栈 ESP-BLE-MESH 现已支持最新蓝牙 Mesh Protocol 1.1 协议的全部功能&#xff0c;成为全球首批在蓝牙技术联盟 (Bluetooth SIG) 正式发布该协议之前支持该更新的公司之一。这意味着乐鑫在低功耗蓝牙无线…

排序:冒泡排序算法分析

1.交换排序 基于“交换”的排序︰ 根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置。 交换排序包括冒泡排序和快速排序。 2.冒泡排序 1.算法原理 从后往前(或从前往后)两两比较相邻元素的值&#xff0c;若为逆序(即 A [ i − 1 ] > A [ i ] A[i-1]&…

【Java 基础篇】Java Stream 流详解

Java Stream&#xff08;流&#xff09;是Java 8引入的一个强大的新特性&#xff0c;用于处理集合数据。它提供了一种更简洁、更灵活的方式来操作数据&#xff0c;可以大大提高代码的可读性和可维护性。本文将详细介绍Java Stream流的概念、用法和一些常见操作。 什么是Stream…

API网关是如何提升API接口安全管控能力的

API安全的重要性 近几年&#xff0c;越来越多的企业开始数字化转型之路。数字化转型的核心是将企业的服务、资产和能力打包成服务&#xff08;服务的形式通常为API&#xff0c;API又称接口&#xff0c;下文中提到的API和接口意思相同&#xff09;&#xff0c;从而让资源之间形…

怎么在OPPO手机桌面上添加文字?便签桌面插件添加教程

很多年轻女性在选择手机时&#xff0c;都比较青睐于设计时尚靓丽、轻薄且续航好、系统流畅、拍照清晰的OPPO手机&#xff0c;并且OPPO为不同的用户提供了高中低不同价格档位的手机型号&#xff0c;能够满足绝大多数女性消费者的使用需求。 不过有不少OPPO手机用户表示&#xf…

hot100-哈希

1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按…

关于项目、项目集、项目组合以及运营管理之间的关系

什么是项目&#xff1f; 【项目】这个名词&#xff0c;其实各位一点都不陌生&#xff0c;各位从小到大在各种报章杂志&#xff0c;甚至是每晚的新闻播报里面&#xff0c;每每都会看到或是听到【项目】这个词语&#xff0c;甚至在各位进入大学&#xff0c;或是研究生的阶段里就…

AttributeError: type object ‘mmap.mmap‘ has no attribute ‘ACCESS_READ

在使用mmap时&#xff0c;运行项目&#xff0c;出现了报错&#xff1a;AttributeError: type object ‘mmap.mmap’ has no attribute ACCESS_READ 源代码是这样的&#xff1a; with mmap(f.fileno(), lengthfile_size, accessmmap.ACCESS_READ) as data 此时我的头文件引用是…

基于人脸5个关键点的人脸对齐(人脸纠正)

摘要&#xff1a;人脸检测模型输出人脸目标框坐标和5个人脸关键点&#xff0c;在进行人脸比对前&#xff0c;需要对检测得到的人脸框进行对齐&#xff08;纠正&#xff09;&#xff0c;本文将通过5个人脸关键点信息对人脸就行对齐&#xff08;纠正&#xff09;。 一、输入图像…

RabbitMQ用户命令_策略_日志

RabbitMQ相关安装 Centos离线安装RabbitMQ并开启MQTT Docker安装rabbitMQ RabbitMQ集群搭建和测试总结_亲测 Docker安装RabbitMQ集群_亲测成功 RabbitMQ创建管理员命令 #查看当前用户命令&#xff1a; rabbitmqctl list_users#创建用户和密码 rabbitmqctl add_user admin…