今天要來介紹新的結構,堆積(Heap)
Heap 是一棵 Binary Tree,可為空樹,若非空,則:
在系統中常常有這樣的佇列,他並不是 FIFO 的結構,而是會輸出 Priority 最高的元素。例如說:OS 採用 Priority Scheduling Algorithm 的 Ready Queue。
這時候使用 Heap 就特別適合來實作,因為,最大的元素就在 root!
只需要 O(1) 時間就好。
使用 Heap 也可以進行排序,接下來有機會講到排序再說說。
因為 Heap 是 Complete Binary Tree,在前面有說過,使用 array 來儲存可以充分利用空間。
圖示:
假設某樹的 root 為 X,則此樹的 Heapify 的動作為
例如:給予 2 5 7 3 8 6 9 利用 top-down method 來建立
Ans:
時間分析:如果插入 heap 時 i 個 nodes,那麼就要做 log(i) 次的比較,這個 log 是 2 為底,假設目前有 n 個 data 要 insert,那麼總共要 sigma 1~n(log i) 比較 = log1+log2+log3+.......logn = log(n!) = O(nlogn)
因此,top-down method 的 time complexity 為 O(nlogn)
例如:給予 2 5 7 3 8 6 9 利用 bottom-up method 來建立
Ans:
時間分析:
解出這個式子後,得到2^H - 2 - (H - 1) = 2^H - H - 1 次
又因為 heap 為 complete binary tree,數高為 log(n + 1) 向上取整數(ceiling),或是 logn 向下取整(floor)後 + 1(其中 n 為節點總數)。此數趨近 log n,所以將 logn 帶入前式之 H,得到 n - logn - 1 = O(n)
因此,buttom-up method 的 time complexity 為 O(n) 線性時間,因此比 top-down method 更有效率。
heap 是個非常重要的結構,今天先介紹 heap 的操作,明天再來介紹他的程式碼