文章目录
1.优先级队列
1.1基本概念
优先级队列也是一个队列,但是不是单纯的先进先出,而是把优先级最高的先出去。(优先级队列内部的结构就是堆。)
1.2常用的接口介绍
1.2.1PriorityQueue的特性
Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,下面是PriorityQueue的使用注意事项
1)使用优先级队列必须导入PriorityQueue所在的包
import java.util.PriorityQueue
2)PriorityQueue中放置的元素必须能够比较大小,不能插入无法比较大小的对象,否则会抛出ClassCastException异常。
3)不能插入null对象,否则会抛出空指针异常
4)没有容量限制,可以插入任意多个元素,其内部可以自动扩容;
5)PriorityQueue底层使用了推数据结构。
1.2.2PriorityQueue的常用接口介绍
插入/删除/获取优先级最高的元素
函数名 | 功能介绍 |
---|---|
boolean offer(E e) | 插入元素e,插入成功后返回true (空间不够时可以扩容) |
E peek() | 获取优先级最高的元素,如果优先级队列为空,返回null |
E poll() | 移除优先级最高的元素并返回,如果优先级为空,则返回null |
int size() | 获取有效元素个数 |
void clear() | 清空 |
boolean isEmpty() | 检测优先级队列是否为空,空返回为true |
public class Test {
public static void main(String[] args) {
PriorityQueue<Integer> queue=new PriorityQueue<>();
int [] arr={9,7,6,4,8,3,5};
for(int x:arr){
queue.offer(x);
}
while(!queue.isEmpty()){
int pos=queue.poll();
System.out.println(pos);
}
}
}
1.3优先级队列的应用
1)用来排序(堆排序)
2)用来解决topk问题(提取前K个元素)
2.优先级队列的模拟实现
2.1堆的概念
小堆(大堆)根结点最大的堆叫做最大堆(大根堆),根节点最小的堆叫做小堆(小根堆)。
堆的性质:
1)堆中的某个结点的值总是不大于(不小于)其父结点的值;
2)堆总是一个完全二叉树。