赞
踩
应用场景-集合覆盖问题
假设存在下面需要付费的广播台,以及广播太信息可以覆盖的地区。如何选择最少的广播台,让所有的地区都可以接收到信号。
如何选取最少的广播台,覆盖所有的城市
思路分析
目前并没有算法可以快速计算得到准备的值,使用贪婪算法,则可以得到非常接近的解,并且效率高,选择策略上,因为需要覆盖全部地区的最小集合
总的来说呢思路还是比较简单的,贪心算法嘛,每一步都去寻找最优解,要不怎么能体现出贪心之处,当然相对应的贪心算法取得的结果不一定是最优解;
对于该题来说思路的步骤就是在电台中寻找未被覆盖的城市中,覆盖最多的电台,然后在再次在电台中寻找未被覆盖的城市中,覆盖最多的电台,直至电台将所有的城市完全覆盖
代码如下:
package yyds.xiangxiang; import java.util.*; public class GreedyAlgorithm { public static void main(String[] args) { Map<String, HashSet<String>> map = 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.put("K1", hashSet1); map.put("K2", hashSet2); map.put("K3", hashSet3); map.put("K4", hashSet4); map.put("K5", hashSet5); HashSet<String> allAreas = new HashSet<>();//存放所有地区 allAreas.addAll(hashSet1); allAreas.addAll(hashSet2); allAreas.addAll(hashSet3); allAreas.addAll(hashSet4); allAreas.addAll(hashSet5); //创建list存放选择的电台集合 List<String> selects=new ArrayList<>(); //定义一个临时的集合,在遍历的过程中,存放遍历过程中的电台覆盖的地区和当前还没有覆盖地区的交集 HashSet<String> tempSet = new HashSet<>(); //保存在一次的遍历过程中能够覆盖最大未覆盖地区的对应的key String maxKey=null; int maxtemp=0; while(allAreas.size()!=0){ maxKey=null; //遍历map for(String key: map.keySet()){ tempSet.clear(); //当前的这个key能覆盖的地区 HashSet<String> areas = map.get(key); //放入临时的集合 tempSet.addAll(areas); //求出tempset和allareas的交集 tempSet.retainAll(allAreas); if(tempSet.size()>0 && (maxKey==null || tempSet.size()>maxtemp)){ maxtemp=tempSet.size(); maxKey=key; } } if(maxKey!=null){ selects.add(maxKey); allAreas.removeAll(map.get(maxKey)); } } System.out.println(selects); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。