优先队列(PriorityQueue)常用方法及简单案例
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)常用方法及简单案例的更多相关文章
- 【Java源码】集合类-优先队列PriorityQueue
一.类继承关系 public class PriorityQueue<E> extends AbstractQueue<E> implements java.io.Serial ...
- Java中的集合(四)PriorityQueue常用方法
Java中的集合(四)PriorityQueue常用方法 PriorityQueue的基本概念等都在上一篇已说明,感兴趣的可以点击 Java中的集合(三)继承Collection的Queue接口 查看 ...
- [Swift]实现优先队列PriorityQueue
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- Java的优先队列PriorityQueue详解
一.优先队列概述 优先队列PriorityQueue是Queue接口的实现,可以对其中元素进行排序, 可以放基本数据类型的包装类(如:Integer,Long等)或自定义的类 对于基本数据类型的包装器 ...
- .NET 6 优先队列 PriorityQueue 实现分析
在最近发布的 .NET 6 中,包含了一个新的数据结构,优先队列 PriorityQueue, 实际上这个数据结构在隔壁 Java中已经存在了很多年了, 那优先队列是怎么实现的呢? 让我们来一探究竟吧 ...
- Servlet请求头response应用简单案例
Servlet请求头response应用简单案例:访问AServlet重定向到BServlet,5秒后跳到CServlet,并显示图片: AServlet package cn.yzu; import ...
- winform 通过 html 与swf 交互 简单案例
在上一篇 winform 与 html 交互 简单案例 中讲了winform与html之间的简单交互,接下来的内容是在winform中以html为中转站,实现将swf嵌入winform中并实现交互. ...
- [Design Pattern] Front Controller Pattern 简单案例
Front Controller Pattern, 即前端控制器模式,用于集中化用户请求,使得所有请求都经过同一个前端控制器处理,处理内容有身份验证.权限验证.记录和追踪请求等,处理后再交由分发器把请 ...
- [Design Pattern] Observer Pattern 简单案例
Observer Pattern,即观察者模式,当存在一对多关系,例如一个对象一有变动,就要自动通知被依赖的全部对象得场景,属于行为类的设计模式. 下面是一个观察者模式的简单案例. Observer ...
- [Design Pattern] Mediator Pattern 简单案例
Meditor Pattern,即调解模式,用一个调解类类处理所有的沟通事件,使得降低多对象之间的沟通难度,属于行为类的设计模式.为了方便理解记忆,我也称其为,沟通模式. 下面是一个调解模式的简单案例 ...
随机推荐
- 【SHELL】在指定格式的文件中查找字符串
在指定格式的文件中查找字符串 grep -nr "string" --include=*.{c,cpp,h} 在排除指定格式的文件中查找字符串 grep -nr "str ...
- [转帖]gdb进阶调试技巧
https://www.jianshu.com/p/9bdaa0644dba 整理一下在linux下C/C++用gdb工具debug一些提高效率的操作.基本的gdb操作就不在这里赘述了. 打印各种变量 ...
- [转帖]服务器稳定性测试-LTP压力测试方法及工具下载
简介 LTP(LinuxTest Project)是SGI.IBM.OSDL和Bull合作的项目,目的是为开源社区提供一个测试套件,用来验证Linux系统可靠性.健壮性和稳定性.LTP测试套件是测试L ...
- [转帖]台积电3nm成功量产,稳了吗?
https://docs.pingcode.com/info/13836.html?p=13836 2023-01-19 资讯 21 原标题:台积电3纳米成功量产:未来与三星仍将决战鳍式场效晶体管(F ...
- [转帖]03-rsync传输模式(本地传输、远程方式传输、守护进程模式传输)
https://developer.aliyun.com/article/885801?spm=a2c6h.24874632.expert-profile.282.7c46cfe9h5DxWK 简介: ...
- mysql 的outfile以及infile 语法简单备份恢复表
今天学习 姜老师的 mysql技术内存innodb存储引擎时看到了有一个outfile和infile的语法,感觉挺好的, 这里面进行一下简单的学习与验证. oufile 可以到处文件 infile 可 ...
- Linux 排除某些目录下 重复jar包的方法
Linux 排除某些目录下 取重复jar包的方法 find . -path ./runtime/java -prune -o -name '*.jar' -exec basename {} \;| s ...
- 【原创】linux为什么不是实时操作系统
一.什么是实时操作系统(RTOS)? 可参见本博客之前的文章: 什么是实时 实时的分类 常见的RTOS latency和jitter 总结一下,实时其实说的是系统响应事件需要的时间的确定性,时间必须确 ...
- 袋鼠云数栈产品中 AI+ 实现原理剖析
生产力工具 + AI 是不可逆转的趋势,慢慢的大模型能力通过 AI Agent 落地的工程化能力也开始趋于成熟.作为大数据产品的数栈也必然是需要借助 AI 能力提升产品竞争力. 去年 12 月,我们在 ...
- 京东金融APP-新交互技术“虚拟数字人”赋能世界杯主题营销
作者:平台研发部,智能服务与产品部 距离加文·伍德提出web3.0已经过去8年时间,这8年加文·伍德创建的以太坊大放异彩,同时由web3.0引出的数字人.元宇宙也生根发芽,茁壮成长,带来了非凡的用户体 ...