《恋上数据结构第1季》二叉堆实现优先级队列
优先级队列(Priority Queue)
- 优先级队列简介
- 优先队列的底层实现
- 二叉堆实现优先级队列源码
- 测试代码
数据结构与算法笔记目录:《恋上数据结构》 笔记目录
想加深 Java 基础推荐看这个: Java 强化笔记目录
优先级队列简介
优先级队列也是个队列,因此也提供以下接口:
public interface Queue<E> {int size(); // 元素的数量boolean isEmpty(); // 是否为空void enQueue(E element); // 入队E deQueue(); // 出队E front(); // 获取队列的头元素void clear(); // 清空
}
队列与优先级队列对比:
- 普通的队列是 FIFO 原则,也就是先进先出
- 优先级队列则是按照优先级高低进行出队,
比如将优先级最高的元素作为队头优先出队。
优先级队列应用场景:
- 医院的夜间门诊
队列元素是病人
优先级是病情的严重情况、挂号时间 - 操作系统的多任务调度
队列元素是任务
优先级是任务类型
优先队列的底层实现
- 利用二叉堆作为优先队列的底层实现
- 可以通过 Comparator 或 Comparable 去自定义优先级高低
二叉堆实现优先级队列源码
利用二叉堆实现优先级队列。
/*** 二叉堆实现优先级队列* @author yusael*/
public class PriorityQueue<E> {private BinaryHeap<E> heap;// 通过 comparator 自定义优先级高低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();}
}
测试代码
Person.java
public class Person implements Comparable<Person> {private String name;private int boneBreak;public Person(String name, int boneBreak) {this.name = name;this.boneBreak = boneBreak;}@Overridepublic int compareTo(Person person) {return this.boneBreak - person.boneBreak;}@Overridepublic String toString() {return "Person [name=" + name + ", boneBreak=" + boneBreak + "]";}
}
Main.java
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());}}
}
Person [name=James, boneBreak=15]
Person [name=Rose, boneBreak=10]
Person [name=Jake, boneBreak=5]
Person [name=Jack, boneBreak=2]
《恋上数据结构第1季》二叉堆实现优先级队列相关推荐
- 《恋上数据结构第1季》二叉搜索树BST
二叉搜索树(BinarySearchTree) BST 接口设计 BST 基础 添加元素: add() 删除元素: remove() 删除节点 – 叶子节点 删除节点 – 度为1的节点 删除节点 – ...
- 《恋上数据结构第1季》动态数组实现栈
栈(Stack) 栈的应用 – 浏览器的前进和后退 栈的接口设计 动态数组实现栈 练习题 逆波兰表达式求值 有效的括号 数据结构与算法笔记目录:<恋上数据结构> 笔记目录 想加深 Java ...
- 42. 盘点那些必问的数据结构算法题之二叉堆
盘点那些必问的数据结构算法题之二叉堆 0 概述 1 二叉堆定义 2 保持堆的性质 3 建立最大堆 4 堆排序 5 优先级队列 参考资料 0 概述 本文要描述的堆是二叉堆.二叉堆是一种数组对象,可以被视 ...
- 《恋上数据结构第1季》二叉堆原理及实现、最小堆解决 TOP K 问题
二叉堆 BinaryHeap 堆(Heap) 堆的出现 堆简介 二叉堆(Binary Heap) 获取最大值 最大堆 - 添加 最大堆 - 添加优化 最大堆 - 删除 replace 最大堆 - 批量 ...
- 《恋上数据结构第1季》平衡二叉搜索树、AVL树
AVL树 二叉搜索树缺点分析 改进二叉搜索树 平衡(Balance) 理想平衡 如何改进二叉搜索树? 平衡二叉搜索树(Balanced Binary Search Tree) AVL树 BST 对比 ...
- 《恋上数据结构第1季》B树
B树 m阶B树的性质 B树 vs 二叉搜索树 搜索 添加 – 上溢 添加 – 上溢的解决(假设5阶) 删除 删除 – 叶子节点 删除 – 非叶子节点 删除 – 下溢 删除 – 下溢的解决 4阶B树 数 ...
- 《恋上数据结构第1季》二叉树代码实现
二叉树(BinaryTree) BinaryTree 基础 遍历(先序.中序.后序.层次遍历) 先序遍历: preorder() 中序遍历: inorder() 后序遍历: postorder() 层 ...
- 《恋上数据结构第1季》二叉树基础、真二叉树、满二叉树、完全二叉树、二叉树的遍历(重点)
二叉树(Binary Tree) 树(Tree)的基本概念 有序树.无序树.森林 二叉树(Binary Tree) 二叉树的性质 真二叉树(Proper Binary Tree) 满二叉树(Full ...
- 《恋上数据结构第1季》映射 TreeMap,HashMap,LinkedHashMap
映射 Map Map的接口定义 Map.java 红黑树 RBTree 实现 TreeMap TreeMap 分析 哈希表实现 HashMap HashMap 升级为 LinkedHashMap 数据 ...
最新文章
- win10系统80端口被System (PID=4)占用的解决
- IxRmhOECiP
- VS与QT的路径查找差异
- 那个成人总会遇到的小问题……
- Linux学习笔记15—RPM包的安装OR源码包的安装
- 将List集合用字符串,逗号隔开进行拼接 ,五种方法
- c/c++教程 - 1.10 结构体 使用typedef定义struct结构体 结构体数组 结构体指针 结构体嵌套 结构体做函数参数 结构体const
- python里怎么读取文件-python怎么读取文本文件
- iOS 刘海屏 隐藏横条 home键
- java db4o,有用过db4O的吗?
- LED背光源和LED背光灯区别
- win7定时关机命令_磨刀三分钟 | 以【设置定时关机】为例,学会计算机界的如来神掌第1式...
- 实验9-10 平面向量加法 (15 分)
- Chrome开发者工具-阅读列表
- mysql数据库在线测试_测试面试题集-MySQL数据库灵魂拷问
- JBPM工作流(二)——数据库表说明
- batch批处理小记
- 用手机打开word图表位置很乱_word排版技巧:论文图表目录制作步骤
- iOS开发基础知识--碎片37
- Unity 游戏框架搭建 2019 (四十五) 独立的方法和独立的类