筆記 - Huffman Encoding & Minimal Spanning Tree
本篇為 資料結構與演算法 學習筆記,主題為 Tree 的兩種應用。
Huffman Encoding
Concepts
- 常用在資料壓縮的演算法(Lossless compression)
- 出現次數多的字母 => 用較少的bits儲存他;
出現次數較少的字母 => 用較多的bits儲存他
Huffman Tree
從次數較少開始,相加變成parent node
插入並維持sorted狀態
Compression
- 讀取檔案,計算字母出現的頻率
- 頻率數字排序
- 將頻率數字做成Huffman Tree (可使用PQ)
- 左邊edge放0, 右邊edge放1,得到節點的encode
- 再次讀取檔案,將字母換成Huffman encodes
Decompression
- Huffman code與其對照的字母,對應關係儲存在hash table中
- 讀取壓縮的檔案內容,將每個byte轉成8 bits儲存在bitArray中
- 讀取bitArray,使用left and right algorism將encode轉換回字母
Minimal Spanning Tree
Concepts
- Spanning tree: 將一個graph移除某些edges,保持原來的nodes,使其形成一個tree,此時tree稱之為spanning tree
- Spanning tree是原本的graph的子集合(subset),包含原本的所有nodes都有連結在一起。一個graph可能會有好幾種可能的spanning tree。
- Minimal spanning tree(MST, 最小生成樹):指將所有edge的weight加起來最小的spanning tree。
Prim’s Algorithm
找出MST的演算法
- 可以從任意node開始,最後都會找到一樣的MST
- 紀錄已經拜訪過的nodes => 紀錄此node是否被拜訪過
- 紀錄要放進MST的edges(做成MST edge list - array)
- 找出:weight最小,且不會形成loop的edge(當edge兩端nodes都是拜訪過的,就會形成loop)
- 當所有smallest edges都會形成loop時結束
Code前要先做出graph,再寫出Prim’s AL找出MST
Kruskal’s Algorithm
也是找出MST的演算法,與Prim’s algorithm同樣被歸類為”Greedy Algorithm”
- 列出所有edges
- 從weight最小的開始,排除會形成loop的edge,放入MST edge list中
會得到相同的MST。時間複雜度O(n logn)
Application of MST
- 線路路網設計,街道為edges,十字路口為nodes。MST找出最小佈線成本。
- IC板設計