1、优先级队列(Priority Queue)
优先级队列(Priority Queue)- 优先级队列也是个队列,因此也是提供以下接口
int size(); // 元素的数量
boolean isEmpty(); // 是否为空
void enQueue(E element); // 入队
E deQueue(); // 出队
E front(); // 获取队列的头元素
void clear(); // 清空
- 普通的队列是 FIFO 原则,也就是先进先出
- 优先级队列则是按照进行出队,比如将的元素作为优先出队
2、优先级队列的应用场景举例
- 医院的夜间门诊
- 队列元素是病人
- 优先级是病情的严重情况、挂号时间
- 操作系统的多任务调度
- 队列元素是任务
- 优先级是任务类型
3、优先队列的底层实现
- 根据优先队列的特点,很容易想到:可以直接利用二叉堆作为优先队列的底层实现
public class PriorityQueue<E> {
private BinaryHeap<E> heap;
public PriorityQueue(Comparator<E> comparator) {
heap = new BinaryHeap<>(comparator);
}
public PriorityQueue() {
this(null);
}
public int size() {
return heap.size();
}
public boolean isEmpty() {
return heap.isEmpty();
}
public void clear() {
heap.clear();
}
public void enQueue(E element) {
heap.add(element);
}
public E deQueue() {
return heap.remove();
}
public E front() {
return heap.get();
}
}
- 可以通过
Comparator
或Comparable
去自定义优先级高低
4、PriorityQueue源码
可以看到
PriorityQueue
源码里有offer
、poll
、peek
一些操作方法,这些不就是队列的方法嘛。
我们可以看一下
offer
方法,可以看到有调用siftUp
的方法,这个方法不就是上滤嘛,上滤不就是二叉堆里面的知识嘛,因此JDK
的优先级队列就是使用二叉堆来实现的
网友评论