ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

贪心算法-广播覆盖问题

2022-06-05 18:31:36  阅读:153  来源: 互联网

标签:广播 listCity HashSet tempK 算法 add new kMap 贪心


1.背景

2.代码

package com.ldp.algorithm.demo03Greedy;

import org.junit.Test;

import java.util.*;

/**
 * @create 06/03 9:10
 * @description <p>
 * 贪心算法
 * 需求:
 * 广播台  覆盖地区
 * K1       北京,上海,天津
 * K2       广州,北京,深圳
 * K3       成都,上海,杭州
 * K4       上海,天津
 * K5       杭州,大连
 * </p>
 */
public class Test01 {
    @Test
    public void test01() {
        // 广播站kMap
        Map<String, HashSet<String>> kMap = new HashMap<>();
        // 需要覆盖的城市
        HashSet<String> listCity = new HashSet<>();
        // 已选择的广播站
        // Map<String, HashSet<String>> kMapSelect = new HashMap<>();
        List<String> kMapSelect = new ArrayList<>();
        // 初始化数据
        init(kMap, listCity);
        System.out.println(listCity);
        // 存放某个电台覆盖地区与所有需要覆盖地区的交集
        HashSet<String> tempK = new HashSet<>();
        // 找出覆盖城市最多的广播站
        int maxSize = 0;
        String maxNameK = "";
        // 最大的交集
        HashSet<String> maxRetainK = new HashSet<>();
        while (listCity.size() > 0) {
            for (String item : kMap.keySet()) {
                // 清空临时变量
                tempK.clear();
                HashSet<String> itemK = kMap.get(item);
                // 加入当前电台需要覆盖度额地区
                tempK.addAll(itemK);
                // 与需要覆盖地区的交集,存放于tempK中
                tempK.retainAll(listCity);
                // 计算tmpK的覆盖地区个数
                int size = tempK.size();
                if (size > maxSize) {
                    maxSize = size;
                    maxNameK = item;
                    maxRetainK.addAll(tempK);
                }
            }
            // 找到一个可以添加的电台
            if (maxSize > 0) {
                kMapSelect.add(maxNameK);
                // 删除已添加的电台
                kMap.remove(maxNameK);
                // 移除已经覆盖的电台地区
                listCity.removeAll(maxRetainK);
                // 最大交集清零
                maxRetainK.clear();
                maxSize = 0;
            } else {
                System.out.println("没有找到可以添加的电台,地区没有覆盖完整");
                break;
            }
        }
        System.out.println("已选择的电台:" + kMapSelect);
    }

    public void init(Map<String, HashSet<String>> kMap, HashSet<String> listCity) {
        HashSet<String> k1List = new HashSet<>();
        k1List.add("北京");
        k1List.add("上海");
        k1List.add("天津");
        kMap.put("K1", k1List);

        HashSet<String> k2List = new HashSet<>();
        k2List.add("广州");
        k2List.add("北京");
        k2List.add("深圳");
        kMap.put("K2", k2List);

        HashSet<String> k3List = new HashSet<>();
        k3List.add("成都");
        k3List.add("上海");
        k3List.add("杭州");
        kMap.put("K3", k3List);

        HashSet<String> k4List = new HashSet<>();
        k4List.add("上海");
        k4List.add("天津");
        kMap.put("K4", k4List);

        HashSet<String> k5List = new HashSet<>();
        k5List.add("杭州");
        k5List.add("大连");
        kMap.put("K5", k5List);

        for (String item : kMap.keySet()) {
            listCity.addAll(kMap.get(item));
        }
    }
}

 

完美!

标签:广播,listCity,HashSet,tempK,算法,add,new,kMap,贪心
来源: https://www.cnblogs.com/butingxue/p/16344564.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有