Unverified Commit f4130cf8 authored by ir1d's avatar ir1d Committed by GitHub
Browse files

update: 修改堆简介(原ouuan撰) (#1333)

update: 修改堆简介(原ouuan撰)
parents 396aff88 b41010fb
Loading
Loading
Loading
Loading
+5 −6
Original line number Diff line number Diff line
# 堆简介

堆是一种数据结构,维护一个数的集合(或者,一个支持比较的元素的集合)
堆是一棵树,其每个节点都有一个键值,且每个节点的键值都大于等于/小于等于其父亲的键值

主要功能有:insert, getmin, deletemin, decreasekey
每个节点的键值都大于等于其父亲键值的堆叫做小根堆,否则叫做大根堆。STL 中的 `priority_queue` 其实就是一个大根堆

注意:简单起见,我们这里讨论的都是维护最小值的堆,也叫小根堆,与之相对的叫做大根堆
(小根)堆主要支持的操作有:插入一个数、查询最小值、删除最小值、合并两个堆、减小一个元素的值

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

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

@@ -21,6 +21,5 @@
| 减小一个元素的值 (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 中,最常用的堆是二叉堆,习惯上不加限定提到“堆”时往往也指二叉堆。