Java优先级队列PriorityQueue
1.优先级队列概述
PriorityQueue,即优先队列。优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++的优先队列每次取最大元素)。这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序(natural ordering),也可以通过构造时传入的比较器(Comparator,类似于C++的仿函数)。
Java中PriorityQueue实现了Queue接口,不允许放入null元素;其通过堆实现,具体说是通过完全二叉树(complete binary tree)实现的小顶堆(任意一个非叶子节点的权值,都不大于其左右子节点的权值),也就意味着可以通过数组来作为PriorityQueue的底层实现。
2.优先级队列的操作方法
栈中的插入和移除数据项的命名一般都是 push、pop,而队列至今没有标准化的命名。插入操作可以用 add、offer等命名,移除操作可以用 poll、remove、等命名,查看队头操作可以用 peek、element等命令。
Java中PriorityQueue实现了Queue接口,Queue接口实现了Collection接口,所以PriorityQueue包含了collection接口的add,remove,element方法
在 Java 中,常见的队列操作以及它们的区别如下所示:
操作 | 方法名 | 描述 |
---|---|---|
插入 | offer | 向队列插入元素,在一个满的队列中加入一个新项会返回false |
插入 | add | 向队列插入元素,在一个满的队列中加入一个新项会抛出异常 |
删除 | poll | 从队列中删除第一个元素,在队列为空时返回null |
删除 | remove | 从队列中删除第一个元素,在队列为空时会抛出异常 |
查看队头元素 | peek | 在队列的头部查询元素,在队列为空时返回null |
查看队头元素 | element | 从队列中删除第一个元素,在队列为空时会抛出异常 |
3.优先级队列的应用
3.1.最小K个数
3.1.1.问题描述
设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。
示例:
输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]
提示:
0 <= len(arr) <= 100000
0 <= k <= min(100000, len(arr))
3.1.2.解题思路及实现代码
我们用一个小根堆(优先级队列)实时维护数组的前 k 小值。首先将数组中的全部元素压入堆中(优先级队列),然后出队k个元素即可,求得最小的k个元素
class Solution {public int[] smallestK(int[] arr, int k) {Queue<Integer> queue=new PriorityQueue<Integer>(); //优先级队列int len=arr.length;for(int i=0;i<len;i++){ //将数组中元素入队queue.offer(arr[i]);}int [] result=new int[k];for(int i=0;i<k;i++){ //出队k个元素result[i]=queue.poll();}return result;}
}
Java优先级队列PriorityQueue相关推荐
- Java 优先级队列
文章目录 Java 优先级队列 PriorityQueue简介 继承关系 PriorityQueue示例 Comparable比较器 Comparable接口 Comparator比较器 Compar ...
- 优先级队列PriorityQueue
优先级队列PriorityQueue 概述 前面以Java ArrayDeque为例讲解了Stack和Queue,其实还有一种特殊的队列叫做PriorityQueue,即优先队列.优先队列的作用是能保 ...
- java优先级队列使用
优先级队列是比栈和队列更专用的结构,在多数情况下都非常有用.优先级队列像普通队列一样,有一个队头和队尾,并且也是从队头移除数据. 优先级队列中,数据按关键词有序排列,插入新数据的时候,会自动插入到合适 ...
- 什么是java优先级队列_什么是Java优先级队列(Priority Queue)?
39 优先级队列中的元素可以按照任意的顺序插入,却总是按照排序的顺序进行检索.无论何时调用remove方法,总会获得当前优先级队列中的最小元素,但并不是对所有元素都排序.它是采用了堆(一个可以自我调整 ...
- 优先级队列PriorityQueue在算法问题中的使用
文章目录 优先级队列介绍 与优先级队列有关的习题 [179. 最大数] [918. 环形子数组的最大和] [1094. 拼车] [264. 丑数 II] 前k个出现频率最高的数字 用优先级队列合并k个 ...
- 优先级队列 PriorityQueue
1. 优先级队列是什么?? 首先,优先级队列是一个队列,队列所有的性质,它也有. 其次,优先级队列每次取出的是优先级最高的元素. 优先级队列的内部是用堆来维护的.将优先级最高的排在前面. 2. 什么时 ...
- java优先级队列(堆)
文章目录 一.优先级队列是什么? 二.堆 什么是堆? 堆的分类: 堆的存储 堆的创建 三.堆的操作 插入元素 弹出元素 四.用堆模拟实现优先级队列 一.优先级队列是什么? 在数据结构中,普通的队列是先 ...
- 第十四章第五节:Java集合框架之优先级队列PriorityQueue(堆)
文章目录 一:堆基本概念 (1)什么是堆 (2)堆存储方式 二:堆的模拟实现 (1)重点操作说明 A:堆的初始化 B:堆的向下调整 C:堆的构造 D:堆的插入 E:堆的删除 (2)代码 三:Prior ...
- Java中的PriorityQueue优先级队列
以前的博客中介绍过队列是一种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先级,此时出队列时需要优先级高的元素先出队列,这个时候传统的队列显然不能胜任,Java中有一个新的实现类继 ...
最新文章
- cocos2d-x 调色
- ibatis 高速缓存
- 微机原理——总线和时序
- python中oxf2是什么_0x02-StartingPoint-Oopsie
- 吴恩达深度学习—— 3.4 多个例子中的向量化
- iPhone 12系列被曝量产延期:10月能见到就不错
- pom模块依赖关系梳理
- 003.ASP.NET MVC集中管理Session
- 区块链发展迎来新机遇
- MATLAB-基本简介
- 中国行政区划编码-省市县镇村
- 202. 快乐数 (Python 实现)
- 见信如晤::‘卷福’读信:我全心全意去拥抱您
- js每日一题(11)
- 解决tar: Error is not recoverable: exiting now
- 在GT4 Client端EndpointReferenceType的标准序列化方法
- python 操作redis之五(集合)
- 受保护的视图编辑会损害计算机,Word打开文件的时候显示受保护的状态怎么解决...
- 字号、pt、px、inch、cm 之间的关系及对照表
- ddn高性能服务器,全球IO500最新榜单公布,Intel、DDN、浪潮等位列前5
热门文章
- 苹果涉嫌利用App Store打压屏幕时间应用竞争对手 已被投诉至欧盟
- 听说当今程序员很厉害?不,那是你不了解上古时期的那些神级操作
- 一个程序员的简洁职业生涯规划
- 晨哥真有料丨女生眼中的高级感!
- linux系统微内核,科普:微内核操作系统现状
- oracle 临时表空间满了_精心总结--Oracle查询表空间的每日增长量和历史情况统计脚本...
- linux 高级文件IO
- Linux内存带宽的一些测试笔记
- Java中的enum详细解析------Java 语言中 Enum 类型的使用介绍
- sentinel 时间窗口_Sentinel 实战-规则持久化