学习笔记-贪心算法

2023-11-05

贪心算法

贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。
贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。

集合覆盖问题

在这里插入图片描述
在这里插入图片描述

用贪心算法解决这个广播站问题的思路

对于这个问题,总体思路是用一个hashset存放未覆盖的所有地区(第一次时就是所有的地区)对所有广播台进行循环,每次选择出一个key,它所对应的地区与未被覆盖的所有地区的交集是最大的,也就是它是这一次的最优选择(贪心算法的核心思路),这个key就是最优解的一员,选择出key之后,把它加入最优解,并把它所对应的全部地区从set中删除,把key重新置空,然后重复这个过程,直到set长度为0,代表每一个地区都被覆盖,退出循环,得到结果。

从这个思路中不难发现,用贪心算法求解问题虽然最后可以满足条件,但得到的未必是最优解,因为它所保证的是局部的最优,而不是总体的最优,它每一次只考虑当前循环的情况,而没有考虑之前的选择对现在的影响。也就是说,如果之前的情况对下一次的情况有影响,他们直接不是完全独立的,贪心算法就不一定能得到最优解。

package algorithm;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;

/**
 * 贪心算法
 */
public class greedy {
    public static void main(String[] args) {
        //创建广播电台,放入到 Map
        HashMap<String, HashSet<String>> broadcasts = new HashMap<String, HashSet<String>>();
        //将各个电台放入到 broadcasts
        HashSet<String> hashSet1 = new HashSet<String>();
        hashSet1.add("北京");
        hashSet1.add("上海");
        hashSet1.add("天津");
        HashSet<String> hashSet2 = new HashSet<String>();
        hashSet2.add("广州");
        hashSet2.add("北京");
        hashSet2.add("深圳");
        HashSet<String> hashSet3 = new HashSet<String>();
        hashSet3.add("成都");
        hashSet3.add("上海");
        hashSet3.add("杭州");
        HashSet<String> hashSet4 = new HashSet<String>();
        hashSet4.add("上海");
        hashSet4.add("天津");
        HashSet<String> hashSet5 = new HashSet<String>();
        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<String> allAreas = new HashSet<String>();
        allAreas.add("北京");
        allAreas.add("上海");
        allAreas.add("天津");
        allAreas.add("广州");
        allAreas.add("深圳");
        allAreas.add("成都");
        allAreas.add("杭州");
        allAreas.add("大连");
        //创建 ArrayList, 存放选择的电台集合
        ArrayList<String> selects = new ArrayList<String>();
        //存放临时电台
        HashSet<String> temp;
        HashSet<String> maxtemp;

        String maxKey=null;

        //算法开始
        while (allAreas.size()>0){
            maxKey=null;
            for (String key:broadcasts.keySet()) {
                temp = broadcasts.get(key);
                //取交集,结果是temp
                temp.retainAll(allAreas);
                if(temp.size()>0) {
                    if (maxKey == null) {
                        maxKey = key;
                    } else {
                        maxtemp = broadcasts.get(maxKey);
                        maxtemp.retainAll(allAreas);
                        //贪心
                        if (temp.size() > maxtemp.size()) {
                            maxKey = key;
                        }
                    }
                }

            }
            //遍历一次后得到一个maxkey
            if(maxKey!=null){
                allAreas.removeAll(broadcasts.get(maxKey));
                selects.add(maxKey);
                broadcasts.remove(maxKey);
            }
        }
        System.out.println(selects);
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习笔记-贪心算法 的相关文章

随机推荐

  • 贝叶斯网络—MATLAB学习笔记(1)

    快速导览 一 贝叶斯网络的原理 二 构建贝叶斯网络 1 matlab中添加贝叶斯网络构建工具FullBNT 2 实例分析 实例1 实例2 三 注意事项 四 所遇问题及解决方案 1 问题一 贝叶斯网络无箭头 2 问题二 draw graph函
  • 前端bootstrapTable添加行,删除行,获取选择数据,表格数据

    前端bootstrapTable获取选择数据 表格数据 1 获取表格所有数据 var allData tableId bootstrapTable getData 获取表格所有数据 2 获取表格选择的数据 var selectedModel
  • 【React】15课 react项目打包并运行

    react项目的打包 在该项目文件夹中打开终端输入 npm run build 项目打包命令 打包成功后文件夹中会多出一个 build 文件 该文件就是打包好的项目 react项目打包后的启动方法 我们如何启动该项目呢 首先我们全局安装li
  • 如何在matlab中画二元函数的图像,Matlab画怎么画这个二元函数图像

    www mh456 com防采集 二元函数可以用mesh或者surf函数画图 1 首先打开matlab 2 在 matlab 当前目录空间右键 3 然后点击 new gt M File 4 然后将文件命令为hello m 5 然后双击该文件
  • cos三次方积分_cos三次方的定积分

    求不定积分 cosx 的三次方dx 要求 要有最详细的过程 不要简写 一 详细过程如下 cos xdx cos xdsinx 1 sin x dsinx dsinx sin xdsinx sinx sin x 3 C 二 拓展资料 关于不定
  • 10. 数据类型 - 元组详解

    Hi 大家好 我是茶桁 之前两节分别介绍了字符串和列表 今天 我们来讲讲另外一个常用到的数据类型 元组 元组和列表很像 两者都是一组有序的数据的组合 但是也有很多不同点 比如元组内的元素一旦定义了就不可以再修改 因此元组称为不可变数据类型
  • UIKit框架之—— UIButton

    按钮通常使用 Touch Up Inside 事件来体现 能够抓取用户用手指按下并在该按钮上松开发生的事件 当检测到事件后 便可能触发相应视图控件中的操作 IBAction 创建一个按钮 初始化按钮的frame UIButton butto
  • DVWA系列Web常见漏洞XSS(DOM)源码分析及漏洞利用

    前言 本期主要讲解什么是基于DOM的XSS漏洞 XSS DOM 漏洞攻击实例 基于DOM的XSS漏洞产生的原因以及一般会在何处产生 最后讲解如何利用基于DOM的XSS漏洞 如XSS经典的窃取cookie等 DOM 全称Document Ob
  • 人脸检测(图像处理)

    FaceDetector类支持从指定的位图中检测出人脸所在的区域 检测结果用DetectedFace对象表示 人脸检测结果可以从DetectedFace类公开的FaceBox属性中获取 包含人脸区域相对于位图的位置 例如X和Y坐标 以及宽度
  • SIEM 中不同类型日志监控及分析

    安全信息和事件管理 SIEM 解决方案通过监控来自网络的不同类型的数据来确保组织网络的健康安全状况 日志数据记录设备上发生的每个活动以及整个网络中的应用程序 若要评估网络的安全状况 SIEM 解决方案必须收集和分析不同类型的日志数据 什么是
  • java需要掌握的知识点

    一阶段 JavaSE基础 第一步 夯实Java基础语法 1 Java语言的发展史 2 JDK的下载和安装 3 DOS命令的介绍和使用 4 Path环境变量的配置 5 第一个代码HelloWorld案例 6 NotePad 软件的安装和使用
  • 小程序踩坑

    1 swiper 点击 class不能使用原生名字 去掉round dot才能去掉点 2 转发 3 下拉刷新 json enablePullDownRefresh true 要及时关闭刷新等待 wx stopPullDownRefresh
  • 搭建前端环境

    搭建前端环境 一 安装好谷歌浏览器 二 官网下载地址 下载 Node js Node js默认安装目录为 C Program Files nodejs 你也可以修改目录 记住 一路都是 next 下一步 最后install 等安装好 在命令
  • C语言 队列(循环队列和链队初始化进出队等基本操作)

    目录 一 队列的定义 二 循环队列 1 循环队列的储存结构 2 初始化 3 输出队列元素 4 入队 5 出队 6 取队头元素 7 求队列长度 8 源代码 三 链式队列 1 队列的链式存储结构表示 2 初始化 3 输出队列元素 4 入队 5
  • R:获取文件和目录信息

    对于实现获取文件和目录的信息 设置文件访问权限等功能 R有各种函数 file info 参数是表示文件名称的字符串向量 函数会给出每个文件的大小 创建时间 是否为目录等信息 dir 返回一个字符向量 列出在其第一个参数指定的目录中所有文件的
  • Unity3D GUI学习

    Unity3D内置有GUI 首先 使用GUI实现一个按钮 并且点击实现触发 void OnGUI GUI Button new Rect 10 10 50 50 nihaoa if GUI Button new Rect 50 50 50
  • java后台下载附件_java 后台文件下载

    public static void download HttpServletRequest request HttpServletResponse response String filePath String displayName t
  • [Orangepi 3 LTS]学习记录(二)

    本章内容基于官方手册 OrangePi 3 LTS H6 用户手册 v2 4 与自己实际操作撰写 一 设置 linux 系统终端自动登录 1 root 用户自动登录终端 先输入下面的命令创建终端自动登录的配置文件 root orangepi
  • Java中的常用日志框架合集

    目录 一 日志的概念 1 1 日志文件 1 1 1 调试日志 1 1 2 系统日志 二 Java日志框架 2 1 JUL 2 1 1 架构介绍 2 1 2 使用与日志级别 2 1 3 日志的配置文件 2 1 4 原理解析 2 2 LOG4J
  • 学习笔记-贪心算法

    贪心算法 贪婪算法 贪心算法 是指在对问题进行求解时 在每一步选择中都采取最好或者最优 即最有利 的选择 从而希望能够导致结果是最好或者最优的算法 贪婪算法所得到的结果不一定是最优的结果 有时候会是最优解 但是都是相对近似 接近 最优解的结