跳转至

堆简介

堆是一种数据结构,维护一个数的集合(或者,一个支持比较的元素的集合)。

主要功能有:insert, getmin, deletemin, decreasekey。

注意:简单起见,我们这里讨论的都是维护最小值的堆,也叫小根堆,与之相对的叫做大根堆。

一些功能强大的堆还能(高效地)支持 merge 等操作。

一些功能更强大的堆还支持可持久化,也就是对任意历史版本进行查询或者操作,产生新的版本。

堆的分类

操作\数据结构配对堆二叉堆左偏树二项堆斐波那契堆
插入(insert)O(1)O(\log n)O(\log n)O(1)O(1)
查询最小值(find-min)O(1)O(1)O(1)O(\log n)O(1)
删除最小值(delete-min)O(\log n)O(\log n)O(\log n)O(\log n)O(\log n)
合并 (merge)O(1)O(n)O(\log n)O(\log n)O(1)
减小一个元素的值 (decrease-key)o(\log n) (下界\Omega(\log \log n) ,\\\\上界 O(2^{2\sqrt{\log \log n}}) )O(\log n)O(logn)O(\log n)O(1)
是否支持可持久化\times\checkmark\checkmark\times

一个有趣的事实是,这些堆都是用基于树的数据结构实现的。

在 OI 中,最常用的堆是二叉堆,习惯上不加限定提到“堆”时往往也指二叉堆。


评论