贪心算法

应用场景-集合覆盖问题

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

广播台 覆盖地区
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. redis 五大数据类型使用

    redis 五大数据类型使用 字符串str 单个值 127.0.0.1:6379> set name pp # 设置键值[O(1)] OK 127.0.0.1:6379> setex na ...

  2. php项目使用git的webhooks实现自动部署

    前言 在项目开发中使用git进行代码的管理,每次完成更改上传代码后,还需要登录服务器将代码拉取下来.现在git服务器(gitee/gitlab/github)都会有Webhooks功能,以实现在向gi ...

  3. Python to Exe By Install PyInstaller on Win7-64bit

    本文主要记录为史振华在尝试转换PY文件为EXE文件过程中各种疑惑和最终解决方法,尝试了PYTHON 2.7/3.5/3.6及其相关依赖pywin32-222.win32/pywin32-222.win ...

  4. dubbo源码学习(二)dubbo容器启动流程简略分析

    dubbo版本2.6.3 继续之前的dubbo源码阅读,从com.alibaba.dubbo.container.Main.main(String[] args)作为入口 简单的数据一下启动的流程 1 ...

  5. PyQt学习随笔:Qt中tem Views(Model-Based)和Item Widgets(Item-Based)控件的用途和关系

    在界面程序开发中,数据的展示主要包括表格.简单列表.树状列表以及纯文本等多种方式,在Qt中将界面表格.简单列表.树状列表称为"表项视图类(item view class)",并提供 ...

  6. WinForm 加载大数据时不闪烁的ListView

    自己之前做小工具的时候,遇到这个问题,记录一下... namespace 相册处理 { //将ListView重载为此新类,解决加载过程中闪烁的问题 //在designer.cs中改写: //priv ...

  7. 事后Postmortem会议

    会议图片 一.设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我的软件是要建立一个失物招领网站,是一个为校园里的失误招领工作提供便利的平台.我们对 ...

  8. kubernetes集群断电后etcd启动失败之etcd备份方案

    一.问题描述 二进制部署的单Master节点的v1.13.10版本的集群,etcd部署的是3.3.10版本,部署在master节点上.在异常断电后,kubernetes集群无法正常启动.这里通过查看k ...

  9. JDBC(二)—— 获取连接池方式

    ## 获取数据库连接的方式 ### 方式一 ```javaDriver driver = new com.mysql.cj.jdbc.Driver(); String url = "jdbc ...

  10. AcWing 322. 消木块

    由于木块可以由一些木块的消除,使两边相同颜色的合并 所以我们设定一个归并方式,即每个区间记录一下右边的延展性. (等于左边找右边) 设 \(f[i][j][k]\) 为\([i, j]\) 区间,右侧 ...