java贪心算法

news2024/9/22 21:22:44

1 应用场景-集合覆盖问题
假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区
都可以接收到信号

在这里插入图片描述

2 贪心算法介绍

  1. 贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而
    希望能够导致结果是最好或者最优的算法

  2. 贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果

3 贪心算法最佳应用-集合覆盖

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

在这里插入图片描述

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

在这里插入图片描述
使用贪婪算法,效率高:

  1. 目前并没有算法可以快速计算得到准备的值, 使用贪婪算法,则可以得到非常接近的解,并且效率高。选择
    策略上,因为需要覆盖全部地区的最小集合:
  2. 遍历所有的广播电台, 找到一个覆盖了最多未覆盖的地区的电台(此电台可能包含一些已覆盖的地区,但没有关
    系)
  3. 将这个电台加入到一个集合中(比如 ArrayList), 想办法把该电台覆盖的地区在下次比较时去掉。
  4. 重复第 1 步直到覆盖了全部的地区
    分析的图解:

在这里插入图片描述

  1. 代码实现
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;

public class GreedyAlgorithm {

	public static void main(String[] args) {
		// 创建广播电台,放到Map
		HashMap<String, HashSet<String>> broadcasts = new HashMap<String, HashSet<String>>();

		// 将各个电台放入到broadcasts
		HashSet<String> hashSet1 = new HashSet<String>();
		hashSet1.add("北京");
		hashSet1.add("上海");
		hashSet1.add("天津");

		HashSet<String> hashSet2 = new HashSet<String>();
		hashSet2.add("广州");
		hashSet2.add("北京");
		hashSet2.add("深圳");

		HashSet<String> hashSet3 = new HashSet<String>();
		hashSet3.add("成都");
		hashSet3.add("上海");
		hashSet3.add("杭州");

		HashSet<String> hashSet4 = new HashSet<String>();
		hashSet4.add("上海");
		hashSet4.add("天津");

		HashSet<String> hashSet5 = new HashSet<String>();
		hashSet5.add("杭州");
		hashSet5.add("大连");

		// 加入到map
		broadcasts.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<String>();
		allAreas.add("北京");
		allAreas.add("上海");
		allAreas.add("天津");
		allAreas.add("广州");
		allAreas.add("成都");
		allAreas.add("杭州");
		allAreas.add("大连");

		// 创建ArrayList,存放选择的电台集合
		ArrayList<String> selects = new ArrayList<String>();

		// 定义一个临时的集合,在遍历的过程中,存放遍历过程中的电台覆盖的地区和当前还没有覆盖的地区的交集
		HashSet<String> tempSet = new HashSet<String>();

		// 定义给maxkey,保存在一次遍历中,能够覆盖最大未覆盖的地区对应的电台的key
		// 如果maxkey不为null,则会加入到selects
		String maxKey = null;
		while (allAreas.size() != 0) {// 如果allAreas不为0,则表示还没有覆盖到所有的地区
			// 每进行一次while,就需要
			maxKey = null;

			// 遍历broadcasts,取出对应key
			for (String key : broadcasts.keySet()) {
				// 每进行一次for
				tempSet.clear();

				// 当前这个key能够覆盖的地区
				HashSet<String> areas = broadcasts.get(key);
				tempSet.addAll(areas);
				// 求出tempSet和all Areas集合的交集,交集会赋给tempSet
				tempSet.retainAll(allAreas);
				// 如果当前这个集合包含的未覆盖的地区数量,比maxKey指向的集合未覆盖的地区还多
				// 就需要重置maxKey
				if (tempSet.size() > 0 && (maxKey == null || tempSet.size() > broadcasts.get(maxKey).size())) {
					maxKey = key;

				}
			}
			// maxKey != null,就应该将maxKey加入到selects
			if (maxKey != null) {
				selects.add(maxKey);
				// 将maxKey指向的广播电台覆盖的地区,从allAreas去掉
				allAreas.removeAll(broadcasts.get(maxKey));
			}
		}
		System.out.println("得到的选择的结果是" + selects);
	}

}

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

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

相关文章

Threadlocal为何引发内存泄漏问题

首先我们要先了解什么是泄漏问题和什么是内存溢出 内存泄漏表示程序员申请了内存&#xff0c;但是该内存一直无法被释放 内存溢出表示申请内存不足&#xff0c;就会报错 为何引发内存泄漏问题 因为每个线程都有自己独立的ThreadLocalMap对象&#xff0c;key为ThreadLocal&…

【C++1】函数重载,类和对象,引用,string类,vector容器,类继承和多态,/socket,进程信号

文章目录1.函数重载&#xff1a;writetofile()&#xff0c;Ctrue和false&#xff0c;C0和非02.类和对象&#xff1a;vprintf2.1 构造函数&#xff1a;对成员变量初始化2.2 析构函数&#xff1a;一个类只有一个&#xff0c;不允许被重载3.引用&#xff1a;C中&取地址&#x…

【shell 编程大全】内容格式化以及多样化输出

内容格式化以及多样化输出 1. 前倾回顾 本章节我们一起来学习下&#xff0c;shell中内容格式化&#xff0c;以及多样输出。但是在学习之前&#xff0c;我们先来看看上个章节【shell 变量的定义以及使用】 我们都学习到了什么知识 shell 变量的定义以及使用 变量分类变量定义类…

SpringBoot设置和读取配置文件(1)

SpringBoot配置文件是用来保存SpringBoot项目当中所有重要的数据的&#xff0c;比如说数据库连接信息&#xff0c;数据库的启动端口&#xff0c;如果端口被占用了&#xff0c;那么就可以随时修改&#xff1b; 1)比如说我们之前再写JDBC的代码的时候&#xff0c;要去写链接字符串…

C 字符串

在 C 语言中&#xff0c;字符串实际上是使用空字符 \0 结尾的一维字符数组。因此&#xff0c;\0 是用于标记字符串的结束。空字符&#xff08;Null character&#xff09;又称结束符&#xff0c;缩写 NUL&#xff0c;是一个数值为 0 的控制字符&#xff0c;\0 是转义字符&#…

SNI生效条件 - 补充nginx-host绕过实例复现中SNI绕过的先决条件

文章目录1.前置环境搭建2.测试SNI生效条件(时间)3. 证书对SNI的影响3.1 双方使用同一个证书&#xff1a;3.2 双方使用不同的证书与私钥4. 端口号区分测试4.1 端口号区分&#xff0c;证书区分&#xff1a;4.2 端口号区分,证书不区分&#xff1a;5.总结SNI运行机制6. SNI机制绕过…

Docker-安装Jenkins-使用jenkins发版Java项目

文章目录0.前言环境背景1.操作流程1.1前期准备工作1.1.1环境变量的配置1.2使用流水线的方式进行发版1.2.1新建流水线任务1.2.2流水线操作工具tools步骤stages步骤1:拉取代码编译步骤2:发送文件并启动0.前言 学海无涯&#xff0c;旅“途”漫漫&#xff0c;“途”中小记&#xff…

从0到1一步一步玩转openEuler--12 openEuler用户管理

文章目录12.1 创建用户12.1.1 useradd命令12.1.2 用户信息文件12.1.3 创建用户实例12.2 修改用户账号12.2.1 修改密码12.2.2 修改用户shell设置12.2.3 修改主目录12.2.4 修改UID12.2.5 修改账号的有效期12.3 删除用户12.4 管理员账户授权在Linux中&#xff0c;每个普通用户都有…

【Java 面试合集】怎么声明一个类不会被继承,以及应用场景

怎么声明一个类不会被继承&#xff0c;以及应用场景1. 概述 今天的Java 面试合集又来了。今天我们复习的问题是:怎么声明一个类&#xff0c;不可以被继承 2. 验证 public final class TestMath { }通过上述截图 我们可以看到&#xff0c;被关键字final 修饰过的类&#xff0c;…

EOC第六章《块与中枢派发》

文章目录第37条&#xff1a;理解block这一概念第38条&#xff1a;为常用的块类型创建typedef第39条&#xff1a;用handler块降低代码分散程度第41条&#xff1a;多用派发队列&#xff0c;少用同步锁方案一&#xff1a;使用串行同步队列来将读写操作都安排到同一个队列里&#x…

02 OpenCV图像通道处理

1 通道提取与合并 在数字图像处理中&#xff0c;图像通道是指一个图像中的颜色信息被分离为不同的颜色分量。常见的图像通道包括RGB通道、灰度通道、HSV通道等。 RGB通道是指将图像分离为红色、绿色和蓝色三个颜色通道&#xff0c;每个通道表示相应颜色的亮度。这种方式是最常…

【QT 5 相关实验-仪表盘-学习笔记-表盘组件练习与使用总结】

【QT 5 相关实验-仪表盘-学习笔记-表盘组件练习与使用总结】1、概述2、实验环境3、参考资料-致谢4、自我提升实验效果5、代码练习-学习后拆解&#xff08;1&#xff09;头文件部分&#xff08;2&#xff09;绘制事件绘制表盘代码&#xff08;3) 每一块部分绘制6、代码移植提升类…

Spring Security in Action 第十一章 SpringSecurity前后端分离实战

本专栏将从基础开始&#xff0c;循序渐进&#xff0c;以实战为线索&#xff0c;逐步深入SpringSecurity相关知识相关知识&#xff0c;打造完整的SpringSecurity学习步骤&#xff0c;提升工程化编码能力和思维能力&#xff0c;写出高质量代码。希望大家都能够从中有所收获&#…

nginx正向代理的配置和使用

nginx正向代理的配置和使用 nginx正向代理的配置和使用nginx正向代理的配置和使用安装包准备下载nginx安装包下载正向代理模块的包版本与模块对照表部署nginx服务上传nginx包和正向模块包解压,改名安装nginx配置正向代理创建nginx用户检查nginx配置并启动nginx服务所在服务器验…

微服务02 Docker

Docker实用篇0.学习目标1.初识Docker1.1.什么是Docker微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署&#xff0…

实战绕过WTS-WAF的SQL注入

实战绕过WTS-WAF的SQL注入1.前言2.测试流程2.1.发现漏洞2.1.1.正常页面2.1.2.WAF警告2.1.3.非正常页面2.2.判断字段数2.2.1.非正常页面2.2.2.正常页面2.3.判断回显位2.4.信息收集2.4.1.数据库版本2.4.2.数据库名2.5.判断数据库表2.5.1.WAF告警2.5.2.获取表2.5.3.burp suite测试…

龙曲良 Tensorflow —— tensorflow高级操作(自用)

目录 一、合并与分割 1.1 tf.concat (合并) 1.2 tf.stack &#xff08;增加新维度&#xff09; 1.3 tf.unstack &#xff08;一个一个拆分&#xff09; 1.4 tf.split &#xff08;均分拆分&#xff09; 二、数据统计 2.1 tf.norm&#xff08;默认二范数&#xff09; 2…

WebRTC(一):三种架构和基本原理

文章目录一、三种架构二、为什么SFU最为常用&#xff1f;一、三种架构 webrtc大致可以分为三种架构&#xff1a; MESH mesh架构需要所有参与连接的peer简历和所有其他peer的媒体的连接&#xff0c;如图一。 该架构需要n-1个上下行&#xff0c;以此带来的带宽消耗&#xff08…

家政服务小程序实战教程02-创建模型应用

我们在上一篇中介绍了数据源的设计及创建方法&#xff0c;本篇我们就根据我们创建好的数据源来设计功能。 按我们的需求分析&#xff0c;系统管理员来审核数据&#xff0c;要想审核数据需要给管理员提供一个管理后台。微搭中的管理后台是通过模型应用来解决的。 登录控制台&a…

我用python/C++调用ChatGPT自制了一个聊天机器人

目录1 ChatGPT完整版2 Python/C调用ChatGPT2.1 获取API秘钥2.2 测试API功能2.3 设计简单UI3 聊天问答1 ChatGPT完整版 2015年&#xff0c;OpenAI由马斯克、美国创业孵化器Y Combinator总裁阿尔特曼、全球在线支付平台PayPal联合创始人彼得蒂尔等硅谷科技大亨创立&#xff0c;公…