主題
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)。


另請參閱

二叉樹, 完全二叉樹, 堆排序, 優先順序佇列

使用 探索

參考文獻

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

在 上被引用

請引用為

Weisstein, Eric W. “堆。” 來自 — 資源。 https://mathworld.tw/Heap.html

主題分類