
(恋上数据结构笔记):优先级队列(Priority Queue)
优先级队列概述 优先级队列的接口定义 优先级队列的应用场景 优先队列的底层实现
发布日期:2021-05-07 15:19:31
浏览次数:8
分类:精选文章
本文共 2388 字,大约阅读时间需要 7 分钟。
优先级队列(Priority Queue)技术解析
目录
优先级队列概述
优先级队列是一种能够根据元素的优先级进行操作的数据结构,常用于任务调度、事件处理等场景。与普通队列不同,优先级队列能够自动根据元素的优先级决定元素的入队和出队顺序。
优先级队列的接口定义
优先级队列的接口通常包括以下几个核心方法:
size()
:返回队列的元素数量。isEmpty()
:判断队列是否为空。enQueue(E element)
:将元素入队。deQueue()
:从队列头部取出元素。front()
:获取队列的首元素。clear()
:清空队列。
优先级队列的应用场景
优先级队列广泛应用于以下场景:
1. 医院的夜间门诊
- 队列元素:患者
- 优先级依据:病情严重程度、挂号时间
2. 操作系统的多任务调度
- 队列元素:任务
- 优先级依据:任务类型、执行优先级
通过优先级队列,可以确保任务或患者的处理顺序符合预定规则,提升整体效率。
优先队列的底层实现
优先级队列的底层通常采用二叉堆(Binary Heap)实现,因为二叉堆能够在O(log n)时间复杂度内完成插入、删除和查找操作。
实现原理
- 二叉堆通过数组存储数据,父节点总是位于子节点的左侧。
- 根据比较器(Comparator)或可比较对象(Comparable),确定元素的优先级。
- 每次从堆顶取出具有最高优先级的元素。
优先级队列代码示例
以下是优先级队列的实现代码:
public class PriorityQueue{ private BinaryHeap heap; public PriorityQueue(Comparator 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(); }}
测试代码示例
以下是优先级队列的使用示例:
public class Person implements Comparable{ private String name; private int boneBreak; public Person(String name, int boneBreak) { this.name = name; this.boneBreak = boneBreak; } @Override public int compareTo(Person person) { return this.boneBreak - person.boneBreak; } @Override public String toString() { return "Person [name=" + name + ", boneBreak=" + boneBreak + "]"; }}public class Main { public static void main(String[] args) { PriorityQueue queue = new PriorityQueue<>(); queue.enQueue(new Person("Jack", 2)); queue.enQueue(new Person("Rose", 10)); queue.enQueue(new Person("Jake", 5)); queue.enQueue(new Person("James", 15)); while (!queue.isEmpty()) { System.out.println(queue.deQueue()); } }}
输出结果
程序运行后会输出以下内容:
Person [name=James, boneBreak=15] Person [name=Rose, boneBreak=10] Person [name=Jake, boneBreak=5] Person [name=Jack, boneBreak=2]
通过以上内容,可以看出优先级队列在实际应用中的高效性和灵活性,同时也展示了如何通过二叉堆实现优先级队列的底层逻辑。
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年03月23日 18时22分45秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
yarn安装
2019-03-04
今天你吃汤圆了吗?
2019-03-04
CI/CD and beyond with GitHub Actions
2019-03-04
回顾 | 如何快速开发一款扩展
2019-03-04
《进击吧!Blazor!》第一章 4.数据交互
2019-03-04
分享一个500异常
2019-03-04
怎么玩LOG4J
2019-03-04
Oracle创建用户,分配表空间
2019-03-04
自定义标签(JSP2.0)简单标签
2019-03-04
MyBatis自定义类型转换器
2019-03-04
SpringBoot缓存入门篇
2019-03-04
机器学习(湖北师范大学教程)-极大似然估计算法
2019-03-04
2019年下半年总结
2019-03-04
读《红楼梦》有感
2021-05-07
【数据库视频之操作查询(一)】
2021-05-07
【C# 重构】—参数化查询, 需要参数,但未提供该参数
2021-05-07
决策树(二)—— ID3和C4.5
2021-05-07
leetcode做题记录0059
2021-05-07
leetcode做题记录0062
2021-05-07
Leetcode每日随机2021/4/26
2021-05-07