介绍
1、贪心算法是指在对问题进行求解时,在每一步选择中都采取最好或者最优的选择,从而希望能够导致结果是最好或者最优的算法。
2、贪心算法所得到的结果不一定是最优的结果,但是都是相对近似最优解的结果。
应用
假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地区。如何选择最少的广播台,让所有的地区都可以接收到信号。
广播台 | 覆盖地区 |
---|---|
K1 | 北京、上海、天津 |
K2 | 广州、北京、深圳 |
K3 | 成都、上海、杭州 |
K4 | 上海、天津 |
K5 | 杭州、大连 |
思路分析
1、遍历所有的广播电视台,找到一个覆盖了最多未覆盖的地区的电台(此电台可能包含一些已覆盖的地区)
2、将这个电台加入到集合中,把该电台覆盖的地区在下次比较时去掉。
3、重复第一步直到覆盖了全部的地区。
package algorithm;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
/**
* @author taoke
* @desc 贪心算法
* @email 1504806660@qq.com
* @date 2022/1/24
*/
public class Greedy {
public static void main(String[] args) {
//创建广播电台
HashMap<String, HashSet<String>> broadcast = new HashMap<>();
//创建各个电台
HashSet<String> set1 = new HashSet<>();
set1.add("北京");
set1.add("上海");
set1.add("天津");
HashSet<String> set2 = new HashSet<>();
set2.add("广州");
set2.add("北京");
set2.add("深圳");
HashSet<String> set3 = new HashSet<>();
set3.add("成都");
set3.add("上海");
set3.add("杭州");
HashSet<String> set4 = new HashSet<>();
set4.add("上海");
set4.add("天津");
HashSet<String> set5 = new HashSet<>();
set5.add("杭州");
set5.add("大连");
//将各个电台放入到广播电台中
broadcast.put("K1", set1);
broadcast.put("K2", set2);
broadcast.put("K3", set3);
broadcast.put("K4", set4);
broadcast.put("K5", set5);
//所有区域的集合
HashSet<String> allArea = new HashSet<>();
allArea.add("北京");
allArea.add("上海");
allArea.add("天津");
allArea.add("广州");
allArea.add("深圳");
allArea.add("成都");
allArea.add("杭州");
allArea.add("大连");
//存放所有已选择的电台
List<String> selectList = new ArrayList<>();
//临时变量
HashSet<String> tempSet = new HashSet<>();
//最大值
String maxKey;
//如果allArea.size 不为零表示还没有覆盖到所有地区
while (allArea.size() > 0) {
//每一轮都要重置maxKey
maxKey = null;
//每次遍历broadcast,取出key值
for (String key : broadcast.keySet()) {
//清空tempSet
tempSet.clear();
HashSet<String> area = broadcast.get(key);
//每次取出一个key所对应的区域,并且放入到tempSet中,和allArea比较,保留和allArea相交的区域
//并且将结果保存到tempSet中
tempSet.addAll(area);
tempSet.retainAll(allArea);
//如果当前这个key取出的区域比maxKey未覆盖的区域还要多
//则替换maxKey
if (tempSet.size() > 0 && (null == maxKey || tempSet.size() > broadcast.get(maxKey).size())) {
maxKey = key;
}
}
//如果maxKey不为空,将maxKey添加到selectList中,将已选择的区域从
//allArea中移除掉
if (null != maxKey) {
selectList.add(maxKey);
allArea.removeAll(broadcast.get(maxKey));
}
}
System.out.println(selectList);
}
}