介绍

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

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

应用场景-集合覆盖问题

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

image

思路分析:

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

image

效率低下,运算量大。

使用贪婪算法

使用贪婪算法,效率高:

目前并没有算法可以快速计算得到准备的值, 使用贪婪算法,则可以得到非常接近的解,并且效率高。选择策略上,因为需要覆盖全部地区的最小集合:

遍历所有的广播电台, 找到一个覆盖了最多未覆盖的地区的电台(此电台可能包含一些已覆盖的地区,但没有关系)

将这个电台加入到一个集合中(比如ArrayList), 想办法把该电台覆盖的地区在下次比较时去掉。

重复第1步直到覆盖了全部的地区

image

步骤:

定义一个maxkey,用于保存选择的广播电台占最多未选择的地区的值。

每次轮询广播台时,都需要一个临时hashSet去retain判断是否有更好的广播台。

贪心算法注意事项和细节

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

比如上题的算法选出的是K1, K2, K3, K5,符合覆盖了全部的地区

但是我们发现 K2, K3,K4,K5 也可以覆盖全部地区,如果K2 的使用成本低于K1,那么我们上题的 K1, K2, K3, K5 虽然是满足条件,但是并不是最优的.

代码

public static void main(String[] args) {

//创建广播电台,放入到Map

HashMap> broadcasts = new HashMap>();

//将各个电台放入到broadcasts

HashSet hashSet1 = new HashSet();

hashSet1.add("北京");

hashSet1.add("上海");

hashSet1.add("天津");

HashSet hashSet2 = new HashSet();

hashSet2.add("广州");

hashSet2.add("北京");

hashSet2.add("深圳");

HashSet hashSet3 = new HashSet();

hashSet3.add("成都");

hashSet3.add("上海");

hashSet3.add("杭州");

HashSet hashSet4 = new HashSet();

hashSet4.add("上海");

hashSet4.add("天津");

HashSet hashSet5 = new HashSet();

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 allAreas = new HashSet();

allAreas.add("北京");

allAreas.add("上海");

allAreas.add("天津");

allAreas.add("广州");

allAreas.add("深圳");

allAreas.add("成都");

allAreas.add("杭州");

allAreas.add("大连");

//创建ArrayList, 存放选择的电台集合

ArrayList selects = new ArrayList();

//定义一个临时的集合, 在遍历的过程中,存放遍历过程中的电台覆盖的地区和当前还没有覆盖的地区的交集

HashSet tempSet = new HashSet();

//定义给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

tempSet.clear();

//当前这个key能够覆盖的地区

HashSet areas = broadcasts.get(key);

tempSet.addAll(areas);

//求出tempSet 和 allAreas 集合的交集, 交集会赋给 tempSet

tempSet.retainAll(allAreas);

//如果当前这个集合包含的未覆盖地区的数量,比maxKey指向的集合地区还多

//就需要重置maxKey

// tempSet.size() >broadcasts.get(maxKey).size()) 体现出贪心算法的特点,每次都选择最优的

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);//[K1,K2,K3,K5]

}

结果:

image

matlab求解集合覆盖问题,贪心算法实践之集合覆盖问题相关推荐

  1. 贪心算法讲解(集合覆盖问题,旅行商问题求解)

    教室调度问题 假设有如下课程表,你希望将尽可能多的课程安排在某间教室上. 你没法让这些课都在这间教室上,因为有些课的上课时间有冲突. 你希望在这间教室上尽可能多的课.如何选出尽可能多且时间不冲突的课程 ...

  2. matlab 求解目标规划的序贯算法

    求解目标规划的序贯算法 clc,clear; x=optimvar('x',2,'LowerBound',0); dp=optimvar('dp',4,'LowerBound',0); dm=opti ...

  3. matlab 求解 Ax=B 时所用算法

    x = A\B; x = mldivide(A, B); matlab 在这里的求解与严格的数学意义是不同的, 如果 A 接近奇异,matlab 仍会给出合理的结果,但也会提示警告信息: 如果 A 为 ...

  4. matlab ax=b x=,matlab 求解 Ax=B 时所用算法

    Weblogic是瓦特?和JVM是瓦特关系? 所谓固定内存60M是瓦特? 以下内容是个瓦特? "总内存大小=堆内存+非堆内存1200m:为堆内存大小,如果不指定后者参数则有最大数限制,网上很 ...

  5. 贪心算法简单实践 -- 分糖果、钱币找零、最多区间覆盖、哈夫曼编解码

    1. 贪心算法概览 贪心算法是一种算法思想.希望能够满足限制的情况下将期望值最大化.比如:Huffman编码,Dijkstra单源最短路径问题,Kruskal最小生成树 等问题都希望满足限制的情况下用 ...

  6. 算法导论之贪心算法(Huffman编码和拟阵)

    贪心算法,在解决最优化问题上,通过得到子问题的局部最优解来合成问题的一个解,以局部最优选择来输出一个全局最优解. 问题要用贪心算法来求解,需满足和动态规划一样的最优子结构特征,同时还需要再每个子问题最 ...

  7. 活动安排问题的 动态规划和贪心算法

    这篇文章主要用来记录我对<算法导论> 贪心算法一章中的"活动选择问题"的动态规划求解和贪心算法求解 的思路和理解. 主要涉及到以下几个方面的内容: ①什么是活动选择问题 ...

  8. 从 活动选择问题 看动态规划和贪心算法的区别与联系

    这篇文章主要用来记录我对<算法导论> 贪心算法一章中的"活动选择问题"的动态规划求解和贪心算法求解 的思路和理解. 主要涉及到以下几个方面的内容: ①什么是活动选择问题 ...

  9. 算法设计与分析:贪心算法 - 排课问题(DP与贪心的区别与应用)

    文章目录 前言 贪心算法概念 排课问题 问题描述与分析 动态规划求解 简化问题应用贪心算法 总结 本文参考UCAS卜东波老师算法设计与分析课程撰写 前言 前面两大章节的内容分治思想与动态规划暂时告一段 ...

最新文章

  1. python集合中的元素是否可以重复_python中集合中的元素是否可以重复
  2. 一步一步深入spring(6)--使用基于XML配置的spring实现的AOP
  3. linux服务器插上硬盘不能开机,Linux服务器添加新硬盘无法识别解决方法(无需重启)...
  4. Anaconda配置的环境里面增加第三方库的方法
  5. C++ rand,srand用法
  6. php 网路io是什么意思,io接口位于什么和什么之间
  7. 进程,线程,协程的区别与联系
  8. gc buffer busy release
  9. JAVA毕业设计Web企业差旅在线管理系统计算机源码+lw文档+系统+调试部署+数据库
  10. 达梦数据库学习之备份还原
  11. html m3u8 flash,m3u8插件-支持在pc端(flashplayer)播放m3u8格式文件-ckplayer使用方法...
  12. HDU1556--涂气球
  13. 基于jsp的KTV管理系统mysql
  14. Arcgis二次开发——建立自己的小工程
  15. 13 PHP次末跳弹出pemultimate hop popping
  16. Qt编写地图综合应用19-地图服务
  17. Mac系统Jython安装与使用
  18. SysFader IEXPLOER.EXE-应用程序错误的解决办法
  19. 整型数组处理算法(十三)请实现一个函数:凑14。[风林火山]
  20. 从富士康流水线工人到某支付公司技术总监的心路历程

热门文章

  1. ubuntu workerman kaer
  2. GitHub遭攻击滥用以代管网钓套件
  3. java源码 - ReentrantReadWriteLock介绍
  4. CentOS 6.8 安装最新版 Git
  5. 在Mac OS X macOS Sierra上进行VirtualBox和GNS3链接
  6. php 的包管理工具 composer
  7. 为什么你应该深入Github
  8. HTML5学习笔记简明版(10):过时的元素和属性
  9. GNS3错误7200:无法开始Dynamips于端口7200
  10. 新一代数据中心标准化统一交换架构