贪心算法
基本介绍
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解 。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择。
案例
假设存在如下表的需要付费的广播台,以及广播台信号可以覆盖的地区。如何选择最少的广播台,让所有的地区都可以接收到信号
代码
public class GreedyAlgorithm {
public static void main(String[] args) {
HashMap<String, HashSet<String>> broadcasts = new HashMap<>();
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);
//存放所有的区域
HashSet<String> all = new HashSet<>();
for (String key : broadcasts.keySet()) {
HashSet<String> set = broadcasts.get(key);
all.addAll(set);
}
String maxKey; //指向覆盖未覆盖区域最多的电台
HashSet<String> temp = new HashSet<>();
List<String> list = new ArrayList<>();
while (all.size() > 0) {
maxKey = null;
for (String key : broadcasts.keySet()) {
temp.clear();
HashSet<String> area = broadcasts.get(key);
temp.addAll(area);
temp.retainAll(all);
//每次都选最好的
if (temp.size() > 0 && (maxKey == null || temp.size() > broadcasts.get(maxKey).size())) {
maxKey = key;
}
}
if (maxKey != null) {
list.add(maxKey);
all.removeAll(broadcasts.get(maxKey));
}
}
System.out.println("list = " + list);
}
}