美文网首页
二十四、优先级队列(Priority Queue)

二十四、优先级队列(Priority Queue)

作者: 咸鱼Jay | 来源:发表于2022-02-17 17:43 被阅读0次

1、优先级队列(Priority Queue)

优先级队列(Priority Queue)
  • 优先级队列也是个队列,因此也是提供以下接口
int size(); // 元素的数量
boolean isEmpty(); // 是否为空
void enQueue(E element); // 入队
E deQueue(); // 出队
E front(); // 获取队列的头元素
void clear(); // 清空
  • 普通的队列是 FIFO 原则,也就是先进先出
  • 优先级队列则是按照\color{#ed772e}{优先级高低}进行出队,比如将\color{#ed772e}{优先级高高}的元素作为\color{#ed772e}{队头}优先出队

2、优先级队列的应用场景举例

  • 医院的夜间门诊
    1. 队列元素是病人
    2. 优先级是病情的严重情况、挂号时间
  • 操作系统的多任务调度
    1. 队列元素是任务
    2. 优先级是任务类型

3、优先队列的底层实现

  1. 根据优先队列的特点,很容易想到:可以直接利用二叉堆作为优先队列的底层实现
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();
    }
}
  1. 可以通过ComparatorComparable去自定义优先级高低

4、PriorityQueue源码


可以看到PriorityQueue源码里有offerpollpeek一些操作方法,这些不就是队列的方法嘛。
我们可以看一下offer方法,可以看到有调用siftUp的方法,这个方法不就是上滤嘛,上滤不就是二叉堆里面的知识嘛,因此JDK的优先级队列就是使用二叉堆来实现的

代码链接

相关文章

网友评论

      本文标题:二十四、优先级队列(Priority Queue)

      本文链接:https://www.haomeiwen.com/subject/zbiskrtx.html