常用的十大算法-贪心算法

介绍

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

应用

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

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

思路分析

1、遍历所有的广播电视台,找到一个覆盖了最多未覆盖的地区的电台(此电台可能包含一些已覆盖的地区)
2、将这个电台加入到集合中,把该电台覆盖的地区在下次比较时去掉。
3、重复第一步直到覆盖了全部的地区。

package algorithm;

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

/**
 * @author taoke
 * @desc 贪心算法
 * @email 1504806660@qq.com
 * @date 2022/1/24
 */
public class Greedy {
    public static void main(String[] args) {
        //创建广播电台
        HashMap<String, HashSet<String>> broadcast = new HashMap<>();
        //创建各个电台
        HashSet<String> set1 = new HashSet<>();
        set1.add("北京");
        set1.add("上海");
        set1.add("天津");
        HashSet<String> set2 = new HashSet<>();
        set2.add("广州");
        set2.add("北京");
        set2.add("深圳");
        HashSet<String> set3 = new HashSet<>();
        set3.add("成都");
        set3.add("上海");
        set3.add("杭州");
        HashSet<String> set4 = new HashSet<>();
        set4.add("上海");
        set4.add("天津");
        HashSet<String> set5 = new HashSet<>();
        set5.add("杭州");
        set5.add("大连");
        //将各个电台放入到广播电台中
        broadcast.put("K1", set1);
        broadcast.put("K2", set2);
        broadcast.put("K3", set3);
        broadcast.put("K4", set4);
        broadcast.put("K5", set5);

        //所有区域的集合
        HashSet<String> allArea = new HashSet<>();
        allArea.add("北京");
        allArea.add("上海");
        allArea.add("天津");
        allArea.add("广州");
        allArea.add("深圳");
        allArea.add("成都");
        allArea.add("杭州");
        allArea.add("大连");

        //存放所有已选择的电台
        List<String> selectList = new ArrayList<>();
        //临时变量
        HashSet<String> tempSet = new HashSet<>();
        //最大值
        String maxKey;
        //如果allArea.size 不为零表示还没有覆盖到所有地区
        while (allArea.size() > 0) {
            //每一轮都要重置maxKey
            maxKey = null;
            //每次遍历broadcast,取出key值
            for (String key : broadcast.keySet()) {
                //清空tempSet
                tempSet.clear();
                HashSet<String> area = broadcast.get(key);
                //每次取出一个key所对应的区域,并且放入到tempSet中,和allArea比较,保留和allArea相交的区域
                //并且将结果保存到tempSet中
                tempSet.addAll(area);
                tempSet.retainAll(allArea);
                //如果当前这个key取出的区域比maxKey未覆盖的区域还要多
                //则替换maxKey
                if (tempSet.size() > 0 && (null == maxKey || tempSet.size() > broadcast.get(maxKey).size())) {
                    maxKey = key;
                }
            }
            //如果maxKey不为空,将maxKey添加到selectList中,将已选择的区域从
            //allArea中移除掉
            if (null != maxKey) {
                selectList.add(maxKey);
                allArea.removeAll(broadcast.get(maxKey));
            }
        }
        System.out.println(selectList);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值