主题
Search


一个序列 {a_n}_(n=1)^N 如果对于 2<=j<=N 满足 a_(|_j/2_|)<=a_j,则它形成一个(二叉)堆,其中 |_x_|向下取整函数,这等价于对于 1<=i<=(N-1)/2a_i<a_(2i)a_i<a_(2i+1)。因此,第一个元素必须是最小的。堆可以被看作是一个带标签的二叉树,其中第 i 个节点的标签小于其任何后代节点的标签(Skiena 1990, p. 35)。堆支持任意插入和在每次更新中以 O(lnn) 时间查找/删除最小值 (Skiena 1990, p. 38)。

Heaps

一个列表可以使用 Floyd (1964) 的算法在 O(n) 时间内转换为堆。例如,给定随机排列 {6,2,7,9,5,3,4,8,10,1},Floyd 算法给出堆 {1,2,3,8,5,7,4,9,10,6}(左图)。右图显示了一个包含 30 个元素的堆。

n
1{1}
2{1, 2}
3{1, 2, 3}, {1, 3, 2}
4{1, 2, 3, 4}, {1, 2, 4, 3}, {1, 3, 2, 4}

n=1, 2, ... 个元素上的堆的数量 a(n) 是 1, 1, 2, 3, 8, 20, 80, 210, 896, 3360, ... (OEIS A056971),其中前几个在上面的表格中进行了总结。a(n) 的公式由下式给出

 a(n)=(n-1; b+r_1)a(b+r_1)a(b+r_2)
(1)

其中 a(0)=0a(1)=1,并且

h=|_log_2(n+1)_|-1
(2)
b=2^h-1
(3)
r=n-1-2b
(4)
r_1=r-|_r/(2^h)_|(r-2^h)
(5)
r_2=r-r_1.
(6)

l 层堆的数量(或等效地,2^l-1 个元素的堆的数量)由递推关系给出

 S_l=(2^l-2; 2^(l-1)-1)S_(l-1)^2
(7)

其中 S_1=1 (Skiena 1990, p. 36)。这可以写成乘积形式为

 S_l=((2^l-1)!)/(product_(k=1)^(n)(2^k-1)^(2^(n-k))),
(8)

其对于 l=1, 2, ... 的值是 1, 2, 80, 21964800, 74836825861835980800000, ... (OEIS A056972)。


另请参阅

二叉树, 完全二叉树, 堆排序, 优先级队列

使用 Wolfram|Alpha 探索

参考文献

Floyd, R. W. "Algorithm 245: Treesort 3." Comm. ACM 7, 701, 1964.Knuth, D. E. 计算机程序设计艺术,第 3 卷:排序和搜索,第 2 版。 阅读,马萨诸塞州:Addison-Wesley,1998 年。Skiena, S. "Heaps." §1.4.4 in 使用 Mathematica 实现离散数学:组合数学和图论。 阅读,马萨诸塞州:Addison-Wesley,pp. 35-39, 1990.Skiena, S. S. "Heaps." §1.4.4 in 算法设计手册。 纽约:Springer-Verlag,pp. 35-39, 1997.Sloane, N. J. A. “整数序列在线百科全书”中的序列 A056971A056972

在 Wolfram|Alpha 上被引用

请引用为

Weisstein, Eric W. “堆。” 来自 MathWorld—Wolfram Web 资源。 https://mathworld.net.cn/Heap.html

主题分类