优先级队列默认最小值优先吗_低优先级队列要等几局

优先级队列默认最小值优先吗_低优先级队列要等几局1.优先级队列是什么??首先,优先级队列是一个队列,队列所有的性质,它也有。其次,优先级队列每次取出的是优先级最高的元素。优先级队列的内部是用堆来维护的。将优先级最高的排在前面。2.什么时候用这个队列呢??看完优先级队列的定义,好像看懂了,又好像没看懂。这队列,什么用它呢?1)排序的对象和排序时比较的对象常见的排序方法(插入、快排等),排序的对象和比较的对象是一样的,根据数本身的大小进行排序。优先级队列可以对排序对象和比较对象相同的进行排序,也可以对排序的对象和排序时比较的对象不同的

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

1. 优先级队列是什么??

首先,优先级队列是一个队列,队列所有的性质,它也有。

其次,优先级队列每次取出的是优先级最高的元素。

优先级队列的内部是用来维护的。将优先级最高的排在前面。

2. 什么时候用这个队列呢??

看完优先级队列的定义,好像看懂了,又好像没看懂。这队列,什么用它呢?

1)排序的对象和排序时比较的对象

常见的排序方法(插入、快排等),排序的对象和比较的对象是一样的,根据数本身的大小进行排序。

优先级队列可以对排序对象和比较对象相同的进行排序,也可以对 排序的对象和排序时比较的对象不同 的进行排序。

排序的对象和排序时比较的对象不同的一种情况是对 Map 排序。 在 Map 中,按照值 ValueKey 进行排序。这时,排序的对象是 Key ,比较的对象是 Value

2)堆

优先级队列的内部是用来维护的。所以,也可以把优先级队列当做堆来用。需要用堆的时候,用优先级队列试试看。

3. 对一数组排序

int[] arr = { 
   3, 7, 5, 1, 8};
PriorityQueue<Integer> queue = new PriorityQueue<>();
for (int t : arr) { 
   
    queue.offer(t);
    System.out.println("queue = " + queue);
}

输出结果:

queue = [3]
queue = [3, 7]
queue = [3, 7, 5]
queue = [1, 3, 5, 7]
queue = [1, 3, 5, 7, 8]

queue = [3, 7, 5] 可以看出,在排序时,queue 虽然也是按照整数的自然序来排的,但是不是按照递增的顺序(队列中的元素并不是一直是递增排列),是按堆存放的。

下面,将优先级队列的大小设置为3,看一下优先级队列的变化

int[] arr = { 
   3, 7, 5, 1, 8};
PriorityQueue<Integer> queue = new PriorityQueue<>();
for (int cur : arr) { 
   
    queue.offer(cur);
    if (queue.size() > 3){ 
   
        int t = queue.poll();
        System.out.print("poll = " + t);
    }
    System.out.println("queue = " + queue);
}

输出结果:

queue = [3]
queue = [3, 7]
queue = [3, 7, 5]
poll = 1 queue = [3, 7, 5]
poll = 3 queue = [5, 7, 8]

从结果中可以看出,每次弹出的是最小的值。

4. Map 按值排序

有两种方案实现 Map 根据值 Value 对键 Key 排序:

  • 队列中存 key
  • 队列中存 Map.entry

4.1 队列中存 key

Map<Integer, Integer> map = new HashMap<>();
// map 中存入值,这里不再写

// 创建优先级队列,同时定义比较规则
PriorityQueue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>(){ 
   
    public int compare(Integer a, Integer b) { 
   
        return map.get(a) - map.get(b);  // 按值 Value 升序排
    }
});

// 加入队列,并排序
for (Integer key: map.keySet()) { 
   
    queue.offer(key);  // 加入队列的同时,会排序
}

/*************************************************************************/
// 创建优先级队列时,还可以简化为下面的方式
PriorityQueue<Integer> queue = new PriorityQueue<>((a, b) -> { 
   
    return map.get(a) - map.get(b);
});

4.2 队列中存 Map.entry

Map 中的 <key,value> 看作一个整体,通过 Map.entry<> 就可以取出。与上面一种方法的不同就是,把 Integer 变成了 Map.entry<Integer, Integer> ,其他的,暂时没看出来。

Map<Integer, Integer> map = new HashMap<>();
// map 中存入值,这里不再写

// 创建优先级队列,同时定义比较规则
PriorityQueue<Map.entry<Integer, Integer>> queue = new PriorityQueue<>((a, b) -> { 
   
    return a.getValue() - b,getValue();
});

// Set<Map.entry<Integer, Integer>> set = map.entrySet();
// 加入队列,并排序
for (Map.entry<Integer, Integer> entry: map.entrySet()) { 
   
    queue.offer(entry);  // 加入队列的同时,会排序
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190227.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm是下载社区版本的还是专业版本_vs专业版和企业版区别

    pycharm是下载社区版本的还是专业版本_vs专业版和企业版区别好多初用pycharm的朋友,不知道PyCharm专业版和PyCharm社区版的区别,总体而说pycharmpro2019mac是一种PythonIDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。…

    2022年8月29日
    1
  • JS indexOf() 函数[通俗易懂]

    JS indexOf() 函数[通俗易懂]vartest=str1.indexOf(str2);//返回-1表示在str1里没有找到指定的字符串str2的内容.如果有字符串存在就返回它的下表以0开始列子:Strings1=”ahkb”;Strings2=”k”;s1.indexOf(s2)==2;;…

    2022年7月13日
    20
  • java编程基础(入门级)(超级完整版)「建议收藏」

    java编程基础(入门级)(超级完整版)「建议收藏」java基础编程01基础知识1.计算机基础【1】进制A.十进制转化二进制除以2,求余数,商继续除以2,一直到0为止,从底下往上得到结果。B.二进制转化十进制1|1|0|023∣22∣21∣202^3|2^2|2^1|2^023∣22∣21∣208+4+0+0=128+4+0+0=128+4+0+0=12【2】计算机的储存方式位(bit):0或1字节(byte):8位1字节,数据储存的最小单位1KB=1024Byte1MB=1024KB1GB=

    2022年6月10日
    23
  • 普林斯顿公开课 算法1-5:算法理论

    普林斯顿公开课 算法1-5:算法理论

    2021年11月16日
    38
  • 《启示录-打造用户喜爱的产品》-第一部分

    今天下午读了《启示录-打造用户喜爱的产品》的第一部分,介绍软件开发中的人员职能,其实主要还是产品经理相关的,做了一部分笔记如下。其实平时读书也一直在思考,应该怎么读书,很多读过的书当时很受启发,但是过段时间就会淡忘了,模糊记得一些内容,但是又好像没有什么作用。之后读书读到有启发的地方还是记录一下,回头看看应该也还是有收获的。不知道大家都是怎么读书,有好方法的也欢迎交流下。优秀产品经理的七个特点1、

    2022年3月11日
    36
  • 正确处理Ordered Broadcasts「建议收藏」

    正确处理Ordered Broadcasts「建议收藏」
    原文:http://aoandroid.com/node/1414
     
     
    最近,Android官方开发员博客(DevelopersBlog)登载了Google巴西分布的一名工程师(
    BeloHorizonte )的文章,介绍了正确使用Broadcast的概念和实例分析。该文章在概念上纠正了很多开发人员对Broadcast处理中存在的严重问题,并指出这反映了开发文档存在缺陷,没有解释清楚。
    Broadcast是Android的一个很有用的概念

    2022年6月29日
    21

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号