堆和优先权队列
堆和优先权队列
堆的概念和存储表示
堆
一个大小为 n 的堆是一棵包含 n 个结点的完全二叉树,根结点为称为堆顶
- 最小堆:树中每个结点的数据都 小于或等于 其孩子结点
- 堆顶存储的数据最小
- 最大堆:树中每个结点的数据都 大于或等于 其孩子结点
- 堆顶存储的数据最大
顺序表判断最小堆
1 |
|
建堆运算
基本思想:从最后一个叶子结点的双亲开始,一直到根结点,对不满足要求的结点依次向下调整
最后一个叶子的双亲:k(n-2)/2
关键:
- 针对序列上的某个元素进行不断的调整,直到符合它应该处于的位置
- 当前位置处理完毕,处理当前元素调整前的前一位元素
1 |
|
优先权队列
特点
- 每个元素都有一个优先权,且可以比较大小
- 元素 按优先权的高低顺序 依次出队
传统队列
有时也可以看作优先权队列——用元素进队时间长短来表示优先权,进队时间最长,则优先权最高
方案
- 进队:将新元素放在队尾元素后,并按照 最大/小堆 进行调整 O(log2n)
- 出队:
- 直接取堆顶元素 O(1)
- 然后按 最大/小堆 进行调整 O(log2n)
%%{init: {"flowchart": {"htmlLabels": false}} }%%
flowchart LR
a["优先权队列"]
b["最小(或最大)堆v"]
c["完全二叉树"]
d["顺序存储(数组)"]
a --> b --> c --> d
a --> d
向上调整
取出优先权最高的元素
- 队列为空,直接返回
- 队列不为空,获取栈顶元素,赋值给 x
- 元素计数器减一
- 用堆尾元素替代堆顶元素
- 对新的堆顶元素执行向下调整
堆和优先权队列
http://example.com/2024/11/06/堆和优先权队列/