十大常用算法的完整实现
一、二分查找算法:https://blog.csdn.net/weixin_46635575/article/details/121532149
二、分治算法:https://blog.csdn.net/weixin_46635575/article/details/121532941
三、动态规划算法:https://blog.csdn.net/weixin_46635575/article/details/121534074
四、KMP算法:https://blog.csdn.net/weixin_46635575/article/details/121590510
五、贪心算法:https://blog.csdn.net/weixin_46635575/article/details/121626626
六、普利姆算法:https://blog.csdn.net/weixin_46635575/article/details/121653256
七、克鲁斯卡尔算法:https://blog.csdn.net/weixin_46635575/article/details/121670374
八、地杰斯特拉算法:https://blog.csdn.net/weixin_46635575/article/details/121692675
九、佛洛依德算法:https://blog.csdn.net/weixin_46635575/article/details/121714678
十、马踏棋盘算法(周游骑士算法):https://blog.csdn.net/weixin_46635575/article/details/121716596
1、贪心算法的应用案例
2、贪心算法的概念
3、以案例分析
(1)思路分析
- 使用穷举法来分析
- 使用贪心算法分析
(2)贪心算法解决案例
- 使用贪心算法分析
- 步骤分析
- 第一步取得所有的元素总集合
- 第二步是对比每个集合对应总集合的个数
- 第三步然后找到覆盖最多的放到我们的selects集合里面【每次都是尽量找到最优的】
- 第四步然后把对应的总集合里面的元素删除
- 同样的重复第三四步,进行循环查询
- 最后要达到把我们的总集合里面的删除【答案就是k1,k2,k3,k5】
- 第一步取得所有的元素总集合
(3)案例分析的代码实现
public class greedyAlgorithm {
public static void main(String[] args) {
//1、创建广播电台的集合,放入到hashMap里面,查找效率高
HashMap<String, HashSet<String>> broadcasts = new HashMap<>();
//2、将各个电台放入到我们的总集合中去
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("大连");
broadcasts.put("K1",hashSet1);
broadcasts.put("K2",hashSet2);
broadcasts.put("K3",hashSet3);
broadcasts.put("K4",hashSet4);
broadcasts.put("K5",hashSet5);
//3、存放所有的地区
HashSet<String> allAreas = new HashSet<>();
allAreas.add("大连");
allAreas.add("杭州");
allAreas.add("上海");
allAreas.add("天津");
allAreas.add("成都");
allAreas.add("北京");
allAreas.add("广州");
allAreas.add("深圳");
//4、创建selects来存放选择的电台集合
ArrayList<String> selects = new ArrayList<>();
//5、定义一个零时的集合,保存在遍历过程中,存放遍历过程中的电台覆盖的地区和当前还没有覆盖的交集
HashSet<String> s = new HashSet<>();
//6、定义一个maxKey,定义保存在一次遍历过程中,能够覆盖最大未覆盖的地区对应的电台的key
//如果maxKey不为空,则会加到加入到selects里面
String maxKey = null;
while (allAreas.size() != 0) {//allAreas.size() != 0则表示未覆盖所有的地区
//倒数第二步来看这句话
maxKey = null;
//遍历broadcasts,取出对应的key
for(String key: broadcasts.keySet()) {
//要把所有的代码看完了再来看这一步
s.clear();//把我们的s集合清空
//当前你取出的集合能覆盖的地区
HashSet<String> areas = broadcasts.get(key);
s.addAll(areas);
//求出s和allAreas集合的交集,交集会赋给s
s.retainAll(allAreas);
if (s.size() > 0 && (maxKey == null || s.size() > broadcasts.get(key).size())) {
maxKey = key;
}
}
//maxKey 不为null,就应该将maxKey加入到selects
if (maxKey != null) {
selects.add(maxKey);
//就那个maxKey指向的广播电台覆盖的地区,从allAreas去掉
allAreas.removeAll(broadcasts.get(maxKey));
}
}
System.out.println("得到的选择结果" + selects);
}
}