--- title: 'Extended Binary Tree' disqus: hackmd --- [TOC] ## Extended Binary Tree - 延伸二元樹 * 在一般的 Binary Tree 中 Leaf 的 Link 為 Null,而我們將指向 Null 改成指向一種 Node 稱做: 1. 紅色 Node:External Node ( Failure Node ) 外部節點 (失敗節點) 3. 藍色 Node:內部節點 (Internal Node) * 另一版本定義 External Node = Leaf,Internal Node = Non-Leaf ```graphviz graph graphname{ 1 [label="1" color=blue] 2 [label="2" color=blue] 3 [label="3" color=blue] 4 [label="4" shape=s style=dashed color=red] 5 [label="5" shape=s style=dashed color=red] 6 [label="6" shape=s style=dashed color=red] 7 [label="7" shape=s style=dashed color=red] 1--2 1--3 2--4 [style=dashed] 2--5 [style=dashed] 3--6 [style=dashed] 3--7 [style=dashed] } ``` * 在 Binary Tree 中有談到 N 個 Nodes 則擁有 N+1 條的 Link 指向 Null 同理,此時我們將會有 N+1 個 External Node = 3+1 = 4 ```graphviz graph graphname{ 1 [label="1"] 2 [label="2"] 3 [label="3"] 4 [label="4" shape=s style=dashed] 5 [label="5" shape=s style=dashed] 6 [label="6" shape=s style=dashed] 7 [label="7" shape=s style=dashed] 1--2 1--3 2--4 [style=dashed color=red] 2--5 [style=dashed color=red] 3--6 [style=dashed color=red] 3--7 [style=dashed color=red] } ``` --- ### Internal Path Length - 內部路徑長 * Root 到最後一個 Internal Node 的長度,每個 Node 都需要計算一次 * 藍線部分: * Node 1->2 = 1 * Node 1->3 = 1 * Node 1->4 = 2 * Internal Path Length = 1 + 1 + 2 = 4 ```graphviz graph graphname{ 1 [label="1"] 2 [label="2"] 3 [label="3"] 4 [label="4"] 5 [label="5" shape=s style=dashed] 6 [label="6" shape=s style=dashed] 7 [label="7" shape=s style=dashed] 8 [label="8" shape=s style=dashed] 9 [label="9" shape=s style=dashed] 1--2 [color=blue] 1--3 [color=blue] 2--4 [color=blue] 2--5 [style=dashed ] 3--6 [style=dashed ] 3--7 [style=dashed ] 4--8 [style=dashed ] 4--9 [style=dashed ] } ``` --- ### External Path Length - 外部路徑長 * Root 到 External Node 的長度,每個 Node 都需要計算一次並取最長的 Path Length * 紅線部分: * Node 1->8 = 3 * Node 1->9 = 3 * Node 1->5 = 2 * Node 1->6 = 2 * Node 1->7 = 2 * External Path Length = 3 + 3 + 2 + 2 + 2 = 12 ```graphviz graph graphname{ 1 [label="1"] 2 [label="2"] 3 [label="3"] 4 [label="4"] 5 [label="5" shape=s style=dashed] 6 [label="6" shape=s style=dashed] 7 [label="7" shape=s style=dashed] 8 [label="8" shape=s style=dashed] 9 [label="9" shape=s style=dashed] 1--2 [color=red] 1--3 [color=red] 2--4 [color=red] 2--5 [style=dashed color=red] 3--6 [style=dashed color=red] 3--7 [style=dashed color=red] 4--8 [style=dashed color=red] 4--9 [style=dashed color=red] } ``` --- ### 定理:E = I + 2N * 外部長 $=$ 內部長 $+\ 2\ *$ 內部節點 :::success Proof:數學歸納法 ::: --- ### Skewed Extended Binary Tree * 公式:內部路徑長 = 0 + 1 + 2 + ... + (n-1) = $\dfrac{n(n-1)}{2}$ * 根據 E = I + 2N = $\dfrac{n(n-1)}{2}+2n=\dfrac{n(n+3)}{2}$ --- ## Weighted External Path Length (WEPL) - 加權外部路徑長 * 將各 External Path Length * 相對應的 External Node 之加權值即可 * 當有加權值存在,高度愈小 WEPL 不一定愈小 --- ### Minimum Weighted External Path Length (MWEPL) - 最小加權外部路徑長 * n 個 nodes 的 BT 中尋找哪一顆樹具有最小值 * 根據 Binary Tree 定義,n 個 Nodes ( 相當於 Internal Node ) 之相異結構 BT = $\dfrac{1}{n+1}$ $\left(\begin{array}{ccc}2n \\n\\\end{array}\right)$ * 若題目給 n 個 External Node 則只有 n-1 個 Internal Node 公式為:$\dfrac{1}{n}$ $\left(\begin{array}{ccc}2(n-1) \\n-1\\\end{array}\right)$ * 求出最佳(小)的 WEPL 方法: 1. 暴力法 2. **Huffman Algo.** 3. Dynamic Programming --- ## Huffman Algo. - 霍夫曼編碼 * 依照加權值畫成 Huffman Tree ,步驟如下 1. 將加權值設於一集合中 2. 依序將最小的兩值取出 3. 將兩值相加之值取代原本兩值並放進集合 4. 重複 2. 3. 直到集合值剩下一個 <br><br> * 例:一加權集合 { $2, 3, 5, 7, 9, 11$ },取出 2 , 3 ```graphviz graph graphname{ 2[shape=s style=dashed] 3[shape=s style=dashed] } ``` * 2 + 3 = 5 ,將相加後的值繪成內部節點 ```graphviz graph graphname{ 2[shape=s style=dashed] 3[shape=s style=dashed] 5--2 5--3 } ``` * 刪除 2 , 3 將 5 放入集合 { $5 , 5, 7, 9, 11$ } ```graphviz graph graphname{ 2[shape=s style=dashed] 3[shape=s style=dashed] 5--2 5--3 } ``` * 取出 5 , 5 (第一個 5 的樹繼續使用,與新的 5 合併) ```graphviz graph graphname{ 0[label="5" shape=s style=dashed] 2[shape=s style=dashed] 3[shape=s style=dashed] 5--2 5--3 } ``` * 5 + 5 = 10 ,將 10 繪成內部節點,刪除 5 , 5 將 10 放入集合 { $10, 7, 9, 11$ } ```graphviz graph graphname{ 0[label="5" shape=s style=dashed] 2[shape=s style=dashed] 3[shape=s style=dashed] 5--2 5--3 10--0 10--5 } ``` * 取出 7 , 9 相加、並刪除 7 , 9 將 16 放入集合 { $10, 16, 11$ } ```graphviz graph graphname{ 7[label="7" shape=s style=dashed] 9[label="9" shape=s style=dashed] 16--7 16--9 } ``` * 取出 10 , 11 相加、並刪除 10 , 11 將 21 放入集合 { $16, 21$ } ```graphviz graph graphname{ 0[label="5" shape=s style=dashed] 2[shape=s style=dashed] 3[shape=s style=dashed] 11[label="11" shape=s style=dashed] 5--2 5--3 10--0 10--5 21--10 21--11 } ``` * 最後兩元素 { $16, 21$ } 取出相加即完成 * 最佳 WEPL:$2*11 + 3*5 + 4*2 + 4*3 + 2*7 + 2*9=89$ ```graphviz graph graphname{ 0[label="5" shape=s style=dashed] 2[shape=s style=dashed] 3[shape=s style=dashed] 11[label="11" shape=s style=dashed] 7[label="7" shape=s style=dashed] 9[label="9" shape=s style=dashed] 5--2 5--3 10--0 10--5 21--10 21--11 16--7 16--9 37--16 37--21 } ``` :::warning **Time Complexity:** 使用 Min-Heap 維持加權值,插入 = 刪除 = n(log~2~n) 總共 n-1 回合 -> **n(nlog~2~n)** ::: --- ## 應用 * N 個回合最佳合併方式 (Merge Sort) * N 個 Messages 編碼/解碼 之最佳方法 1. 為訊息 2. 依照個字母出現的次數依序給出他的權重,或也可以將次數改成頻率 * 編碼方式:建立完 Tree 後將 Left Child 填上 0,Right Child 填上 1 ![](http://upload.wikimedia.org/wikipedia/commons/thumb/a/a0/Huffman_coding_visualisation.svg/720px-Huffman_coding_visualisation.svg.png) * 此種方式為 Optimal Prefix Code,是 Unique 的 ###### tags: `Data Structure`