1.贪心算法
电台覆盖区域求最优解问题
题目:假设存在如下表的需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号
广播台 | 覆盖地区 |
---|---|
K1 | “北京”, “上海”, “天津” |
K2 | “广州”, “北京”, “深圳” |
K3 | “成都”, “上海”, “杭州” |
K4 | “上海”, “天津” |
K5 | “杭州”, “大连” |
/**
* @author 缪广亮
* @version 1.0
*/
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<>();
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<>();
for (HashSet<String> areas : broadcasts.values())
// broadcasts.values()返回的是values的一个集合,而每一个value都是一个集合用addAll
allAreas.addAll(areas);
// 存放选择的电台集合
ArrayList<String> selects = new ArrayList<>();
// 临时的集合,在遍历的过程中,存放遍历过程中的电台覆盖的地区和当前还没有覆盖的地区的交集
HashSet<String> tempSet = new HashSet<>();
// 定义maxKey,保存在一次遍历过程中,能够覆盖最大未覆盖的地区对应的电台的key
// 如果maxKey不为null,则就会加入到selects
String maxKey = null;
while (allAreas.size() > 0) {//allAreas不为0,则表示还没有覆盖到所有地区
// 每次while将maxKey置空
maxKey=null;
for (String key : broadcasts.keySet()) {
// 每次for将tempSet清空
tempSet.clear();
// 当前这个key能够覆盖的地区
HashSet<String> areas = broadcasts.get(key);
tempSet.addAll(areas);
// retainAll方法是求出tempSet和allAreas集合的交集,交集会赋给tempSet
tempSet.retainAll(allAreas);
// 如果当前集合包含的未覆盖的地区的数量,,比maxKey指向的集合地区还要多
// 重置maxKey
// tempSet.size() > broadcasts.get(maxKey).size()) 体现贪心算法的特点 每次选择最优的
if (tempSet.size() > 0 &&
(maxKey == null || tempSet.size() > broadcasts.get(maxKey).size()))
maxKey = key;
}
// maxKey不为空,就应该将maxKey加入到selects
if (maxKey!=null){
selects.add(maxKey);
// 将maxKey指向的广播电台覆盖的地区,从allAreas移除
allAreas.removeAll(broadcasts.get(maxKey));
}
}
System.out.println("选择的结果:"+selects);
}
}
标签:HashSet,broadcasts,电台,maxKey,算法,add,new,tempSet,贪心
From: https://www.cnblogs.com/mglblog/p/17891027.html