1 前言

PriorityQueue是一种特殊的队列,满足队列的“队尾进、队头出”条件,但是每次插入或删除元素后,都对队列进行调整,使得队列始终构成最小堆(或最大堆)。具体调整如下:

  • 插入元素后,从堆底到堆顶调整堆;
  • 删除元素后,将队尾元素复制到队头,并从堆顶到堆底调整堆。

PriorityQueue采用数组实现,也是一棵完全二叉树,构成堆结构。数组初始大小为11。

Queue框架如下:

Queue框架

2 PriorityQueue常用方法

public boolean add(E e); //在队尾添加元素,并调整堆结构
public E remove(); //在队头删除元素,并返回,再调整堆结构
public E element(); //返回队头元素(不删除)
public boolean isEmpty(); //判断队列是否为空 public int size(); //获取队列中元素个数
public void clear(); //清空队列
public boolean contains(Object o); //判断队列中是否包含指定元素(从队头到队尾遍历)
public Iterator<E> iterator(); //迭代器

3 简单案例

3.1 最小优先队列

import java.util.PriorityQueue;

public class Main {
static int[] a={6,4,7,3,9,8,1,2,5,0}; public static void main(String[] args) {
fun();
} static void fun() {
PriorityQueue<Integer> que=new PriorityQueue<Integer>();
for(int e:a) {
que.add(e);
}
for(int e:que) {
System.out.print(e+" ");
}
System.out.println();
while(!que.isEmpty()) {
int e=que.remove();
System.out.print(e+" ");
}
}
}

运行结果:

0 1 3 4 2 8 7 6 5 9
0 1 2 3 4 5 6 7 8 9

堆结构:

最小优先队列内部堆结构

3.2 最大优先队列

import java.util.Comparator;
import java.util.PriorityQueue; public class Main {
static int[] a={6,4,7,3,9,8,1,2,5,0}; public static void main(String[] args) {
fun();
} static void fun() {
PriorityQueue<Integer> que=new PriorityQueue<Integer>(new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
for(int e:a) {
que.add(e);
}
for(int e:que) {
System.out.print(e+" ");
}
System.out.println();
while(!que.isEmpty()) {
int e=que.remove();
System.out.print(e+" ");
}
}
}

运行结果:

9 7 8 5 4 6 1 2 3 0
9 8 7 6 5 4 3 2 1 0

堆结构:

最大优先队列内部堆结构

3.3 topK问题

topK问题是指:从海量数据中寻找最大的前k个数据,比如从1亿个数据中,寻找最大的1万个数。

使用优先队列,能够很好的解决这个问题。先使用前1万个数构建最小优先队列,以后每取一个数,都与队头元素进行比较,若大于队头元素,就将队头元素删除,并将该元素添加到优先队列中;若小于队头元素,则将该元素丢弃掉。如此往复,直至所有元素都访问完。最后优先队列中的1万个元素就是最大的1万个元素。

为方便实验,这里以求 {6,4,7,3,9,8,1,2,5,0} 中最大的5个数为例。

import java.util.PriorityQueue;

public class Main {
static int[] a={6,4,7,3,9,8,1,2,5,0}; public static void main(String[] args) {
fun();
} static void fun() {
PriorityQueue<Integer> que=new PriorityQueue<Integer>();
for(int i=0;i<5;i++) {
que.add(a[i]);
}
for(int i=5;i<10;i++) {
if(a[i]>que.element()) {
que.remove();
que.add(a[i]);
}
}
while(!que.isEmpty()) {
int e=que.remove();
System.out.print(e+" ");
}
}
}

运行结果:

5 6 7 8 9

​ 声明:本文转自优先队列(PriorityQueue)常用方法及简单案例

优先队列(PriorityQueue)常用方法及简单案例的更多相关文章

  1. 【Java源码】集合类-优先队列PriorityQueue

    一.类继承关系 public class PriorityQueue<E> extends AbstractQueue<E> implements java.io.Serial ...

  2. Java中的集合(四)PriorityQueue常用方法

    Java中的集合(四)PriorityQueue常用方法 PriorityQueue的基本概念等都在上一篇已说明,感兴趣的可以点击 Java中的集合(三)继承Collection的Queue接口 查看 ...

  3. [Swift]实现优先队列PriorityQueue

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  4. Java的优先队列PriorityQueue详解

    一.优先队列概述 优先队列PriorityQueue是Queue接口的实现,可以对其中元素进行排序, 可以放基本数据类型的包装类(如:Integer,Long等)或自定义的类 对于基本数据类型的包装器 ...

  5. .NET 6 优先队列 PriorityQueue 实现分析

    在最近发布的 .NET 6 中,包含了一个新的数据结构,优先队列 PriorityQueue, 实际上这个数据结构在隔壁 Java中已经存在了很多年了, 那优先队列是怎么实现的呢? 让我们来一探究竟吧 ...

  6. Servlet请求头response应用简单案例

    Servlet请求头response应用简单案例:访问AServlet重定向到BServlet,5秒后跳到CServlet,并显示图片: AServlet package cn.yzu; import ...

  7. winform 通过 html 与swf 交互 简单案例

    在上一篇 winform 与 html 交互 简单案例 中讲了winform与html之间的简单交互,接下来的内容是在winform中以html为中转站,实现将swf嵌入winform中并实现交互. ...

  8. [Design Pattern] Front Controller Pattern 简单案例

    Front Controller Pattern, 即前端控制器模式,用于集中化用户请求,使得所有请求都经过同一个前端控制器处理,处理内容有身份验证.权限验证.记录和追踪请求等,处理后再交由分发器把请 ...

  9. [Design Pattern] Observer Pattern 简单案例

    Observer Pattern,即观察者模式,当存在一对多关系,例如一个对象一有变动,就要自动通知被依赖的全部对象得场景,属于行为类的设计模式. 下面是一个观察者模式的简单案例. Observer ...

  10. [Design Pattern] Mediator Pattern 简单案例

    Meditor Pattern,即调解模式,用一个调解类类处理所有的沟通事件,使得降低多对象之间的沟通难度,属于行为类的设计模式.为了方便理解记忆,我也称其为,沟通模式. 下面是一个调解模式的简单案例 ...

随机推荐

  1. Go-单元测试-Test

    单元测试 文件名以 _test.go 结尾 函数名以 Test 开头 函数参数固定 t *testing.T 运行单元测试 go test Demo 源文件 package unit import & ...

  2. 银河麒麟上面 ntopng的安装与使用

    银河麒麟上面 ntopng的安装与使用 背景 一直想用Grafana监控网络流量 但是断断续续尝试了一周的时间都没有搞定. 发现这一块已经进入了瓶颈. 比较无奈的情况下回到了原来的iftop/iptr ...

  3. [转帖]记一次sst文件损坏修复过程

    https://tidb.net/blog/54e388c8 [2023-07-14 14:26:28]应用系统报警删除数据失败,查看日志报Region is unavailable,同时企业微信群也 ...

  4. [转帖]国产数据库到底行不行?人大金仓KINGBASE数据库与主流开源数据库性能实测

    近年来,人大金仓的数据库产品受到了外界诸多的关注.做产品,免不了要接受用户的对比和选择,数据库因其行业的自身特点,还有很多开源的技术产品同台比拼,用户因此也会产生诸多疑问,国产数据库相比开源数据库到底 ...

  5. [转帖]利用Python调用outlook自动发送邮件

    ↓↓↓欢迎关注我的公众号,在这里有数据相关技术经验的优质原创文章↓↓↓ 使用Python发送邮件有两种方式,一种是使用smtp调用邮箱的smtp服务器,另一种是直接调用程序直接发送邮件.而在outlo ...

  6. [转帖]Web性能优化工具WebPageTest(一)——总览与配置

    https://www.cnblogs.com/strick/p/6677836.html 网站性能优化工具大致分为两类:综合类和RUM类(实时监控用户类),WebPageTest属于综合类. Web ...

  7. Windows 和 linux 下面 Redis 性能比较

    Windows 和 linux 下面 Redis 性能比较 问题来源 公司里面有一些环境还是使用Windows来跑 对应的. Redis和nginx 也是跑在Windows上面 但是微软官网自从 3. ...

  8. 使用 inotifywait的方式监控文件夹发生变化后自动执行脚本的方法

    0. 先安装inotify 最简单的方法为: yum install epel-release 安装扩展包源 yum install inotify-tools 1. 从网上抄了一下脚本 简单记录一下 ...

  9. element-ui表格排序

    <el-table :data="TableAwitDoArr" style="width: 100%"> <el-table-column ...

  10. 【K哥爬虫普法】淘宝一亿快递信息泄漏,有人正在盯着你的网购!

    我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...