java使用贪心算法解决电台覆盖问题
java使用贪心算法解决电台覆盖问题
代码实现
/**
* 贪心算法实现集合覆盖
*/
public class Demo {
public static void main(String[] args) {
// 创建电台和地区集合
HashMap<String, HashSet<String>> broadcasts = new HashMap<>();
// 创建各个电台
HashSet<String> k1 = new HashSet<>();
k1.add("北京");
k1.add("上海");
k1.add("天津");
HashSet<String> k2 = new HashSet<>();
k2.add("广州");
k2.add("北京");
k2.add("深圳");
HashSet<String> k3 = new HashSet<>();
k3.add("成都");
k3.add("上海");
k3.add("杭州");
HashSet<String> k4 = new HashSet<>();
k4.add("上海");
k4.add("天津");
HashSet<String> k5 = new HashSet<>();
k5.add("杭州");
k5.add("大连");
// 加入各个电台
broadcasts.put("k1", k1);
broadcasts.put("k2", k2);
broadcasts.put("k3", k3);
broadcasts.put("k4", k4);
broadcasts.put("k5", k5);
// 建立各个地区的集合
HashSet<String> allAreas = new HashSet<>();
for (Map.Entry<String, HashSet<String>> entry : broadcasts.entrySet()) {
HashSet<String> value = entry.getValue();
allAreas.addAll(value);
}
// 创建选择的电台的集合
ArrayList<String> broadSelect = new ArrayList<>();
// 定义一个临时的集合
HashSet<String> tempSet = new HashSet<>();
// 定义一个指针,用于指向当前最优
String maxKey = null;
while (allAreas.size() > 0) {
// 重置置空
maxKey = null;
// 遍历
for (String key : broadcasts.keySet()) {
// 重置置空
tempSet.clear();
HashSet<String> value = broadcasts.get(key);
tempSet.addAll(value);
// 求出temp和allAreas的交集
tempSet.retainAll(allAreas);
// 如果当前选择有覆盖地区
if (tempSet.size() > 0 &&
// 此时,如果maxKey还没有指向就指向
(maxKey == null ||
// 如果maxKey已经有指向就比较谁最优解
(tempSet.size() > (broadcasts.get(maxKey).size())))) {
maxKey = key;
}
}
if (maxKey != null) {
// 将maxKey加入
broadSelect.add(maxKey);
// 并将allAreas去掉maxKey能覆盖的地区
allAreas.removeAll(broadcasts.get(maxKey));
}
}
// 打印结果
System.out.println(broadSelect);
}
}