2.8.11 - Leftest Heap

合併2個Priority Queue(Heap)成一個Priority Queue時間複雜度為O(logn),比Heap的O(n)較快。

1. 定義

x為extended binary tree的ㄧ節點。

  • shortest(x): x到任一外部節點的最短路徑

shortest(x)={0x is an external node1+min{shortest(x的左子點)shortest(x的左子點)x is an internal oddshortest(x)= \begin{cases} 0 & x \text{ is an external node}\\ 1+\min \begin{cases} shortest(x的左子點) &\\ shortest(x的左子點) &\\ \end{cases} & x \text{ is an internal odd} \end{cases}

  • Leftest Tree: 每一個內部節點的shortest(左子點) ≥ shortest(右子點)

  • Leftest Heap: 是一個Leftest Tree且父點 ≤ 子點

圖示:

2. 運作

2.1 Merge(H1, H2)

  1. 比較H1與H2的root大小,找出最小的root作為新的root

  2. (假設H1的root較小),H1的root作為新的root,且H1的左子樹保留成新的root的左子樹

  3. Merge(H1右子樹, H2),直到變成一棵min tree(子>父)

  4. 檢查是否符合leftest heap性質(shortest(x的左子點)>shortest(x的右子點)),作違反則左右交換node。

2.2 Delete x in a leftest heap

  1. 將min從root取出,得到兩個子樹H1, H2

  2. Merge(H1, H2)

2.3 Insert x in a leftest tree

  1. x視為H2

  2. Merge(H1, H2)

Last updated