优先队列(Priority Queue)
背景
许多应用程序都需要处理有序的元素,但不一定要求它们全部有序,或是不一定要一次就将它们排序。很多情况下我们会收集一些元素,处理当前键值最大的元素,然后再收集更多的元素,再处理当前键值最大的元素,如此这般。例如,你可能有一台能够同时运行多个应用程序的电脑(或者手机)。这是通过为每个应用程序事件分配一个优先级,并总是处理下一个优先级最高的事件来实现的。例如,绝大多数手机分配给来电的优先级都会被游戏程序的高。
定义
在这种情况下,一个合适的数据结构应该快速支持三种操作:获取最值、删除最值和插入新值。这种数据类型叫做优先队列(Priority Queue)。优先队列能以常数阶 O ( 1 ) O(1) O(1)的平均时间复杂度获取最值,并且还能以 O ( l o g n ) O(logn) O(logn) 的平均时间复杂度删除最值或插入任意值。
而优先队列通常基于二叉堆来实现,而二叉堆通常以顺序存储结构来实现。所以用数组保存元素并按照一定条件排序,以实现高效地(对数级别的)删除最大元素和插入元素操作。
API
优先队列是一种抽象数据类型,它表示了一组值和对这些值的操作,它的抽象层使我们能够方便地将应用程序和各种具体实现隔离开来。
泛型优先队列的 API 如下:
public class MaxPQ <Key extends Comparable<Key>>
-----------------------------------------------------------------------
MaxPQ() 创建一个优先队列
MaxPQ(int max) 创建一个初始容量为 max 的优先队列
MaxPQ(Key[] a) 用a中的元素创建一个优先队列
void insert(Key v) 向优先队列中插入一个元素
Key max() 返回最大元素
Key delMax() 删除并返回最大元素
boolean isEmpty() 返回队列是否为空
int size() 返回优先队列中元素个数