Java 算法分析 贪心算法

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

在这里插入图片描述

将广播台K2的广州修改成上海更能说明问题

public class Greedy {
    public static void main(String[] args) {
        //存放所有的广播台和覆盖地区
        HashMap<String, HashSet<String>> allSet=new HashMap<>();
        //存放一个电台的覆盖地区
        HashSet<String> area1=new HashSet<>();
        area1.add("北京");
        area1.add("上海");
        area1.add("天津");
        allSet.put("K1", area1);
        HashSet<String> area2=new HashSet<>();
        area2.add("上海");
        area2.add("北京");
        area2.add("深圳");
        allSet.put("K2", area2);
        //添加第三个覆盖地区
        HashSet<String> area3=new HashSet<>();
        area3.clear();
        area3.add("成都");
        area3.add("上海");
        area3.add("杭州");
        allSet.put("K3", area3);
        //添加第四个覆盖地区
        HashSet<String> area4=new HashSet<>();
        area4.clear();
        area4.add("上海");
        area4.add("天津");
        allSet.put("K4", area4);
        //添加第五个覆盖地区
        HashSet<String> area5=new HashSet<>();
        area5.clear();
        area5.add("杭州");
        area5.add("大连");
        allSet.put("K5", area5);
        //存放所有的地区
        HashSet<String> allArea = new HashSet<>();
        allArea.add("北京");
        allArea.add("上海");
        allArea.add("天津");
        allArea.add("深圳");
        allArea.add("成都");
        allArea.add("杭州");
        allArea.add("大连");
        greedyAlgorithm(allSet, allArea);
    }
    public static void greedyAlgorithm(HashMap<String,HashSet<String>> allSet,HashSet<String> allArea){
        //存放电视台
        ArrayList<String> television=new ArrayList<>();
        //存放当前地区与未覆盖地区的交集
        HashSet<String> tempArea=new HashSet<>();
        //未覆盖的地区的数目不为零继续找
        while(allArea.size()>0){
            //存放最大覆盖地区的广播台
            String maxKey=null;
            for (String s : allSet.keySet()) {
                tempArea.clear();
                tempArea.addAll(allSet.get(s));
                //当前广播台的覆盖地区和未覆盖地区的交集
                tempArea.retainAll(allArea);
                //保留各个广播台的覆盖地区和未覆盖地区的交集
                allSet.get(s).retainAll(allArea);
                //当前电视台的覆盖地区的交集和记录最大覆盖地区电视台的覆盖地区的交集比较
                if(tempArea.size()>0&&(maxKey==null||tempArea.size()>allSet.get(maxKey).size())){
                    maxKey=s;
                }
            }
            if(maxKey!=null){
                //添加最大覆盖地区的电视台
                television.add(maxKey);
                //清楚覆盖最大地区的电视台的覆盖地区
                allArea.removeAll(allSet.get(maxKey));
            }

        }
        System.out.println(television.toString());
    }
}
[K1, K3, K2, K5]

猜你喜欢

转载自blog.csdn.net/m0_45196258/article/details/107891887