数据结构——优先队列(堆)

目录

优先队列,堆

二叉堆

任意结点小于它的所有后裔。完全二叉树,可用数组实现,i处的左儿子在2i处,右儿子在2i+1处。
最小点或最大点总在根处,其它的关系不好得出。

基本操作

insert 上滤,新的结点放到最后面,再上滤。
deleteMin 下滤,最后一个点放到根结点,再下滤。
decreaseKey
increaseKey
remove
buildHeap 任意顺序放入树中,再从currentSize/2处点开始一直到根结点进行下滤。

缺点

不支持高效率的find和merge。

d堆

d叉树。

左式堆

左儿子的零路径长至少与右儿子的零路径长一样大。存在最短的右路径。
可以有效地支持合并,O(logN)运行时间。

操作

merge 合并,递归地将具有大的根值的堆与具有较小根值的堆的右子堆合并。调整左右两个子树,不满足条件是交换两棵子树。递归算法的完美体现。
insert 单节点的merge
deleteMin 合并剩下的两个子堆。
buildHeap 递归建立左右子树(?)

斜堆

近似于左式堆,但没有结构限制。
merge 总是交换左右儿子。合并右路径,除最后的节点外交换右路径上每个结点的左儿子和右儿子。

二项队列

堆序树的集合,且没有高度相同的树。Bk树通过把Bk-1树附接到Bk-1的根上形成。相当于二进制数中的每一位。1101表示,有B0、B2、B3三棵树。

操作

最小元: 比较各个树根
合并: 合并高度相同的两棵树,一棵接到另一棵的根结点上。若有相同的,则继续,只到没有高度相同的树。
插入: 特殊的合并。
deleteMin: 最小根的树删掉根结点,形成两棵树,再与其它的树合并。

实现

根结点保存成vector向量,每个结点保存第一个儿子和右兄弟的指针。

标准库中的优先队列

priority_queue