[ 数据结构 ] 集合覆盖问题(贪心算法)
创始人
2024-05-09 14:04:27
0

0 集合覆盖问题

  1. 假设存在如下表的需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号
广播台覆盖地区
K1北京,上海,天津
K2广州,北京,深圳
K3成都,上海,杭州
K4上海,天津
K5杭州,大连
  1. 思路分析①:穷举法,列出每个可能的广播台的集合,假设总的有 n 个广播台,则广播台的组合总共有2ⁿ -1 个,假设每秒可以计算 10 个子集, 如图:

image-20230109192838218.png

  1. 思路分析②:贪心算法,见下一章

1 贪心算法

  1. 目标:选择策略上,尽量选择最少的电台,并覆盖全部地区
  2. 首先:集合allAreas收录全部的8个地区,遍历所有电台并最终选择能覆盖最多地区的电台k(贪心)
  3. 删除allAreas中k所能覆盖的电台
  4. 在剩余的4个电台中重复第2步和第3步的操作
  5. 直到allAreas的大小为0,表示选择的电台已经覆盖全地区
  6. 即得到所选的电台集合

说明:整个过程中,其实重难点在第2步中如何选择能覆盖最多地区的电台,并不是选择最大的电台,而是k电台与allAreas的交集如果最大,说明k就是本轮我们选择的结果,allAreas其实应该理解为目前未被电台覆盖的地区

举例:当K1电台已经被选择后,在第二轮的选择情况如下(结果选K2电台):

广播台本轮电台覆盖地区数(交集)覆盖地区
K10北京,上海,天津
K22广州,北京,深圳
K32成都,上海,杭州
K40上海,天津
K52杭州,大连

ps:该算法的解并不一定是最优解,只是相对接近最优,因为当多个电台都能覆盖3个地区时,我们选择了第一个,这考虑的过于简单,比如第一个电台如果包月太贵那么是否应该考虑选第2个呢

2 代码实现

//贪心算法
public class GreedyAlgorithm {public static void main(String[] args) {//创建广播电台,放入到 MapHashMap> broadcasts = new HashMap>();//将各个电台放入到 broadcastsHashSet hashSet1 = new HashSet();hashSet1.add("北京");hashSet1.add("上海");hashSet1.add("天津");HashSet hashSet2 = new HashSet();hashSet2.add("广州");hashSet2.add("北京");hashSet2.add("深圳");HashSet hashSet3 = new HashSet();hashSet3.add("成都");hashSet3.add("上海");hashSet3.add("杭州");HashSet hashSet4 = new HashSet();hashSet4.add("上海");hashSet4.add("天津");HashSet 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 allAreas = new HashSet();allAreas.add("北京");allAreas.add("上海");allAreas.add("天津");allAreas.add("广州");allAreas.add("深圳");allAreas.add("成都");allAreas.add("杭州");allAreas.add("大连");//选择结果List selects = new ArrayList();//存放最大结果集(即本轮选择的电台和其新覆盖的地区)String bigKey = "";HashSet bigSet =null;//存放遍历的结果与全地区的交集(即能覆盖的新地区)HashSet tempSet =null;//只要全地区还有元素,说明仍有地区未覆盖while (allAreas.size() > 0) {//遍历广播电台的同时,获取与全地区的交集,贪心:暂存本轮交集最大的电台for (String key : broadcasts.keySet()) {tempSet = broadcasts.get(key);tempSet.retainAll(allAreas);if (bigSet==null||broadcasts.get(key).size() > bigSet.size()) {bigSet= tempSet;bigKey = key;}}//收集本轮的电台选择结果并删除全地区中该电台覆盖的地区selects.add(bigKey);allAreas.removeAll(bigSet);}System.out.println(selects);}
}

相关内容

热门资讯

美国不提安卓系统华为,迈向自主... 华为与美国:一场关于技术、市场与政策的较量在当今这个数字化的世界里,智能手机已经成为我们生活中不可或...
安卓系统怎么打开ppt,选择文... 你有没有遇到过这种情况:手里拿着安卓手机,突然需要打开一个PPT文件,却怎么也找不到方法?别急,今天...
谷歌退回到安卓系统,探索创新未... 你知道吗?最近科技圈可是炸开了锅,谷歌竟然宣布要退回到安卓系统!这可不是一个简单的决定,背后肯定有着...
安卓系统待机耗电多少,深度解析... 你有没有发现,手机电量总是不经用?尤其是安卓系统,有时候明明没怎么用,电量就“嗖”的一下子就下去了。...
小米主题安卓原生系统,安卓原生... 亲爱的手机控们,你是否曾为手机界面单调乏味而烦恼?想要给手机换换“衣服”,让它焕然一新?那就得聊聊小...
voyov1安卓系统,探索创新... 你有没有发现,最近你的手机是不是变得越来越流畅了?没错,我要说的就是那个让手机焕发青春的Vivo V...
电脑刷安卓tv系统,轻松打造智... 你有没有想过,家里的安卓电视突然变得卡顿,反应迟钝,是不是时候给它来个“大保健”了?没错,今天就要来...
安卓系统即将要收费,未来手机应... 你知道吗?最近有个大消息在科技圈里炸开了锅,那就是安卓系统可能要开始收费了!这可不是开玩笑的,这可是...
雷凌车载安卓系统,智能出行新体... 你有没有发现,现在的汽车越来越智能了?这不,我最近就体验了一把雷凌车载安卓系统的魅力。它就像一个聪明...
怎样拍照好看安卓系统,轻松拍出... 拍照好看,安卓系统也能轻松搞定!在这个看脸的时代,拍照已经成为每个人生活中不可或缺的一部分。无论是记...
安卓车机系统音频,安卓车机系统... 你有没有发现,现在越来越多的汽车都开始搭载智能车机系统了?这不,咱们就来聊聊安卓车机系统在音频方面的...
老苹果手机安卓系统,兼容与创新... 你手里那台老苹果手机,是不是已经陪你走过了不少风风雨雨?现在,它竟然还能装上安卓系统?这可不是天方夜...
安卓系统7.dns,优化网络连... 你有没有发现,你的安卓手机最近是不是有点儿“慢吞吞”的?别急,别急,让我来给你揭秘这可能与你的安卓系...
安卓手机系统怎么加速,安卓手机... 你有没有发现,你的安卓手机最近变得有点“慢吞吞”的?别急,别急,今天就来给你支几招,让你的安卓手机瞬...
小米note安卓7系统,探索性... 你有没有发现,手机更新换代的速度简直就像坐上了火箭呢?这不,小米Note这款手机,自从升级到了安卓7...
安卓和鸿蒙系统游戏,两大系统游... 你有没有发现,最近手机游戏界可是热闹非凡呢!安卓和鸿蒙系统两大巨头在游戏领域展开了一场激烈的较量。今...
安卓手机没有系统更,揭秘潜在风... 你有没有发现,现在安卓手机的品牌和型号真是五花八门,让人挑花了眼。不过,你知道吗?尽管市面上安卓手机...
充值宝带安卓系统,安卓系统下的... 你有没有发现,最近手机上的一款充值宝APP,在安卓系统上可是火得一塌糊涂呢!这不,今天就来给你好好扒...
安卓系统8.0镜像下载,轻松打... 你有没有想过,想要给你的安卓手机升级到最新的系统,却不知道从哪里下载那个神秘的安卓系统8.0镜像呢?...
安卓系统修改大全,全方位修改大... 你有没有想过,你的安卓手机其实是个大宝藏,里面藏着无数可以让你手机焕然一新的秘密?没错,今天就要来个...