PriorityQueue

翻译过来就是优先队列,本质是一个堆, 默认情况下堆顶每次都保留最小值,每插入一个元素,仍动态维护堆顶为最小值。

PriorityQueue 一个基于优先级的无界优先级队列。优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法。该队列不允许使用 null 元素也不允许插入不可比较的对象(没有实现Comparable接口的对象)。

PriorityQueue 队列的头指排序规则最小那个元素。如果多个元素都是最小值则随机选一个。

PriorityQueue 是一个无界队列,但是初始的容量(实际是一个Object[]),随着不断向优先级队列添加元素,其容量会自动扩容,无需指定容量增加策略的细节。

初始化

PriorityQueue()//使用默认的初始容量(11)创建一个 PriorityQueue,并根据其自然顺序对元素进行排序。

  1. PriorityQueue<Integer> Q = new PriorityQueue<>(); // 初始化

常用函数

add(E e)//将指定的元素插入此优先级队列。

clear()//清空

contains(Object o) // 如果包含指定元素返回true

iterator()//返回在此队列中的元素上进行迭代的迭代器。

offer(E e) // 将指定元素插入此优先队列

peek() // 获取第一个元素,及最小或最大元素

poll() // 获取并移除第一个

remove(Object o) // 移除指定元素

size() // 返回元素个数

基本使用

  1. public class Main {
  2. public static void main(String[] args) {
  3. PriorityQueue<String> q = new PriorityQueue<>();
  4. //入列
  5. q.offer("1");
  6. q.offer("2");
  7. q.offer("5");
  8. q.offer("3");
  9. q.offer("4");
  10. //出列
  11. System.out.println(q.poll()); //1
  12. System.out.println(q.poll()); //2
  13. System.out.println(q.poll()); //3
  14. System.out.println(q.poll()); //4
  15. System.out.println(q.poll()); //5
  16. }
  17. }

PriorityQueue使用跟普通队列一样,唯一区别是PriorityQueue会根据排序规则决定谁在队头,谁在队尾。

实现大根堆的两种方式

  1. 使用自定义比较器Comparator
  2. 将所有数据变为之前自身的负数之后在插入, 因为添加个负号就相当于是逆序了嘛。1 < 2 < 3 取负之后变为 -1 > - 2 > - 3

实例

  1. public static void main(String[] args){
  2. Scanner in = new Scanner(new InputStreamReader(System.in));
  3. PriorityQueue<Integer> Q = new PriorityQueue<>();
  4. int a;
  5. for(int i = 0; i < 10; i++){
  6. a = in.nextInt();
  7. Q.add(a);
  8. System.out.print(Q.peek()+" ");// 输出当前队列的最小元素
  9. }
  10. }
  11. 输入: 1 -1 -2 -3 10 -4 -5 -6 -7 -8
  12. 输出: 1 -1 -2 -3 -3 -4 -5 -6 -7 -8

有兴趣深入了解一下:https://www.cnblogs.com/CherishFX/p/4643940.html

PriorityQueue(优先队列)的更多相关文章

  1. 堆结构的优秀实现类----PriorityQueue优先队列

    之前的文章中,我们有介绍过动态数组ArrayList,双向队列LinkedList,键值对集合HashMap,树集TreeMap.他们都各自有各自的优点,ArrayList动态扩容,数组实现查询非常快 ...

  2. 基于PriorityQueue(优先队列)解决TOP-K问题

    TOP-K问题是面试高频题目,即在海量数据中找出最大(或最小的前k个数据),隐含条件就是内存不够容纳所有数据,所以把数据一次性读入内存,排序,再取前k条结果是不现实的. 下面我们用简单的Java8代码 ...

  3. 算法竞赛中的常用JAVA API:PriorityQueue(优先队列)(转载)

    算法竞赛中的常用JAVA API:PriorityQueue(优先队列) PriorityQueue 翻译过来就是优先队列,本质是一个堆, 默认情况下堆顶每次都保留最小值,每插入一个元素,仍动态维护堆 ...

  4. PriorityQueue优先队列用法入门

    PriorityQueue是队列的一种,它叫做优先队列,该类实现了Queue接口. 之所以叫做优先队列,是因为PriorityQueue实现了Comparator这个比较接口,也就是PriorityQ ...

  5. Java学习笔记--PriorityQueue(优先队列)(堆)

    PriorityQueue(优先队列)实际上是一个堆(不指定Comparator时默认为最小堆)队列既可以根据元素的自然顺序来排序,也可以根据 Comparator来设置排序规则.队列的头是按指定排序 ...

  6. Java Collection - PriorityQueue 优先队列

    总结 优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++的优先队列每次取最大元素).这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序(na ...

  7. PriorityQueue 优先队列的实现

    PriorityQueue 的 implementation PriorityQueue即是优先队列.通俗的说就是体育课的时候老师要求从高到低排序,老师能直接一眼看出谁是最高的在班级里.当这个最高的离 ...

  8. PriorityQueue优先队列

    概念 PriorityQueue 一个基于优先级的无界优先级队列.优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法.该队列不 ...

  9. Java 优先队列

    Java PriorityQueue 优先队列是一种重要的数据结构,其利用的是小/大顶堆来实现的. Java中提供了PriorityQueue,PriorityQueue是基于小顶堆实现的无界优先队列 ...

随机推荐

  1. jooq使用示例

    一.说明 最近使用的项目,采用了jooq. 通过学习api文档和自我调试,写了一些代码,在此处进行记录. 二.代码 一切尽在代码中-- 参考文档:http://www.jooq.org/doc/3.1 ...

  2. FastAPI 学习之路(一)fastapi--高性能web开发框架

    fastapi是高性能的web框架.他的主要特点是:- 快速编码- 减少人为bug- 直观- 简易- 具有交互式文档 - 高性能 - 基于API的开放标准 支持python 3.6版本. 安装 pip ...

  3. Hearthbuddy跳过ConfigurationWindow窗口

    Hearthbuddy版本为按照上一条博客修复后的版本. 打开Hearthbuddy后会弹出一个这样的窗口: 这个界面没有什么用,而且也没有人对此进行任何修改. 由于之前折腾版早就已经把这个界面跳过了 ...

  4. 深度学习——前向传播算法和反向传播算法(BP算法)及其推导

    1 BP算法的推导 图1 一个简单的三层神经网络 图1所示是一个简单的三层(两个隐藏层,一个输出层)神经网络结构,假设我们使用这个神经网络来解决二分类问题,我们给这个网络一个输入样本,通过前向运算得到 ...

  5. 基于Docker构建企业Jenkins CI平台

  6. python学习笔记(十四)python实现发邮件

    import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart u ...

  7. Java线程类

    基础知识 线程状态 根据Thread.State类中的描述,Java中线程有六种状态:NEW,RUNNABLE,WAITING,TERMINATED,BLOCKED. 就绪状态(NEW):当线程对象调 ...

  8. sqlalchemy ————关联表

    1.创建模型的时候做外键关联 class UI_ID(db.Model): __tablename__ = 'ui_id' id = db.Column(INTEGER(11), primary_ke ...

  9. 密码学系列之:1Password的加密基础PBKDF2

    目录 简介 PBKDF2和PBKDF1 PBKDF2的工作流程 详解PBKDF2的key生成流程 HMAC密码碰撞 PBKDF2的缺点 总结 简介 1password是一个非常优秀的密码管理软件,有了 ...

  10. ApsNetCore打造一个“最安全”的api接口

    Authentication,Authorization 如果公司交给你一个任务让你写一个api接口,那么我们应该如何设计这个api接口来保证这个接口是对外看起来"高大上",&qu ...