贪心算法

应用场景-集合覆盖问题

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

广播台 覆盖地区
k1 北京、上海、天津
k2 广州、北京、深圳
k3 成都、上海、杭州
k4 上海、天津
k5 杭州、大连

贪心算法介绍

  1. 贪心算法指在对问题进行求解时,在每一步选择中都选择最好或者最优的选择,从而得到结果最好或最优

  2. 局部最优——>结果最优

  3. 贪心算法所得的结果不一定是最优的结果,但是都近似于最优解

集合覆盖思路分析

  1. 遍历所有的广播电台,找到一个覆盖了最多未覆盖地区的电台

  2. 将这个电台加入到一个集合中,想办法把该电台覆盖地区在下次比较时去掉

  3. 重复第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实现)—— 贪心算法的更多相关文章

  1. 正則表達式re中的贪心算法和非贪心算法 在python中的应用

    之前写了一篇有关正則表達式的文章.主要是介绍了正則表達式中通配符 转义字符 字符集 选择符和子模式 可选项和反复子模式 字符串的開始和结尾 ,有兴趣的能够查看博客内容. 此文章主要内容将要介绍re中的 ...

  2. #C++初学记录(贪心算法#结构体#贪心算法)

    贪心算法#结构体 Problem Description "今年暑假不AC?" "是的." "那你干什么呢?" "看世界杯呀,笨蛋 ...

  3. JAVA分析html算法(JAVA网页蜘蛛算法)

    近来有些朋友在做蜘蛛算法,或者在网页上面做深度的数据挖掘.但是遇到复杂而繁琐的html页面大家都望而却步.因为很难获取到相应的数据. 最古老的办法的是尝试用正则表达式,估计那么繁琐的东西得不偿失,浪费 ...

  4. 排序算法-Java实现快速排序算法

  5. 算法 | Java 常见排序算法(纯代码)

    目录 汇总 1. 冒泡排序 2. 选择排序 3. 插入排序 4. 快速排序 5. 归并排序 6. 希尔排序 6.1 希尔-冒泡排序(慢) 6.2 希尔-插入排序(快) 7. 堆排序 8. 计数排序 9 ...

  6. Java 算法(一)贪心算法

    Java 算法(一)贪心算法 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 一.贪心算法 什么是贪心算法?是指在对问题进行求 ...

  7. 基于贪心算法求解TSP问题(JAVA)

    概述 前段时间在搞贪心算法,为了举例,故拿TSP来开刀,写了段求解算法代码以便有需之人,注意代码考虑可读性从最容易理解角度写,没有优化,有需要可以自行优化! 详细 代码下载:http://www.de ...

  8. (java)五大常用算法

    算法一:分治法 基本概念 1.把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并. 2.分治策略是对于一个 ...

  9. 快速排序算法 java 实现

    快速排序算法 java 实现 快速排序算法Java实现 白话经典算法系列之六 快速排序 快速搞定 各种排序算法的分析及java实现 算法概念 快速排序是C.R.A.Hoare于1962年提出的一种划分 ...

  10. 贪心算法(Greedy Algorithm)

    参考: 五大常用算法之三:贪心算法 算法系列:贪心算法 贪心算法详解 从零开始学贪心算法 一.基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以 ...

随机推荐

  1. 【服务总线 Azure Service Bus】Service Bus在使用预提取(prefetching)后出现Microsoft.Azure.ServiceBus.MessageLockLostException异常问题

    问题描述 Service Bus接收端的日志中出现大量的MessageLockLostException异常.完整的错误消息为: Microsoft.Azure.ServiceBus.MessageL ...

  2. JZOJ2020年8月14日提高组反思

    JZOJ2020年8月14日提高组反思 T1 看到题 一脸:我是谁,我在哪,我要干啥 看到字符串凉一半 还有查询修改 想到线段树但不会建模 暴力安排 T2 一开始觉得:水题 然后啪啪打脸 空间小,数据 ...

  3. Cassandra与职业发展 | 阿里云栾小凡 &#215; 蔚来汽车张旭东 &#215; 网龙阙乃祯

    # 活动精彩实录 | Cassandra与职业发展 点击此处观看完整活动录像​ 大家好,我叫邓为,我目前在DataStax担任领航架构师.我在DataStax工作了7年多的时间,也有7年多的Cassa ...

  4. Go语言基础--1.1 变量的声明

    1.标准格式: var name type     (var 关键字 name 变量名 type 类型)   命名规则:建议使用驼峰命名法 例如:var userName string    var ...

  5. 老猿学5G随笔:5G的三大业务场景eMBB、URLLC、mMTC

    5G的三大业务场景eMBB.URLLC.mMTC: eMBB:英文全称Enhanced Mobile Broadband,即增强移动宽带,是利用5G更好的网络覆盖及更高的传输速率来为用户提供更好的上网 ...

  6. Python的富比较方法__le__、__ge__之间的关联关系分析

    Python的富比较方法包括__le__.__ge__分别表示:小于等于.大于等于,对应的操作运算符为:"<=".">=".那么是否象普通数字运算一 ...

  7. v-lazyload数据变化图片不切换

    这个问题让我很困惑,明明得到的商品数据已经改变了,但是就图片不变化,随后找到了解决办法,那就是多加一个动态的key <img v-lazy="item.productImage&quo ...

  8. VMware虚拟机下Centos8 设置静态IP地址

    缘起 我们在平时学习Redis.Nginx等分布式微服务的组件的时候,无法避免的需要用到Linux操作系统,而Linux操作系统的主机来源差不多就三种情况: 真实物理机 阿里云等云服务器 利用虚拟机 ...

  9. Java并发编程的艺术(十二)——并发容器和框架

    ConcurrentHashMap 为什么需要ConcurrentHashMap HashMap线程不安全,因为HashMap的Entry是以链表的形式存储的,如果多线程操作可能会形成环,那样就会死循 ...

  10. 后台运行程序nohup的使用

    linux后台运行程序 nohup python3 test.py >output 2>&1 & 参数解释 用途:不挂断地运行命令. 语法:nohup Command [ ...