十大常用算法之贪心算法

十大常用算法的完整实现

一、二分查找算法: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);
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前状态下最优的选择,从而希望最终导致全局最优的算法贪心算法通常有以下特点: 1. 贪心选择性质:每一步都采取最优的选择,即局部最优解。 2. 最优子结构性质:原问题的最优解包含子问题的最优解。 3. 无后效性:每一步的决策只与当前状态有关,与之前的决策无关。 贪心算法可以用来求解一些最优化问题,如最小生成树、背包问题、活动选择问题等。 以活动选择问题为例,假设有n个活动,每个活动有一个开始时间s和结束时间f,多个活动可能在同一时间段内进行,但是同一时间只能进行一个活动。如何选择活动,使得能够安排的活动数量最多? 贪心算法的思路是:按照结束时间从早到晚排序,每次选择结束时间最早的活动,且不与已经选择的活动时间冲突。这是因为选择结束时间最早的活动,可以给后面留下更多的时间选择其他活动,从而使得总的安排活动数量最多。 参考代码如下: ``` #include <iostream> #include <algorithm> using namespace std; struct Activity { int start, finish; }; bool compare(Activity s1, Activity s2) { return (s1.finish < s2.finish); } void printMaxActivities(Activity arr[], int n) { sort(arr, arr+n, compare); cout << "Selected activities:\n"; int i = 0; cout << "(" << arr[i].start << ", " << arr[i].finish << "), "; for (int j = 1; j < n; j++) { if (arr[j].start >= arr[i].finish) { cout << "(" << arr[j].start << ", " << arr[j].finish << "), "; i = j; } } } int main() { Activity arr[] = {{1, 2}, {3, 4}, {0, 6}, {5, 7}, {8, 9}, {5, 9}}; int n = sizeof(arr)/sizeof(arr[0]); printMaxActivities(arr, n); return 0; } ``` 输出结果为: ``` Selected activities: (1, 2), (3, 4), (5, 7), (8, 9), ``` 可以看到,按照贪心算法的思路,选择了4个活动,使得能够安排的活动数量最多。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值