贪心算法

基本介绍

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解 。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择。

案例

假设存在如下表的需要付费的广播台,以及广播台信号可以覆盖的地区。如何选择最少的广播台,让所有的地区都可以接收到信号

代码

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);
  }
}

posted @ 2021-10-17 15:42  翻蹄亮掌一皮鞋  阅读(87)  评论(0)    收藏  举报