算法(Java实现)—— 贪心算法
贪心算法
应用场景-集合覆盖问题
假设在下面需要付费的广播台,以及广播台新型号可以覆盖的地区,如何选择最少的广播台,让所有地区都可以接收到信号
广播台 | 覆盖地区 |
---|---|
k1 | 北京、上海、天津 |
k2 | 广州、北京、深圳 |
k3 | 成都、上海、杭州 |
k4 | 上海、天津 |
k5 | 杭州、大连 |
贪心算法介绍
贪心算法指在对问题进行求解时,在每一步选择中都选择最好或者最优的选择,从而得到结果最好或最优
局部最优——>结果最优
贪心算法所得的结果不一定是最优的结果,但是都近似于最优解
集合覆盖思路分析
遍历所有的广播电台,找到一个覆盖了最多未覆盖地区的电台
将这个电台加入到一个集合中,想办法把该电台覆盖地区在下次比较时去掉
重复第1步直到覆盖了所有地区
代码实现
package whyAlgorithm.greedy_algorithm;
import java.util.*;
/**
* @Description TODO 结合覆盖问题的贪心算法
* @Author why
* @Date 2020/12/20 19:53
* Version 1.0
**/
public class SetCover {
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<>();
hashSet4.add("杭州");
hashSet4.add("大连");
broadcasts.put("k1",hashSet1);
broadcasts.put("k2",hashSet2);
broadcasts.put("k3",hashSet3);
broadcasts.put("k4",hashSet4);
broadcasts.put("k5",hashSet5);
//存放所有地区
HashSet<String> allAreas = new HashSet<>();
allAreas.add("北京");
allAreas.add("上海");
allAreas.add("天津");
allAreas.add("广州");
allAreas.add("深圳");
allAreas.add("成都");
allAreas.add("杭州");
allAreas.add("大连");
//创建list集合存放选择的电台集合
ArrayList<String> selects = new ArrayList<>();
//定义一个林试集合保存在遍历过程中的电台覆盖地区和当前还没有覆盖的地区的交集
HashSet<String> tempSet = new HashSet<>();
//定义变量,保存在一次遍历过程中能够覆盖最大未覆盖的地区对应电台的key
//如果maxKey不为null,则加入到selects
String maxKey = null;
while (allAreas.size() != 0){//allAreas.size() != 0表示还没有覆盖到所有地区
//没进行一次循环将maxKey置空
maxKey = null;
//遍历boradcasts,取出电台key
for (String key : broadcasts.keySet()
) {
//每进行一次将tempSet集合置空
tempSet.clear();
//当前key覆盖的地区
HashSet<String> areas = broadcasts.get(key);
tempSet.addAll(areas);
//求出tempSet和allAreas的交集
//交集会赋值给tempSet
tempSet.retainAll(allAreas);
//如果当前集合包含的未覆盖地区的数列,比maxKey指向的集合未覆盖的地区还多
//maxKey就需要充值
//体现贪婪算法,每次选择最优
if (tempSet.size() > 0 && (maxKey == null || tempSet.size() > broadcasts.get(maxKey).size())){
maxKey = key;
}
}
if (maxKey != null){//选中了电台
//将maxKey加入到selects中
selects.add(maxKey);
//将maxKey指向的电台覆盖的地区从allAreas取出
allAreas.removeAll(broadcasts.get(maxKey));
}
}
//得到的选择结果
System.out.println("得到的选择结果"+selects);
}
}
注意事项
贪心算法所得结果不一定是最优解
算法(Java实现)—— 贪心算法的更多相关文章
- 正則表達式re中的贪心算法和非贪心算法 在python中的应用
之前写了一篇有关正則表達式的文章.主要是介绍了正則表達式中通配符 转义字符 字符集 选择符和子模式 可选项和反复子模式 字符串的開始和结尾 ,有兴趣的能够查看博客内容. 此文章主要内容将要介绍re中的 ...
- #C++初学记录(贪心算法#结构体#贪心算法)
贪心算法#结构体 Problem Description "今年暑假不AC?" "是的." "那你干什么呢?" "看世界杯呀,笨蛋 ...
- JAVA分析html算法(JAVA网页蜘蛛算法)
近来有些朋友在做蜘蛛算法,或者在网页上面做深度的数据挖掘.但是遇到复杂而繁琐的html页面大家都望而却步.因为很难获取到相应的数据. 最古老的办法的是尝试用正则表达式,估计那么繁琐的东西得不偿失,浪费 ...
- 排序算法-Java实现快速排序算法
- 算法 | Java 常见排序算法(纯代码)
目录 汇总 1. 冒泡排序 2. 选择排序 3. 插入排序 4. 快速排序 5. 归并排序 6. 希尔排序 6.1 希尔-冒泡排序(慢) 6.2 希尔-插入排序(快) 7. 堆排序 8. 计数排序 9 ...
- Java 算法(一)贪心算法
Java 算法(一)贪心算法 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 一.贪心算法 什么是贪心算法?是指在对问题进行求 ...
- 基于贪心算法求解TSP问题(JAVA)
概述 前段时间在搞贪心算法,为了举例,故拿TSP来开刀,写了段求解算法代码以便有需之人,注意代码考虑可读性从最容易理解角度写,没有优化,有需要可以自行优化! 详细 代码下载:http://www.de ...
- (java)五大常用算法
算法一:分治法 基本概念 1.把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并. 2.分治策略是对于一个 ...
- 快速排序算法 java 实现
快速排序算法 java 实现 快速排序算法Java实现 白话经典算法系列之六 快速排序 快速搞定 各种排序算法的分析及java实现 算法概念 快速排序是C.R.A.Hoare于1962年提出的一种划分 ...
- 贪心算法(Greedy Algorithm)
参考: 五大常用算法之三:贪心算法 算法系列:贪心算法 贪心算法详解 从零开始学贪心算法 一.基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以 ...
随机推荐
- SAD DNS--新型DNS缓存中毒攻击
一.DNS基础知识: 1.DNS简介: DNS 域名服务,用于建立 域名与 ip地址的 一对一 映射.DNS 将域名转换为 IP地址,以便浏览器能够加载 Internet 资源. 类似于一个翻译系统, ...
- uni-app 封装接口request请求
我们知道一个项目中对于前期架构的搭建工作对于后期的制作有多么重要,所以不管做什么项目我们拿到需求后一定要认真的分析一下,要和产品以及后台沟通好,其中尤为重要的一个环节莫过于封装接口请求了.因为前期封装 ...
- IAR编译出现Configuration is up-to-date.
IAR编译出现如下: Building configuration: SimpleBLECentral - CC2541EM Updating build tree... Configuration ...
- django和DRF的不同点
django中封装了drf view 是 父类 class test1(View): def post(self,request): data=request.POST.get('name') ret ...
- redis分布式锁解决超卖问题
redis事务 redis事务介绍: 1. redis事务可以一次执行多个命令,本质是一组命令的集合. 2.一个事务中的所有命令都会序列化,按顺序串行化的执行而不会被其他命令插入 作用:一个队列 ...
- linux下gdb命令大全
感谢国内的ACM同行们的支持,今年应该会是难忘的一年,谢谢大家的帮助啦 gdb命令如下,记全!!!
- python调用jar包
工作项目中用jmeter做接口测试,想尝试用python写接口测试(练习下python), 接口中好多字段都需要加密,而加密方法是java开发写的,打的jar包,这就需要考虑python调用java: ...
- App界面
首先我直接放图,存储记录一下,自己开发的app,后端是java分布式,
- shell 编程 -- 条件判断
1.按照文件类型进行判断(常用的)-b 判断该文件是否存在-d 判断是否存在,并且是否为目录(是目录就为真)-e 判断该文件是否存在(存在为真)-f 判断文件是否存在,并且是否为普通文件(是普通文件为 ...
- MBR分区表为什么最大只能识别2TB硬盘容量
1. 前言 最近公司的服务器硬盘坏了,需要换一个新的硬盘,容量是2TB,用的fdisk进行分区,期间搜索分区工具,看到了关于MBR(Master Boot Record)与GPT(GUID parti ...