贪婪算法

基本介绍

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

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

问题举例

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

思路解析

使用贪婪算法,效率高:

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

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

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

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

过程

1、整合出所有地区 :[成都, 上海, 广州, 天津, 大连, 杭州, 北京, 深圳]
2、遍历所有的广播电台, 找到出覆盖了未覆盖的地区的电台
3、由2得 K1:3;K2:3;K3:3;K4:2;K5:2
4、后面的值不大于K1,所以把K1加入结果中
5、此时的地区:[成都, 广州, 大连, 杭州, 深圳]
6、重复2-4的步骤,得K1: 0;K2: 2;K3: 2;K4:0; K5 :2
7、后没有大于K2的,所以放入K2
8、继续重复上述步骤,最后的结果为K1,K2,K3,K5;

代码

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;public class Greedy {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<>();hashSet5.add("杭州");hashSet5.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("大连");// 存放所有地区ArrayList<Object> select = new ArrayList<>();// 存放遍历过程中电台覆盖的地区和当前还没有覆盖的地区的交集HashSet<String> tempSet = new HashSet<>();// 设置一个覆盖了最多未覆盖的地区的电台String maxKey = null;System.out.println(allAreas);while (allAreas.size() != 0) {maxKey = null;// 遍历取出每一个电台for (String key : broadcasts.keySet()) {// 清空tempSet.clear();// 取出每个电台所对应的地区HashSet<String> areas = broadcasts.get(key);tempSet.addAll(areas);// 与非覆盖的地区求交集tempSet.retainAll(allAreas);// 核心,找出最大的那个值(即其他电台不大于此时的值)if (tempSet.size() > 0 && (maxKey == null || tempSet.size() > broadcasts.get(maxKey).size())) {maxKey = key;}}if (maxKey != null) {select.add(maxKey);allAreas.removeAll(broadcasts.get(maxKey));}}System.out.println(select);}
}

贪婪算法——十大算法相关推荐

  1. 常用十大算法 非递归二分查找、分治法、动态规划、贪心算法、回溯算法(骑士周游为例)、KMP、最小生成树算法:Prim、Kruskal、最短路径算法:Dijkstra、Floyd。

    十大算法 学完数据结构该学什么?当然是来巩固算法,下面介绍了十中比较常用的算法,希望能帮到大家. 包括:非递归二分查找.分治法.动态规划.贪心算法.回溯算法(骑士周游为例).KMP.最小生成树算法:P ...

  2. 【数据结构与算法】 常用的十大算法

    常用的十大算法: 文章目录 常用的十大算法: 1.二分查找算法(非递归): 2.分治算法 2.1分治算法介绍 2.2 分治算法的基本步骤 2.3 分治算法最佳实践-汉诺塔 2.4 动态规划算法 2.4 ...

  3. 十大算法,描述+代码+演示+分析+改进(赶紧收藏!)

    十大算法 1.冒泡排序 ​ (1)算法描述 ​ 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来.走访数列的工作是重复地进行直到没有再需要 ...

  4. java培训:Java的十大算法

    想要学好java语言,就要打好基础,java要学习的东西有很多,今天小编就来和大家说下java的十大算法. 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个 ...

  5. 细数二十世纪最伟大的十大算法

    参考文献: The Best of the 20th Century: Editors Name Top 10 Algorithms. By Barry A. Cipra.地址:http://www. ...

  6. 新手入门机器学习十大算法

    新手入门机器学习十大算法 2018年9月17日 磐石 TensorFlowNews, 机器学习 0 在机器学习的世界中,有一种被称为"无免费午餐"的定理. 它意在说明没有哪种算法能 ...

  7. 统治世界的十大算法(转)

    原文:http://www.ctocio.com/ccnews/15714.html 软件正在吃掉世界,而软件的核心则是算法.算法千千万万,又有哪些算法属于"皇冠上的珍珠"呢?Ma ...

  8. 数据挖掘经典十大算法_对基本概念的理解

    数据挖掘经典十大算法 一.十大经典算法 二.信息量 信息量是对信息的度量,例如时间的度量是秒,我们考虑一个离散的随机变量x时,当我们观察到的这个变量的一个具体值的时候,我们接收到的多少信息 用信息量来 ...

  9. 人工智能领域的十大算法

    事实上,人工智能已经存在于我们生活中很久了.但对很多人来讲,人工智能还是一个较为"高深"的技术,然而再高深的技术,也是从基础原理开始的.人工智能领域中就流传着10大算法,它们的原理 ...

最新文章

  1. 背景图像位置css_CSS背景图像大小教程–如何对整页背景图像进行编码
  2. 公司新来的同事一顿操作把大家整懵了,问了他的经历细思极恐。。。
  3. python xlwings下载_Python学习随笔:使用xlwings读取和操作Execl文件
  4. AngularJS API
  5. (原创)惠州市惠阳区房价偏低的原因深入分析
  6. TFS突然链接不上(TF30063),并且MSN也连接不上,报主要端口的错误!
  7. 巴菲特:比特币纯粹是FOMO(害怕错过)
  8. WPF学习(3) – WPF控件
  9. python继承方式是基于原型吗_[译] 为什么原型继承很重要
  10. TCA笔记4:TCA代码笔记
  11. android dagger2 原理,Dagger2 系列(四)Dagger2.Android基本原理
  12. 数理化解题研究杂志数理化解题研究杂志社数理化解题研究编辑部2022年第15期目录
  13. springCloud报错No instances available
  14. 关于计算机系统的基本组成
  15. 爬取链家任意城市租房数据(北京朝阳)
  16. strom 在linux下部署、基本命令
  17. 学习笔记day07_HTML
  18. 新兴媒体舆情传播动态实时监测的技术解决方案
  19. 用C语言设计一个简易的选择题答题系统
  20. dydx开发的坑。。。

热门文章

  1. Metasploit域渗透测试全程实录(终结篇)
  2. 陌陌“时刻”增加时间属性 视频社交更立体全景
  3. 图形驱动程序和显卡驱动什么区别_什么是集成显卡 集成显卡与独立显区别介绍【详解】...
  4. 网络”X客”大集合:博客、维客、奇客、播客、闪客、摩客、威克…
  5. office2003弹出安装提示
  6. python reverse()函数
  7. flask mysql orm_Flask笔记:数据库ORM操作MySQL+pymysql/mysql-python+SQLAlchemy/Flask-SQLAlchemy...
  8. js 实现网页表格数据导出到Excel表
  9. buuoj [BJDCTF 2nd]小姐姐-y1ng
  10. java毕业设计之酒店管理系统(源码+文档)