一个序列 如果对于
满足
,则它形成一个(二叉)堆,其中
是向下取整函数,这等价于对于
,
和
。因此,第一个元素必须是最小的。堆可以被看作是一个带标签的二叉树,其中第 i 个节点的标签小于其任何后代节点的标签(Skiena 1990, p. 35)。堆支持任意插入和在每次更新中以
时间查找/删除最小值 (Skiena 1990, p. 38)。
一个列表可以使用 Floyd (1964) 的算法在 时间内转换为堆。例如,给定随机排列
,Floyd 算法给出堆
(左图)。右图显示了一个包含 30 个元素的堆。
堆 | |
1 | |
2 | |
3 | |
4 |
在 , 2, ... 个元素上的堆的数量
是 1, 1, 2, 3, 8, 20, 80, 210, 896, 3360, ... (OEIS A056971),其中前几个在上面的表格中进行了总结。
的公式由下式给出
(1)
|
其中 ,
,并且
(2)
| |||
(3)
| |||
(4)
| |||
(5)
| |||
(6)
|
层堆的数量(或等效地,
个元素的堆的数量)由递推关系给出
(7)
|
其中 (Skiena 1990, p. 36)。这可以写成乘积形式为
(8)
|
其对于 , 2, ... 的值是 1, 2, 80, 21964800, 74836825861835980800000, ... (OEIS A056972)。