优先队列
本文最后更新于:2024年8月18日 上午
阅前警告
本文内容可能高度抽象,仅作为笔记参考
什么事优先队列
一种以一定顺序(根据优先值)组织起各个数据的数据结构,支持(高效地)删除最大(或最小)元素、插入元素两种基本操作。
我们经常通过(二叉)堆来实现优先队列。二叉堆是一组能够用堆有序的完全二叉树排序的元素,并在数组中按照层级储存(不使用数组的第一个位置)。堆有序:当一棵二叉树的每个结点都大于等于(小于等于也成立?)它的两个子结点时,它被称为堆有序。根结点是堆有序的二叉树中的最大结点。
在二叉堆中,位置为k
的父结点的位置就是k/2
,它的两个子结点的位置就是2k
和2k+1
。
优先队列的实现
上浮与下沉
堆的两个基本操作(插入元素和删除优先级最高元素)都会打破堆的状态,然后再遍历堆并按照要求将堆的状态恢复。我们称这个过程为“堆的有序化(reheapifying)”。
堆的有序化有两种情况:上浮(swim)与下沉(sink)
上浮,即:在堆底加入一个新的元素时,需由下至上恢复堆的顺序。swim
的实现如下:
1 |
|
下沉,即:将根结点替换为一个较小的元素时,需由上至下恢复堆的顺序。sink
的实现如下:
1 |
|
插入与删除
插入:
1 |
|
删除(优先级)最大元素:
1 |
|
完整代码
最大堆
索引最小堆
希望本文章能够帮到您~
优先队列
https://map1e-g.github.io/2024/07/03/algorithm-priority-queue/