优先级队列(Priority Queue)
优先级队列本身也是一个队列,只不过常规的队列是先进先出,而优先级队列可以插队,即让队列中优先级最高的元素先出队。在Java中,普通队列是由双向链表来实现的,如果优先级队列也使用双向链表,那么通过遍历找优先级最高的节点需要O(n)的时间复杂度,但如果使用二叉堆,那么入队和出队的时间复杂度都可以降到O(logn)。
接口
方法 | 功能 |
---|---|
int size() | 获取队列大小 |
void isEmpty() | 是否为空 |
void clear() | 清空队列 |
void offer() | 进队 |
E poll() | 出队 |
E peek() | 获取队顶元素 |
具体实现
我们可以通过一个二叉堆来实现优先级队列(有关堆见:堆的概念与二叉堆的实现详细图解)。
代码:
public class PriorityQueue<E> {
private BinaryHeap<E> heap;
public PriorityQueue(){
this(null);
}
//允许传入优先级比较方法
public PriorityQueue(Comparator<E> comparator){
heap=new BinaryHeap<>(comparator);
}
public int size(){
return heap.size();
}
public boolean isEmpty(){
return heap.isEmpty();
}
public void clear(){
heap.clear();
}
/**
* 入队
*/
public void offer(E element) {
heap.add(element);
}
public E poll() {
return heap.remove();
}
public E peek() {
return heap.get();
}
}