贪心算法

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

应用场景-集合覆盖问题

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

广播台 覆盖地区
K1 "北京", "上海", "天津"
K2 "广州", "北京", "深圳"
K3 "成都", "上海", "杭州"
K4 "上海", "天津"
K5 "杭州", "大连"

贪心算法介绍

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

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

代码示例

package com.wxit.greedy;

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

/**
 * @Author wj
 * 贪心算法
 **/
public class GreedyAlgorithm {

    public static void main(String[] args) {
        //创建广播电台,放入到Map中
        HashMap<String, HashSet<String>> broadcasts = new HashMap<>();
        //将各个电台放入到broadcasts
        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("大连");

        //加入到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> tempSet = new HashSet<>();

        //定义给maxKey,保存在一次遍历过程中,能够覆盖最大未覆盖的地区的电台key,如果key不为空,则会加入到selects
        String maxKey = null;
        while (allAreas.size() != 0){ //如果allAreas不为0,则表示还没有覆盖到所有的地区
            //每进行一次while,需要
            maxKey = null;
            //遍历broadcasts,取出对应的key
            for (String key : broadcasts.keySet()) {
                //每进行一次for
                tempSet.clear();;
                //当前这个key能够覆盖的地区
                HashSet<String> areas = broadcasts.get(key);
                tempSet.addAll(areas);
                //求出temSet和allAreas集合的交集,交集会赋给temSet
                tempSet.retainAll(allAreas);
                //如果当前这个集合包含的未覆盖地区的数量,比maxKey指向的集合地区还多,就需要重置maxKey
                if (tempSet.size() > 0 && (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);
    }
}
相关文章
|
存储 缓存 并行计算
CPU组成元素:运算器+控制器(一)
CPU组成元素:运算器+控制器
5335 0
|
开发框架 Dart Android开发
安卓与iOS的跨平台开发:Flutter框架深度解析
在移动应用开发的海洋中,Flutter作为一艘灵活的帆船,正引领着开发者们驶向跨平台开发的新纪元。本文将揭开Flutter神秘的面纱,从其架构到核心特性,再到实际应用案例,我们将一同探索这个由谷歌打造的开源UI工具包如何让安卓与iOS应用开发变得更加高效而统一。你将看到,借助Flutter,打造精美、高性能的应用不再是难题,而是变成了一场创造性的旅程。
|
3月前
|
编解码 Java 关系型数据库
SpringBoot 集成阿里云直播 + 点播全实战:推流、拉流、转码、回放一站式落地
本文详解阿里云直播与点播的集成实践,涵盖核心原理(推流/拉流链路、录制转点播联动)、环境配置、SpringBoot项目搭建(Maven依赖、数据库设计、鉴权工具)、全模块代码实现(直播流管理、点播上传播放、事件回调处理)及常见问题排查,助力快速构建稳定音视频应用。
930 6
|
前端开发 JavaScript UED
Python Web应用中的WebSocket实战:前后端分离时代的实时数据交换
【7月更文挑战第16天】在前后端分离的Web开发中,WebSocket解决了实时数据交换的问题。使用Python的Flask和Flask-SocketIO库,后端创建WebSocket服务,监听并广播消息。前端HTML通过JavaScript连接到服务器,发送并显示接收到的消息。WebSocket适用于实时通知、在线游戏等场景,提升应用的实时性和用户体验。通过实战案例,展示了如何实现这一功能。
752 2
|
机器学习/深度学习 网络架构
子网划分详解
子网划分详解
1606 0
|
7月前
|
缓存 并行计算 Shell
毅硕HPC | 在HPC集群上优雅地使用conda
通过本教程,你将掌握在HPC集群中从零开始部署并高效利用Conda的核心技能。为你的课题创建一个干净的environment.yml文件,让你的科研计算之旅更加规范、高效和可复现。
772 0
|
5G 测试技术 UED
带你读《5G NR标准:下一代无线通信技术》之二:5G标准化
本书对NR标准进行了描述。NR标准是在2018年春末由3GPP制定的新一代无线接入技术标准。本书内容比较偏底层,阅读时结合协议去读会有更大的收获,而且全书深入浅出的风格非常好,可以使读者读后知其然又知其所以然!
|
6月前
|
JavaScript API 开发工具
淘宝API SDK快速开发指南
本文介绍如何快速接入淘宝开放平台API,使用官方SDK实现商品查询等高效调用。涵盖环境配置、客户端初始化、API调用与响应处理,并提供错误码解析、频率控制及批量请求等实战技巧,助开发者提升集成效率。
|
运维 Linux
Linux系统调优详解(五)——磁盘IO状态查看命令
Linux系统调优详解(五)——磁盘IO状态查看命令
797 2

热门文章

最新文章