Lec21 Priority Queue & Heaps
堆
定义
若我们使用BST,处理相同元素时会变得很棘手,故我们需要引入堆这种数据结构
堆(二叉最小堆)是一颗完全二叉树,并且它遵循最小堆原则:
- 每个节点的值都不大于它两个子节点的键值
添加元素
首先将待添加元素加入堆底
然后将该节点与父节点比较,按照结果如果小于父节点则上浮,直到合适位置
删除元素
首先去除根节点,选择堆尾部节点,与期父节点比较,若满足更小性质就将节点上移
实现方法
我们将键存在一个数组中,而不需要存储树结构
这只适用于完全二叉树,因为只有完全二叉树可以实现从左往右依次标号得到键列表的结果
为了方便操作,我们将0下标空出来,这样对于节点k,计算父亲与孩子节点就更方便了:
- 左孩子 = \(k\times 2\)
- 右孩子 = \(k\times 2+1\)
- 父亲 = \(\frac{k}{2}\)
对于上浮,使用递归操作,只需要比较当前节点与父节点大小,若父节点更大就需要交换并上浮
1
2
3
4
5
6
public void swim(int k){
if (keys[parent(k)]>keys[k]){
swap(k, parent(k));
swim(parent(k));
}
}优先队列的接口
可以用 于获取最小/最大/最佳元素
时间复杂度