版权声明:转载请注明出处: https://blog.csdn.net/qq_34774655/article/details/85568012
学习堆、优先队列之间的关系。
普通队列:先进先出;后进后出。
优先队列:出队顺序和入队顺序无关,和优先级相关。
入队 | 出队(拿出最大元素) | |
之前自定义的普通线性结构 | O(1) | O(n) |
之前自定义的顺序线性结构 | O(n) | O(1) |
堆 | O(log n) | O(log n) |
此外:优先队列应用的经典问题是:在N个元素中选出前M个元素。
其他的排序算法一般能达到:O(NlogN) ,而优先队列可以达到 O(NlogM)。
参考1: 自定义堆 MaxHeap.java
参考2:自定义队列 Queue.java
注:java.util包中的PriorityQueue是小顶堆实现的。
package Heap;
public class PriorityQueue<E extends Comparable<E>> implements Queue<E>{
private MaxHeap<E> maxHeap;//底层维护了一个最大堆
public PriorityQueue() {
maxHeap=new MaxHeap<>();
}
/**
* 获取队列中数据的大小
*/
@Override
public int getSize() {
return maxHeap.size();
}
/**
* 判断队列是否为空
*/
@Override
public boolean isEmpty() {
return maxHeap.isEmpty();
}
/**
* 在队尾插入元素
*/
@Override
public void enqueue(E e) {
maxHeap.add(e);
}
/**
* 在队头删除元素
*/
@Override
public E dequeue() {
return maxHeap.extractMax();
}
/**
* 查看队头元素
*/
@Override
public E getFront() {
return maxHeap.findMax();
}
}