算法 - 贪心算法(集合覆盖问题求解)

痛定思痛。 2023-07-03 12:03 165阅读 0赞

在这里插入图片描述

在这里插入图片描述
1.穷举法
在这里插入图片描述
2.贪心算法
在这里插入图片描述
在这里插入图片描述

遍历集合的key,用当前key的value和allAreas去取交集),然后和(maxKey和allAreas的交集)比较大小,如果当前key的结合size大就把当前key赋给maxkey,循环5次后退出循环,并把maxkey加入到selects,且把maxkey覆盖的地区从allAreas中移除。直到allAreas集合为空退出while循环,得到的select就是所需要的。

  1. package Algorithm.greedy;
  2. import java.util.*;
  3. public class GreedyAlogrithm {
  4. public static void main(String[] args) {
  5. //创建广播电台,放入map
  6. HashMap<String, HashSet<String>> broadcasts = new HashMap<>();
  7. //将各个电台放入
  8. HashSet<String> set1 = new HashSet<>();
  9. set1.add("北京");
  10. set1.add("上海");
  11. set1.add("天津");
  12. HashSet<String> set2 = new HashSet<>();
  13. set2.add("广州");
  14. set2.add("北京");
  15. set2.add("深圳");
  16. HashSet<String> set3 = new HashSet<>();
  17. set3.add("成都");
  18. set3.add("上海");
  19. set3.add("杭州");
  20. HashSet<String> set4 = new HashSet<>();
  21. set4.add("上海");
  22. set4.add("天津");
  23. HashSet<String> set5 = new HashSet<>();
  24. set5.add("杭州");
  25. set5.add("大连");
  26. //加入到map
  27. broadcasts.put("k1",set1);
  28. broadcasts.put("k2",set2);
  29. broadcasts.put("k3",set3);
  30. broadcasts.put("k4",set4);
  31. broadcasts.put("k5",set5);
  32. //创建一个存放所有城市的集合,就遍历集合就行
  33. HashSet<String> allAreas = new HashSet<>();
  34. for(Map.Entry<String, HashSet<String>> entry: broadcasts.entrySet())
  35. {
  36. HashSet<String> value = entry.getValue();
  37. Iterator<String> iterator1 = value.iterator();
  38. while (iterator1.hasNext()){
  39. allAreas.add(iterator1.next());
  40. }
  41. }
  42. //System.out.println(allAreas);
  43. //创建一个ArrayList存放选择后的 电台的集合
  44. ArrayList<String> selects = new ArrayList<>();
  45. //保存每次 当前覆盖的地区和未覆盖到的地区的交集,用retainAll()方法
  46. HashSet<String> tempSet = new HashSet<>();
  47. HashSet<String> value = new HashSet<>();
  48. //创建一个指针maxKey,存放交集最大的key
  49. String maxKey = null;
  50. while (allAreas.size() != 0){ //allAreas 不为空就表示没覆盖到所有地区
  51. maxKey = null;
  52. for (String key : broadcasts.keySet()) {
  53. tempSet.clear();
  54. value.clear();
  55. //存放Key覆盖的地区
  56. value.addAll(broadcasts.get(key));
  57. //tempSet.addAll(value);
  58. //求当前key覆盖的地区和allAreas的交集
  59. value.retainAll(allAreas);
  60. //下面两步是取出maxKey覆盖地区和allAreas的交集
  61. if (maxKey != null) {
  62. tempSet.addAll(broadcasts.get(maxKey));
  63. tempSet.retainAll(allAreas);
  64. }
  65. if (value.size() > 0 && (maxKey == null || (value.size() > tempSet.size()))){
  66. maxKey = key;
  67. }
  68. }
  69. if (maxKey != null) {
  70. selects.add(maxKey);
  71. allAreas.removeAll(broadcasts.get(maxKey));
  72. }
  73. }
  74. System.out.println(selects);
  75. }
  76. }

发表评论

表情:
评论列表 (有 0 条评论,165人围观)

还没有评论,来说两句吧...

相关阅读

    相关 贪心算法求解背包问题

    贪心算法,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解 。 解题的一般步骤是: 1.建立数学模型

    相关 贪心算法-广播台覆盖问题

    我们先看一个问题: 假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号 ![在这里插入图片描述][wate