一、基本介紹
霍夫曼樹,也稱為最優二叉樹,是一種帶權路徑長度最短的樹。通過霍夫曼樹,可以將一組權值集合變成一組二進位編碼,從而實現數據壓縮,特別適用於高頻字元的編碼。霍夫曼樹的構建演算法是通過貪心策略來實現的。
二、構建過程
構建霍夫曼樹的基本思想是:每次選擇權值最小的兩個節點,進行連通並構造新的內部節點,直到所有節點都連通在一棵樹上。
具體構建過程如下:
// 定義節點結構體 struct TreeNode { int weight; int parent, left_child, right_child; }; // 構建霍夫曼樹 vector HuffmanTree(const vector& weights) { // 初始化節點 vector nodes(weights.size() * 2); for (int i = 0; i < weights.size(); ++i) { nodes[i].weight = weights[i]; } // 構建霍夫曼樹 for (int i = weights.size(); i < weights.size() * 2 - 1; ++i) { // 找到權值最小的兩個節點 int min1, min2; int j; for (j = 0; j < i; ++j) { if (nodes[j].parent == -1) { min1 = j; break; } } for (++j; j < i; ++j) { if (nodes[j].parent == -1 && nodes[j].weight < nodes[min1].weight) { min2 = min1; min1 = j; } else if (nodes[j].parent == -1 && nodes[j].weight < nodes[min2].weight) { min2 = j; } } // 合併兩個節點 nodes[min1].parent = i; nodes[min2].parent = i; nodes[i].left_child = min1; nodes[i].right_child = min2; nodes[i].weight = nodes[min1].weight + nodes[min2].weight; } return nodes; }
三、編碼過程
霍夫曼樹的編碼過程是通過從根節點到葉子節點的路徑來實現的。為了得到最小的碼長,需要使頻率高的字元獲得盡量短的編碼。
具體編碼過程如下:
// 編碼過程 unordered_map HuffmanCode(const vector& nodes) { unordered_map codes; for (int i = 0; i < nodes.size() / 2; ++i) { int j = i; string code; while (nodes[j].parent != -1) { if (nodes[nodes[j].parent].left_child == j) { code.insert(0, "0"); } else { code.insert(0, "1"); } j = nodes[j].parent; } codes[i] = code; } return codes; }
四、實例分析
假設有如下8個字元組成的字元串及它們的頻率:
A: 5, B: 2, C: 10, D: 7, E: 4, F: 20, G: 3, H: 1
通過霍夫曼樹的構建和編碼過程,得到的編碼結果如下:
A: 111, B: 0101, C: 0, D: 11, E: 011, F: 00, G: 0100, H: 01001
五、使用場景
霍夫曼樹是一種可用於數據壓縮、加密傳輸數據以及數據存儲等領域的演算法。它可以通過將文字變成二進位編碼的方式來實現高效地數據傳輸和儲存,以及數據安全性保障。
原創文章,作者:KSIFR,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/331918.html