什么是堆?

根据定义,堆是一种支持堆属性的专用树形数据结构。堆属性的定义是,堆结构的根节点要么比子节点小,要么比子节点大。如果父节点大于子节点,则称为最大堆;如果父节点小于子节点,则称为最小堆。

下图显示了 max-heap 的示例:

image 2023 11 08 19 59 45 756

如果我们查看根节点,100 的值大于 19 和 36 这两个子节点。同样,19 的值大于 17 和 3。对 36 和 17 也适用同样的规则。从树状结构中我们可以看出,这棵树并不是完全排序或有序的。但重要的是,我们总能在树的根部找到最大值或最小值,这对许多用例来说都是非常有效的。

堆结构有很多种,如二进制堆、b-堆、斐波纳契堆、三元堆、treap、弱堆等。二进制堆是最流行的堆实现方式之一。二叉堆是一棵完整的二叉树,树的所有内层都被完全填满。最后一级可以完全填满,也可以部分填满。由于我们考虑的是二叉堆,因此可以在对数时间内执行大部分操作。在本书中,我们将重点讨论二进制堆的实现和操作。