iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 17
0
自我挑戰組

資料結構大便當系列 第 17

[Day 17] Heaps III

這應該是最後一天寫 Heap
從 buildMaxHeap 到 HeapSort
明天就會從更複雜(?)的樹開始繼續往下


buildMaxHeap

從一組給定的數組建構 Max Heap,並從昨天的 maxHeapify 程式,建構一個 nearly complete binary tree

buildMaxHeap(A, N){
    for(i =parent(N − 1); i ≥ 0; i--){
        maxHeapify(A, N, i);
    }
}

https://ithelp.ithome.com.tw/upload/images/20190929/20120250xqX9m6KP7x.png
https://ithelp.ithome.com.tw/upload/images/20190929/20120250bdYZdFtgBx.png
https://ithelp.ithome.com.tw/upload/images/20190929/201202508U8sV6VA8Z.png
經過好幾次的對調之後,便完成 buildMaxHeap 的工作


時間複雜度

buildMaxHeap 的時間複雜度為 O(n),n 表示 Array 中有幾個元素

首先,假設 Heap 高度為 h,如圖:
https://ithelp.ithome.com.tw/upload/images/20190929/20120250Io57IcVu7w.png
N = 2^(h+1) - 1

  • 最底層共 (N+1)/2 的葉子並不需要進行 maxHeapify
  • 倒數第二層每次交換最少需要進行一次的 swap,共 (N+1)/4 × 1 個 swap
    https://ithelp.ithome.com.tw/upload/images/20190929/20120250qLHmiG4p8R.png
  • 再更往上一層每次交換最少需要進行兩次的 swap,共需要 (N+1)/8 × 2 個 swap
  • 再更往上一層每次交換最少需要進行三次的 swap,共需要 (N+1)/16 × 3 個 swap
  • 到 root 時,共需 1 × h swaps

經過上面的步驟:(N+1)/4 × 1 -> (N+1)/8 × 2 -> (N+1)/16 × 3 -> ... -> lg(N+1) - 1
此時:
https://ithelp.ithome.com.tw/upload/images/20190929/20120250teBt51ofdb.png


heapSort

heapSort 的中心思維就是一直從 heap 中取出最大值,直到 heap 為空

heapSort(A, N){
    buildMaxHeap(A, N);
    for(i = N − 1; i ≥ 0; i − −){
    
        // 將最大值放入 array 尾端
        Exchange A[0] and A[i];
        
        // heap 的 size 減少 1
        maxHeapify(A, --N, 0);
    }
}

https://ithelp.ithome.com.tw/upload/images/20190929/20120250gTglsnvq07.png
https://ithelp.ithome.com.tw/upload/images/20190929/20120250W88RFYTZxW.png
https://ithelp.ithome.com.tw/upload/images/20190929/20120250mWQguQoEja.png
https://ithelp.ithome.com.tw/upload/images/20190929/20120250IctGAsEKFj.png

Source: 我們教授ㄉ講義,推推!


上一篇
[Day 16] Heaps II
下一篇
[Day 18] Graphs Basic
系列文
資料結構大便當30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言