java优先队列PriorityQueue
文章目录
前言
今天复习算法时,发现优先队列有些忘记了,就去研究了下优先队列的源码,写个小笔记,加深下理解。
PriorityQueue
优先队列
我们知道队列是FIFO(先进先出)的,而优先队列的每一个元素都有一个对应的优先级,所以优先队列最前面的元素是优先级最高或者优先级元素最低的元素。
优先队列保留了队列的基本性质,优先队列其实可以看成堆,这样更加好理解。
java中优先队列的声明
在java中,是有已经封装好的优先队列供我们调用的,即PriorityQueue
PriorityQueue<Integer> queue = new PriorityQueue<Integer>();
这样声明的优先队列的值就默认为优先队列的优先级了。
优先队列插入和删除元素的时间复杂度为O(log2N)
当我们需要声明一个带初始容量的优先队列时,我们可以直接在声明的后面加上我们想要的容量,比如我们声明一个50的容量。
PriorityQueue<Integer> queue = new PriorityQueue<Integer>(50);
按优先级排序
在默认情况下,不传入Comparator对象的话,Java会默认按优先级从小到大排序,即一个小顶堆,就是按优先级从小到大的队列,队首是优先级最小的元素。
那假如我们想要一个队首是最大优先级的元素时,我们需要怎么设置呢
PriorityQueue<Integer> queue = new PriorityQueue<Integer>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
常见方法
private void grow(int minCapacity)
这个方法可以增加优先队列的容量
private void grow(int minCapacity) {
int oldCapacity = queue.length;
// Double size if small; else grow by 50%
int newCapacity = ArraysSupport.newLength(oldCapacity,
minCapacity - oldCapacity, /* minimum growth */
oldCapacity < 64 ? oldCapacity + 2 : oldCapacity >> 1
/* preferred growth */);
queue = Arrays.copyOf(queue, newCapacity);
}
public boolean offer(E e)
插入一个元素e,如果e为空,会抛出NullPointerException,如果队列的容量满了,会自动扩容。插入成功返回true
public E poll()
弹出一个优先级最高或者最低(取决于你的设置),如果优先队列为空,返回null
public int size()
返回当前优先队列的个数
public void clear()
清空当前队列
public void clear() {
modCount++;
final Object[] es = queue;
for (int i = 0, n = size; i < n; i++)
es[i] = null;
size = 0;
}
public E peek()
获取队首元素
public E peek() {
return (E) queue[0];
}
public boolean isEmpty()
检查优先队列是否为空,空就返回true
总结
简单常见的一些方法,如果有什么问题,希望大佬指教。
java优先队列PriorityQueue的更多相关文章
- Java优先队列PriorityQueue的各种打开方式以及一些你不知道的细节
目录 Java优先队列PriorityQueue的各种打开方式以及一些你不知道的细节 优先队列的默认用法-从小到大排序 对String类用优先队列从大到小排序 通过自定义比较器对自定义的类进行从小到大 ...
- 【Java源码】集合类-优先队列PriorityQueue
一.类继承关系 public class PriorityQueue<E> extends AbstractQueue<E> implements java.io.Serial ...
- Java Collection - PriorityQueue 优先队列
总结 优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++的优先队列每次取最大元素).这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序(na ...
- Java的优先队列PriorityQueue详解
一.优先队列概述 优先队列PriorityQueue是Queue接口的实现,可以对其中元素进行排序, 可以放基本数据类型的包装类(如:Integer,Long等)或自定义的类 对于基本数据类型的包装器 ...
- Java优先队列
按照Java api的说法: java.util.PriorityQueue.PriorityQueue() Creates a PriorityQueue with the default init ...
- java中PriorityQueue优先级队列使用方法
优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. PriorityQueue是从JDK1.5开始提供的新的数据结构接口. 如果不提供Comparator的话,优先 ...
- 《转》JAVA中PriorityQueue优先级队列使用方法
该文章转自:http://blog.csdn.net/hiphopmattshi/article/details/7334487 优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最 ...
- 【转】java中PriorityQueue优先级队列使用方法
优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. PriorityQueue是从JDK1.5开始提供的新的数据结构接口. 如果不提供Comparator的话,优先 ...
- java,优先队列的用法
像C++语言一样,java中,也有包装好的优先队列类PriorityQueue. 用法如下(模板代码): 工作安排问题: 问题描述:设有n件工作分配给n个人,将工作i分配给第j个人所需的费用为cij. ...
- 优先队列PriorityQueue实现 大小根堆 解决top k 问题
转载:https://www.cnblogs.com/lifegoesonitself/p/3391741.html PriorityQueue是从JDK1.5开始提供的新的数据结构接口,它是一种基于 ...
随机推荐
- Blob文件下载type类型
let url = window.URL.createObjectURL(new Blob([文件流(一般为res.data)], {type: "Blob类型"}) let li ...
- springboot的websocket因IP问题无法连接
首先遇到这个问题有点奇葩,出现在项目上线时的客户现场,头两天一直都无法确定原因,因为它的表现方式很奇怪,基于springboot实现的websocket,同样的代码在公司研发环境不会有问题,客户现场会 ...
- POI给单元格添加超链接(xls,xlsx)
package com.topcheer.html; import java.io.FileOutputStream; import java.io.IOException; import org.a ...
- Oracle-账户被锁:The account is locked
Oracle-账户被锁:The account is locked cmd-->sqlplus--> 管理员登录:system@ORCL 密码:1 然后输入:alter user kjb( ...
- Redis在线安装+三种启动方式(自启配置)
1.下载 1)检查是否安装wget插件 $ wget --version 2)如未安装,使用yum进行安装 $ yum install -y wget 3)下载redis安装包 $ wge ...
- Spring-传统方式(XML)创建webapp
如何搭建一个传统的webapp项目[Java后端] 使用xml 来搭建 SSM 环境,要求 Tomcat 的版本必须在 7 以上 QuickStart 1创建工程 创建一个新模块[普通的 Maven ...
- Python 3 os.walk读取指定文件路径后,打印路径参数为空
今天有时间自己尝试了一下os.walk的小实验,结果出现了一个小问题:在交互模式下,运行我的python脚本,没有打印任何内容 返回去看一下test.py内容 返回去看一下文件路径是否正确: 看着好像 ...
- 关于Android开发工具的下载之ADT篇
ADT的下载 首先可以选择下面推荐的两个网站去下载相应的安装包,网址如下: http://tools.android-studio.org/index.php/adt-bundle-plugin 或者 ...
- CosineWarmup理论与代码实战
摘要:CosineWarmup是一种非常实用的训练策略,本次教程将带领大家实现该训练策略.教程将从理论和代码实战两个方面进行. 本文分享自华为云社区<CosineWarmup理论介绍与代码实战& ...
- return、break与continue的区别
前言 在上一篇文章中,壹哥给大家介绍了while.do-while两种循环结构,并且给大家总结了两种循环的区别.实际上,我们在利用循环执行重复操作的过程中,还存在着另一个需求:如何中止,或者说提前结束 ...