红魔咖啡馆

头发越掉越多,头发越掉越少

0%

【CS61B】Lec21 Priority Queue & Heaps

Lec21 Priority Queue & Heaps

定义

若我们使用BST,处理相同元素时会变得很棘手,故我们需要引入堆这种数据结构

堆(二叉最小堆)是一颗完全二叉树,并且它遵循最小堆原则

  • 每个节点的值都不大于它两个子节点的键值

添加元素

add1

首先将待添加元素加入堆底

add2

然后将该节点与父节点比较,按照结果如果小于父节点则上浮,直到合适位置

删除元素

首先去除根节点,选择堆尾部节点,与期父节点比较,若满足更小性质就将节点上移

del

实现方法

我们将键存在一个数组中,而不需要存储树结构

这只适用于完全二叉树,因为只有完全二叉树可以实现从左往右依次标号得到键列表的结果

为了方便操作,我们将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));
    }
}

优先队列的接口

可以用 于获取最小/最大/最佳元素

pq

时间复杂度