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

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


相关推荐

  • Linux狂神说笔记[通俗易懂]

    Linux狂神说笔记[通俗易懂]Linux在服务器端,很多大型项目都是部署在Linux服务器上利用VM + Centos7搭建本地Linux系统你可以使用 man [命令]来查看各个命令的使用文档,如 :man cp。概念云服务器就是一个远程电脑Linux中一切皆文件根目录/,所有的文件都挂载在这个节点下/bin:bin是Binary的缩写, 这个目录存放着最经常使用的命令。/boot: 这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev : dev是Device(设备

    2022年8月9日
    4
  • 简述sealed关键字_java field

    简述sealed关键字_java fieldsealed的中文意思是密封,故名思义,就是由它修饰的类或方法将不能被继承或是重写。sealed关键字:在类声明中使用sealed可防止其它类继承此类;在方法声明中使用sealed修饰符可防止扩充类重写此方法。相当于Java中的final类和final方法密封类:密封类在声明中使用sealed修饰符,这样就可以防止该类被其它类继承。如果试图将一个密封类作为其它类的基类,C#将提示出错。在哪些场合…

    2025年8月15日
    2
  • 定制CentOS5.6系统

    定制CentOS5.6系统

    2021年8月13日
    54
  • 真实的QQ刷钻业务

    真实的QQ刷钻业务今天在今日头条中看到卢松松博客的一篇文章《【行业秘密公开】所谓的QQ刷钻业务》,文章作者介绍了以QQ刷钻为诱饵的骗人手段,但其实真实的QQ刷钻业务也是存在的,这篇文章除了告诉你真实的刷钻业务是如何做到

    2022年8月3日
    5
  • Java 正则表达式的用法和实例

    Java 正则表达式的用法和实例一、概述:用来描述或者匹配一系列符合某个语句规则的字符串二、单个符号1、英文句点”.”符号:匹配单个任意字符。表达式”t.o“可以匹配:tno,t#o,teo等等。不可以匹配:tnno,to,Tno,t正o等。2、中括号”[]“:只有方括号里面指定的字符才参与匹配,也只能匹配单个字符。表达式:t[abcd]n只可以匹配:tan,tbn,tcn,tdn。不可以匹配:th…

    2022年5月17日
    36
  • RxJava 操作符flatmap

    RxJava 操作符flatmap有如下场景:在前段调用后端的API时,经常会出现回调嵌套的情况。假设我们有两个API,queryA和queryB.并且queryB的运行依赖于queryA的结果。那么我们的程序在一般的情况下可能是这个样子。想象有如下的代码:是不是感觉非常不舒服?假如嵌套的API再多几层,那么这将是个灾难。一个人开发的时候可能不觉得有什么问题,但是可以想象做codereview或者新入项目组的同事

    2022年6月4日
    41

发表回复

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

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