(二元)堆積可以被視為 nearly complete binary tree
complete binary tree
各層節點全滿,除了最後一層,最後一層節點全部靠左。
一顆二元樹需要滿足 heap-property 才能被稱為堆積。
堆積樹節點的 height,是從該節點到 leaf node 的最長簡單路徑的邊數。一個有 個元素的 heap 高度 。
heap 的基本操作:
6.1-1
在高度為 的堆積中的元素數量,最少有幾個元素?最多有幾個元素?
最多會有 個元素,最少會有 。
所以高度為 的二元堆積樹中,最少會有 個節點,最多會有
6.1-2
證明包含 個元素的堆積的高度是
由上一題證明得出高度為 的二元堆積樹至少需要 個元素最多需要 。對兩數字取 可以得到 與很接近 的數字,因此如果一個二元堆積樹有 個元素,其高為 。
6.1-3
證明最大堆積的任何子樹的根的值,比那顆子樹的任何其他值都要大。
max heap 需要滿足 max-heap property,也就是每一個非根節點的值會小於等於父節點的值。因此對於每一個子樹,其根節點的子節點的值皆會小於根節點的值,其他節點也滿足 max-heap property。
6.1-4
最大堆積中,最小的元素可能在哪裡?假設所有元素都不同。
由於 max-heap 會滿足 max-heap properity,因此最小的值會在高度 h 的 leaf node 之中。
6.1-5
在最大堆積裡,第 大的元素可能在哪一層?設 ,且所有元素都不一樣。
假設 ,同時取 會是 。
所以第 大的元素會在第 層。
6.1-6
已排序的陣列是最小堆積嗎?
是
6.1-7
值為 的陣列會是最大堆積嗎?
6.1-8
證明:在 個元素的堆積的陣列表示法中,葉節點的索引是 。
葉節點會在二元堆積數的最後一層,假設樹有 層,第一個葉節點會從 開始,會在 結束。
MAX-HEAPIFY 會使 root node 索引為 i 的子樹符合 max-heap properity 。
BUILD-MAX-HEAP(A, n) 1L = LEFT(i) 2R = RIGHT(i) 3if l ≤ A.heap-size and A[r] > A[i] 4 largest = l 5else largest = i 6if r ≤ A.heap-size and A[r] > A[largest] 7 largset = r 8if largset ≠ i 9 exchange A[i] with A[largest] 10 MAX-HEAPIFY(A, largst)
i 節點的子樹大小不超過 2n/3
6.2-1
6.2-2
6.2-3
6.2-4
6.2-5
6.2-6
6.2-7
都是 leaf node,
BUILD-MAX-HEAP(A, n) 1A.heap-size = n 2for i = floor(n/2) down to 1 3 MAX-HEAPIFY(A, i)
HEAPSORT(A, n) 1for i = n down to 2 2 swap(A[l], A[i]) 3 A.heap-size = A.heap-size - 1 4 MAX-HEAPIFY(A, 1)