1. 定义
在 Java 里,PriorityQueue
属于队列的一种,它继承自 AbstractQueue
类并实现了 Queue
接口。与普通队列不同的是,PriorityQueue
并非按照元素的插入顺序来处理元素,而是根据元素的优先级进行处理。在这个队列里,优先级最高的元素会最先被取出。
2. 优先级排序实现原理
PriorityQueue
内部使用了一个最小堆(也可通过自定义比较器实现最大堆)这种数据结构来实现优先级排序。最小堆是一棵完全二叉树,其特性是每个节点的值都小于或等于其子节点的值。
以下是它实现优先级排序的详细步骤:
- 插入元素:当向
PriorityQueue
插入元素时,新元素会被添加到堆的末尾,然后通过“上浮”操作来调整堆的结构,使新元素移动到合适的位置以维持最小堆的性质。 - 删除元素:从
PriorityQueue
移除元素时,通常是移除堆顶元素(即优先级最高的元素)。移除堆顶元素后,会将堆的最后一个元素移到堆顶,接着通过“下沉”操作来调整堆的结构,让堆顶元素移动到合适的位置以维持最小堆的性质。
3. 代码示例
import java.util.PriorityQueue;
public class PriorityQueueExample {
public static void main(String[] args) {
// 创建一个优先队列
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
// 插入元素
priorityQueue.add(3);
priorityQueue.add(1);
priorityQueue.add(2);
// 遍历并移除元素
while (!priorityQueue.isEmpty()) {
System.out.println(priorityQueue.poll());
}
}
}
在上述代码中,元素按 1
、2
、3
的顺序输出,这是因为 PriorityQueue
默认使用元素的自然顺序(对于 Integer
类型,数值小的元素优先级高)进行排序。
4. 应用场景
- 任务调度:在任务调度系统里,不同任务可能有不同的优先级。
PriorityQueue
能够依据任务的优先级来安排任务的执行顺序,保证高优先级的任务优先执行。 - Dijkstra 算法:在图论算法中,Dijkstra 算法用于计算图中从一个节点到其他所有节点的最短路径。
PriorityQueue
可用于存储待处理的节点,并根据节点到起始节点的距离来确定节点的优先级,进而高效地选择下一个要处理的节点。 - 数据压缩:在哈夫曼编码算法中,需要构建哈夫曼树来实现数据的压缩。
PriorityQueue
可以用来存储节点,并根据节点的权重(即出现频率)来确定节点的优先级,从而方便地构建哈夫曼树。