1.贪心算法应用场景:
假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号。
2.贪心算法介绍:
贪婪算法(贪心算法)是指在对问题进行求解时, 在每一步选择中都采取最好或者最优( 即最有利) 的选择,从而希望能够导致结果是最好或者最优的算法
贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果
3.电台问题解决思路:
- 用一个arealist集合存储地区:“北京”、“上海”、“天津”、“广州”、“深圳”、“成都”、“杭州”、“大连”
- 用一个hashmap存储广播台和覆盖范围的关系:HashMap<String, HashSet<String>>
- 用一个keylist集合存储符合要求的电台
- 遍历hashmap,每个key值对应的value与list集合做交集,交集的结果用key变量将电台记录下来,每次遍历都会有一个交集结果,每次就将本次的交集结果与key中的交集结果进行比较,大的就重新赋值key值,遍历完之后,就会得到本轮完整遍历的与arealist集合交集最多的那个电台,然后将该电台加入到keylist集合中,再将arealist中移除与该电台覆盖地区相同的地区。然后进入下一轮遍历hashmap,继续如上操作。直到arealist中无任何数据,结束。
- keylist中存放的就是最终结果了。
4.代码实现:
package algorithm;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
/**
* @author WuChenGuang
*/
public class Greedy {
public static void main(String[] args) {
/*
创建一个集合,areaList,存储城市
*/
ArrayList<String> areaList = new ArrayList<>();
areaList.add("北京");
areaList.add("上海");
areaList.add("天津");
areaList.add("广州");
areaList.add("深圳");
areaList.add("成都");
areaList.add("杭州");
areaList.add("大连");
HashSet<String> area1 = new HashSet<>();
area1.add("北京");
area1.add("上海");
area1.add("天津");
HashSet<String> area2 = new HashSet<>();
area2.add("广州");
area2.add("北京");
area2.add("深圳");
HashSet<String> area3 = new HashSet<>();
area3.add("成都");
area3.add("上海");
area3.add("杭州");
HashSet<String> area4 = new HashSet<>();
area4.add("上海");
area4.add("天津");
HashSet<String> area5 = new HashSet<>();
area5.add("杭州");
area5.add("大连");
/*
电台所覆盖城市的范围
*/
HashMap<String, HashSet<String>> broadcasts = new HashMap<>();
broadcasts.put("K1", area1);
broadcasts.put("K2", area2);
broadcasts.put("K3", area3);
broadcasts.put("K4", area4);
broadcasts.put("K5", area5);
/*
用户存储符合要求的电台
*/
ArrayList<String> keyList = new ArrayList<>();
// 用于存储每一次遍历areaList交集最多电台
String key = null;
// 临时用来存储电台所覆盖的城市
HashSet<String> temp = new HashSet<>();
// 循环条件是areaList没有城市数据,说明每个城市都被覆盖
while (!areaList.isEmpty()) {
for (String broadcastsKey : broadcasts.keySet()) {
// 先进行清空
temp.clear();
temp.addAll(broadcasts.get(broadcastsKey));
// retainAll 可以取交集
temp.retainAll(areaList);
if (temp.size() > 0 && (key == null || temp.size() > broadcasts.get(key).size())) {
key = broadcastsKey;
}
}
if (key != null) {
keyList.add(key);
areaList.removeAll(broadcasts.get(key));
key = null;
}
}
System.out.println(keyList.toString());
}
}
运行结果: