贪心算法

应用场景-集合覆盖问题

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

广播台 覆盖地区
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. 通过自定义拦截器优雅的导出Excel并标红的重复数据

    平时我们导入导出Excel的时候如果用poi导出,会发现光设置格式都要很多代码,看起来非常的不优雅.后来业务中遇到了需要导入非常巨大的Excel的需求.如果继续用poi的方式,因为poi把所有exce ...

  2. java并发编程实战《二十一》无锁工具类

    不安全的累加代码,如下 1 public class Test { 2 long count = 0; 3 void add10K() { 4 int idx = 0; 5 while(idx++ & ...

  3. Python中的"缝合器"zip函数:将多个可迭代对象组合成一个迭代器

    zip函数将参数中多个可迭代对象中相同序号的元素取出组合成一个元组作为输出列表的一个同样序号的元素,即输出列表的每个元素是一个元组,该元组的元素来源于参数中每个迭代对象的对应序号的元素. 具体可参考: ...

  4. Python中排序函数sorted和排序方法sort的异同点对比分析

    Python中对序列进行排序有两种方法,一种是使用python内置的全局sorted函数,另一种是使用序列内置的sort方法. 一. 两者相同点 在支持sort方法的序列中都可以对序列进行排序: 二者 ...

  5. PyQt学习随笔:QTableWidget水平表头horizontalHeader、竖直表头verticalHeader的相关操作方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTableWidget表格部件的表头包括水平表头和竖直表头,水平表头每节对应表格的一列,竖直表头对 ...

  6. 第十二章、Designer中的menu菜单、toolBar工具栏和Action动作

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 Qt Designer中的部件栏并没有菜单.toolBar以及Action相关的部件,仅在 ...

  7. 冲刺Day7

    每天举行站立式会议照片: 昨天已完成的工作: 1.确认商品分类栏,并前后端交互 2.检查.更正订单模块的代码 3.检查.更正用户模块的代码 今天计划完成的工作: 成员 任务 高嘉淳 检查代码.提供测试 ...

  8. 实现一个类型判断函数,需要鉴别出基本类型、function、null、NaN、数组、对象?

    只需要鉴别这些类型那么使用typeof即可,要鉴别null先判断双等判断是否为null,之后使用typeof判断,如果是obejct的话,再用Array.isArray判断是否为数组,如果是数字再使用 ...

  9. 国际关注,Panda 交易所获悉美银监机构批准特许银行托管加密资产

    近期,Panda 交易所注意到,根据此前与Cointelegraph分享的一份声明,美国货币监理署(OCC)正在授予联邦特许银行托管加密货币的权限. 鉴于加密钱包与其他种类资产的托管要求不同,这一问题 ...

  10. JavaScript:使用递归构建树型菜单

    使用递归函数将扁平数据转为树型结构,并渲染到页面 效果图: 代码: <!DOCTYPE html> <html lang="en"> <head> ...