十大常用算法之贪心算法

十大常用算法的完整实现

一、二分查找算法: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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值