【恋上数据结构】优先级队列学习笔记
优先级队列
引言
- 普通的队列是 FIFO 原则,也就是先进先出
- 优先级队列则是按照优先级高低进行出队,比如将优先级最高的元素作为队头优先出队
优先级队列的应用场景
-
医院的夜间门诊
- 队列元素是病人
- 优先级是病情的严重情况、挂号时间
-
操作系统的多任务调度
- 队列元素是任务
- 优先级是任务类型
代码实现
根据优先队列的特点,很容易想到: 可以直接利用二叉堆作为优先队列的底层实现
- 将优先级最高的元素放到堆顶
- 利用最大堆的删除性质(删除元素,返回堆顶元素,重新调整结构)
public class PriorityQueue<E> { private BinaryHeap<E> heap; public PriorityQueue(Comparator<E> 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<Person> { private String name; private int boneBreak; public Person(String name, int boneBreak) { this.name = name; this.boneBreak = boneBreak; } @Override public int compareTo(Person person) { // 相当于 o1 - o2 return this.boneBreak - person.boneBreak; } @Override public String toString() { return "Person [name=" + name + ", boneBreak=" + boneBreak + "]"; } }
Main 方法测试
public class Main { public static void main(String[] args) { PriorityQueue<Person> 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()); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现