贪心算法解决集合覆盖问题

2023-11-04

问题描述:

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

广播台 覆盖地区
k1 “北京”,“上海,“天津””
k2 “广州”,“北京,“深圳””
k3 “成都”,“上海,“杭州””
k4 “上海,“天津””
k5 “杭州”,“大连”"
k6 “福州”,“重庆”"

贪心算法:

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。

解决思路:

1.添加覆盖地区,并构建广播站

    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("大连");

    HashSet<String> hashSet6 = new HashSet<>();
    hashSet6.add("福州");
    hashSet6.add("重庆");

    //构建广播台
    HashMap<String, HashSet<String>> broadcasts = new HashMap<>();
    broadcasts.put("k1", hashSet1);
    broadcasts.put("k2", hashSet2);
    broadcasts.put("k3", hashSet3);
    broadcasts.put("k4", hashSet4);
    broadcasts.put("k5", hashSet5);
    broadcasts.put("k6", hashSet6);

`

2.构建存放所有需要覆盖的地区的集合,每添加一个广播站就要从该集合中清除对应的地区;

 //存放所有需要覆盖的地区
        HashSet<String> allAreas = new HashSet<>();
        for (Set<String> areas : broadcasts.values()) {
            //只能addAll,add会出现[“北京”,“上海,“天津””][“广州”,“北京,“深圳””]按照集合的形式存在会有重复
            allAreas.addAll(areas);
        }

3.遍历广播站每次找出能覆盖待覆盖区域数最多的广播站,这一步就是贪心算法的体现,局部最优

完整java代码实现:

package com.yg.algorithm;/*
@author  Mu_Mu
@date    2020/3/19  10:15
*/

import java.util.*;

public class GreedyAlogorithm {
    public static void main(String[] args) {
        //添加覆盖地区
        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("大连");

        HashSet<String> hashSet6 = new HashSet<>();
        hashSet6.add("福州");
        hashSet6.add("重庆");

        //构建广播台
        HashMap<String, HashSet<String>> broadcasts = new HashMap<>();
        broadcasts.put("k1", hashSet1);
        broadcasts.put("k2", hashSet2);
        broadcasts.put("k3", hashSet3);
        broadcasts.put("k4", hashSet4);
        broadcasts.put("k5", hashSet5);
        broadcasts.put("k6", hashSet6);

        //存放所有需要覆盖的地区
        HashSet<String> allAreas = new HashSet<>();
        for (Set<String> areas : broadcasts.values()) {
            //只能addAll,add会出现[“北京”,“上海,“天津””][“广州”,“北京,“深圳””]按照集合的形式存在会有重复
            allAreas.addAll(areas);
        }

        //存放需要选择的广播站列表
        ArrayList<String> broadList = new ArrayList<>();
        //maxKey代表能覆盖待覆盖区域最大的广播站
        String maxKey = null;
        int maxNum = 0;//能覆盖待覆盖区域最大的数量
        //只要allAreas.size() >0说明还有地区需要被覆盖
        //存放能覆盖待覆盖的区域
        HashSet<String> tempSet = new HashSet<>();
        while (allAreas.size() > 0) {
            maxKey = null;
            for (String key : broadcasts.keySet()) {
                tempSet.clear();
                tempSet.addAll(broadcasts.get(key));
                tempSet.retainAll(allAreas);
                if (tempSet.size() > 0 && (maxKey == null || tempSet.size() > maxNum)) {
                    maxKey = key;
                    maxNum = tempSet.size();
                }
            }
            if (maxKey != null) {
                broadList.add(maxKey);
                //从待覆盖区域的集合中移除这次新增覆盖区域
                allAreas.removeAll(broadcasts.get(maxKey));
            }
        }
        System.out.println("待添加的广播站有:");
        for (String str : broadList) {
            System.out.print(str+" ");
        }

    }
}


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

贪心算法解决集合覆盖问题 的相关文章

  • 如何在 JPA 中使用枚举

    我有一个电影租赁系统的现有数据库 每部电影都有一个评级属性 在 SQL 中 他们使用约束来限制该属性的允许值 CONSTRAINT film rating check CHECK rating text text OR rating tex
  • 如何将 .cer 证书导入 java 密钥库?

    在开发 Java Web 服务客户端期间 我遇到了一个问题 Web 服务的身份验证使用客户端证书 用户名和密码 我从网络服务背后的公司收到的客户端证书位于 cer格式 当我使用文本编辑器检查该文件时 它具有以下内容 BEGIN CERTIF
  • 使用 Spring MVC 返回 PDF 文件

    实际上 我有这个功能 我有一个框架 可以在其中设置 URL ip port birt preview report report rptdesign format pdf parameters 并且该框架呈现 PDF 文件 但我想隐藏该网址
  • java替代Thread.stop()来中断特定调用

    我正在寻找一种方法来告诉这个调用 大约需要 20 120 秒 final Area image final AffineTransform transform new AffineTransform transform scale imag
  • 按下按钮时清除编辑文本焦点并隐藏键盘

    我正在制作一个带有编辑文本和按钮的应用程序 当我在 edittext 中输入内容然后单击按钮时 我希望键盘和焦点在 edittext 上消失 但我似乎无法做到这一点 我在 XML 中插入了这两行代码 android focusable tr
  • 如何将列表转换为地图?

    最近我和一位同事讨论了转换的最佳方式是什么List to Map在 Java 中 这样做是否有任何具体的好处 我想知道最佳的转换方法 如果有人可以指导我 我将非常感激 这是个好方法吗 List
  • 使用 java 的 RAR 档案 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Java 9 中可以使用提前编译吗?

    As per JEP 295 http openjdk java net jeps 295 任何 JDK 模块 类或用户代码的 AOT 编译都是实验性的 JDK 9 中不支持 要使用 AOT 化的 java base 模块 用户必须编译该模
  • 将 JSON Map 传递到 Spring MVC 控制器

    我正在尝试将 Map 的 JSON 表示形式作为 POST 参数发送到我的控制器中 RequestMapping value search do method RequestMethod GET consumes application j
  • Jodatime 日期格式

    是否可以格式化 JodaTime 日期 这是代码 private static LocalDate priorDay LocalDate date1 do date1 date1 plusDays 1 while date1 getDayO
  • 我们必须将 .class 文件放在 Tomcat 目录中的位置

    我必须把我的 class文件在 Tomcat 目录中 在我的 Java Complete Reference 书中 他们告诉将其放入C Program Files Apache Tomcat 4 0 webapps examples WEB
  • java 1.8下无法启动eclipse

    java 1 8 升级后我无法启动 eclipse 附上错误截图 这是我的 eclipse 配置设置 我该如何解决 startup plugins org eclipse equinox launcher 1 3 0 v20120522 1
  • 处理照片上传的最佳方式是什么?

    我正在为一个家庭成员的婚礼制作一个网站 他们要求的一个功能是一个照片部分 所有客人都可以在婚礼结束后前往并上传他们的照片 我说这是一个很棒的想法 然后我就去实现它 那么只有一个问题 物流 上传速度很慢 现代相机拍摄的照片很大 2 5 兆 我
  • 将变量从 jenkins 传递到 testng.xml

    我想根据从詹金斯传递的变量运行测试用例 例如 选择您要运行的测试用例 测试用例一 测试用例二 在 pom xml maven 中
  • 计算移动的球与移动的线/多边形碰撞的时间(2D)

    我有一个多边形 里面有一个移动的球 如果球撞到边界 它应该反弹回来 My current solution I split the polygon in lines and calculate when the ball hits the
  • 如何告诉 IntelliJ 使用 Java 1.6 JDK 启动 gradle?

    一个简单的问题 即使经过几个小时的尝试和搜索 我也无法弄清楚 我安装了 Java 6 和 7 如何告诉 IntelliJ 使用 JDK 版本 1 6 启动 Gradle 构建 无论我做什么 IntelliJ 都会以以下方式开始我的 grad
  • Microsoft JDBC 中的 JTDS 属性相当于什么?

    我正在将 JTDS 连接更改为 Microsoft JDBC 并且我看到存在于http jtds sourceforge net faq html http jtds sourceforge net faq htmlMicrosoft JD
  • 如何使用 Nimbus LookAndFeel 更改 JToolTip 的背景颜色?

    在使用 Nimbus LookAndFeel 的基于 Swing 的 Java 应用程序中 我尝试设置工具提示的背景颜色 因此 我创建了 JToolTip 的子类 并通过重写 createToolTip 在我的组件中使用它 到目前为止一切正
  • Python 可以替代 Java 小程序吗?

    除了制作用于物理模拟 如抛射运动 重力等 的教育性 Java 小程序之外 还有其他选择吗 如果你想让它在浏览器中运行 你可以使用PyJamas http pyjs org 这是一个 Python 到 Javascript 的编译器和工具集
  • spring data jpa 过滤 @OneToMany 中的子项

    我有一个员工测试实体是父实体并且FunGroup信息子实体 这两个实体都是通过employeeId映射 我需要一种方法来过滤掉与搜索条件匹配的子实体 以便结果仅包含父实体和子实体 满足要求 员工测试类 Entity name Employe

随机推荐

  • [信息论与编码理论专题-2]:信息与熵

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 118526747 前言 什么是
  • 解决网页多次经过请求数据后,Ajax请求被挂起

    问题描述 网页多次通过Ajax向后端发送后 突然无法发送请求了 后端和前端网页都没有明显的报错 查看网页的网络请求 发现后面发送的请求被挂起 问题分析 单个测试网页功能时没有任何问题 可以正常可发送请求后获取数据 说明Ajax的编写没有问题
  • 第六章 PCB 的 DRC 检查、拼版设计及资料输出

    目录 第六章 PCB 的 DRC 检查 拼版设计及资料输出 6 1 DRC 的检查及丝印的调整 6 2 拼板介绍 6 3 V Cut 和邮票孔的概念 6 4 拼板的实战演示 6 5 Gerber 文件的输出及整理 第六章 PCB 的 DRC
  • 记一次失败的regeorg+proxifiler代理实验--解决内网主机不出网问题

    记一次失败的regeorg proxifiler代理实验 解决内网主机不出网问题 一 简述 二 环境 三 流程 3 1 种webshell 3 2 启动regeorg 3 3 配置proxifiler 3 3 1 配置代理服务器 3 3 2
  • UNI-APP_横屏切换竖屏出现样式混乱问题

    app从竖屏页面1进入竖屏页面2 再进入横屏 再返回 再返回从新回到竖屏页面1 再次进入竖屏页面2 发现竖屏页面2的所有图片字体都被放大了 再返回竖屏1 再进入竖屏2 一切又恢复正常 解决跳转横屏竖屏样式放大错乱问题 解决方法 不要使用un
  • 前端部署:vue跨域配置、打包、nginx本机&远程访问

    vue版本 npm版本 2 6 11 8 1 2 前排感谢大佬 最全vue打包前后的跨域问题 绝对解决你的问题 0 项目说明 服务器和访问其的电脑同属校园网内网中 1 vue跨域配置 两种跨域方式均可 这里采用跨域2 1 1 vue con
  • 【Java】list对象(类)按某个属性排序

    这里采用的方法是 将要排序的类实现Comparable接口 具体如下 假设有个rule类 要按照sort字段排序 首先该类要实现Comparable接口 并实现它的compareTo 方法 Author EvanChen Date 2018
  • java连接kafka测试

    进入到kafka文件夹中修改配置文件 vim config server properties 启动zookeeper bin zookeeper server start sh config zookeeper properties 端口
  • python mssql数据库开发_Python实现的连接mssql数据库操作示例

    本文实例讲述了Python实现的连接mssql数据库操作 分享给大家供大家参考 具体如下 1 目标数据sql2008 R2 ComPrject gt TestModel 2 安装python 连接mssql 模块 运行 pip instal
  • 小程序hover-class点击态效果——小程序体验

    微信小程序设置 hover class 实现点击态效果 增强小程序触感 提高用户交互感知度 概念及注意事项 微信小程序中 可以用 hover class 属性来指定元素的点击态效果 但是在在使用中要注意 大部分组件是不支持该属性的 目前支持
  • Spring Cache

    Spring Cache Spring Cache使用方法与Spring对事务管理的配置相似 Spring Cache的核心就是对某个方法进行缓存 其实质就是缓存该方法的返回结果 并把方法参数和结果用键值对的方式存放到缓存中 当再次调用该方
  • Cisco Voip实验

    http hackerjx blog 51cto com 383839 248031 转载于 https blog 51cto com markyan 1043695
  • Java基础-I/O流(文件字节流)

    字符串常见的字符底层组成是什么样的 英文和数字等在任何国家的字符集中都占1个字节 GBK字符中一个中文字符占2个字节 UTF 8编码中一个中文字符占3个字节 注意 编码前的字符集和编码好的字符集要必须一致 否则会出现中文字符乱码 英文和数字
  • NullPointerException : HiveAuthorizerImpl.checkPrivileges(HiveAuthorizerImpl.java:85)

    背景 做hive sentry LDAP授权 1 jdbc hive2 localhost 10000 gt connect jdbc hive2 localhost 10000 Connecting to jdbc hive2 local
  • Gitlab中Pipeline语法三

    Pipeline语法三 only except rules workflow only和except 用分支策略来限制jobs构建 only 定义哪些分支和标签的git项目将会被job执行 except定义哪些分支和标签的git项目将不会被
  • 腾讯云对象存储的创建和S3 Browser的使用

    简述 想想第一次接触对象存储的时候还是很兴奋的 同时也是一脸懵逼 然后开始网上疯狂的找资料 但因为客户当时给的文档写的是关于Amazon S3之类的 所以自以为的就只有Amazon S3这一家 接着开始查资料 经过一番努力最后在Amazon
  • ubuntu下下载安装dstat

    如果直接安装采用s sudo apt install dstat 或者通过下载方式 https launchpad net ubuntu source dstat 0 7 4 6 1 下载这三个包 然后里面直接运行 dstat就可以了 前提
  • I3Net: Implicit Instance-Invariant Network for Adapting One-Stage Object Detectors

    摘要 最近的两阶段跨域检测工作广泛探索了局部特征模式 以获得更准确的适配结果 这些方法在很大程度上依赖于区域建议机制和基于ROI的实例级特性来设计关于前景目标的细粒度特性对齐模块 然而 对于一阶段检测检测器 在检测流程中很难甚至不可能获得显
  • 【Scapy】使用Python的Scapy包对Wirshark捕获的Http数据包进行解析(格式输出)

    通过Anaconda安装scapy pip install scapy http Python源码如下 实现功能 1 读取本地pcap文件 文件内容为Wirshark捕获的数据二进制流 2 通过scapy将二进制数据流解析为有结构的pake
  • 贪心算法解决集合覆盖问题

    问题描述 假设存在下面需要付费的广播台 以及广播台需要覆盖的地区 如何选择最少的广播台 让所有的地区都可以接受到信号 广播台 覆盖地区 k1 北京 上海 天津 k2 广州 北京 深圳 k3 成都 上海 杭州 k4 上海 天津 k5 杭州 大