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

优先级队列默认最小值优先吗_低优先级队列要等几局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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 木马免杀原理

    木马免杀原理##木马免杀原理###一、实验目的1.了解杀毒软件特征码查杀病毒的基本原理2.掌握木马特征码免杀的原理和方法###二、实验环境1.系统环境:Windows环境,XP环境2.软件工具:灰鸽

    2022年7月4日
    25
  • Protostuff序列化分析

    Protostuff序列化分析Protostuff序列化分析最近项目中需要将业务对象直接序列化,然后存数据库;考虑到序列化、反序列化的时间以及生产文件的大小觉得Protobuf是一个很好的选择,但是Protobuf有的问题就是需要有一个.proto的描述文件,而且由Protobuf生成的对象用来作为业务对象并不是特别友好,往往业务对象和Protobuf对象存在一个互相转换的过程;考虑到我们仅仅是将业务对象直接序列化到数据库,发现Protobuf在这种情况下并不是特别的好;这时候发现了Protostuff,protostuff不需

    2022年5月6日
    44
  • 异步fifo的深度,如何确定?_二叉树的最小深度和最大深度

    异步fifo的深度,如何确定?_二叉树的最小深度和最大深度目录1.异步FIFO最小深度计算1.1异步FIFO最小深度计算原理1.2异步FIFO最小深度常用计算公式1.2.1假如读写FIFO是同时进行的1.2.2读写FIFO不是同时进行的情况2.异步FIFO最小深度计算实例2.1用于SDRAM中的读写FIFO2.2异步时钟数据接口3.FIFO实例1.异步FIFO最小深度计算计算FIF…

    2022年8月13日
    8
  • node环境变量配置,npm环境变量配置

    node环境变量配置,npm环境变量配置引言:很久没有在windows上配过node,记得以前node环境变量是要加NODE_PATH到用户变量,再在系统变量引入NODE_PATH的,而npminstall的全局包目录会存放在C:/Users[用户]/administrator[你的计算机名字]/AppData/Roaming/npm目录下,而现在貌似有更高级的做法!传统方法总结:npm包全局目录:C:/Use…

    2022年4月27日
    28
  • 《海量数据库解决方式》读后感

    《海量数据库解决方式》读后感

    2021年12月1日
    41
  • JDK8新特性_JDK8面试题

    JDK8新特性_JDK8面试题JDK8新特性lambda表达式要求:接口必须是函数式接口,一个接口如果只有一个抽象方法,那他就是函数式接口,我们可以在一个接口上使用_Functionallnterface_注解package com.atguigu.java;import java.util.Comparator;public class LambaTest { public static void main(String[] args) { Runnable r1 = new Runnable()

    2022年8月8日
    9

发表回复

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

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