Huffman演算法
Huffman演算法是一種用來構造最優字首碼(Huffman編碼)的貪心演算法。Huffman編碼是一種被廣泛應用而且有效的資料壓縮技術,它主要針對字元檔案的壓縮。
Huffman演算法可能產生具有不同編碼的最優字首碼,這句話需要這麼理解:最優字首碼之所以稱為最優是因為它的代價是最小的,但是具有最小代價的編碼可能不止一種,而Huffman演算法恰恰可以產生多種形式的最優字首碼(代價是相同的)。
Huffman(C)
/* C是待編碼的字符集合,|C|=n,對於任意c∈C,c在檔案中的出現頻度為f(c)。Q是一個最小優先順序佇列。Q在具體實現時可以考慮採用最小二叉堆。
該演算法自底向上地構造一棵最優字首碼所對應的樹T*/
n ← |C|
Q ← C
for i ← 1 to n-1
do
allocate a new node z
left[z] ← x ← Extract-Min(Q)
right[z] ← y ← Extract-Min(Q)
f[z] ← f[x] + f[y]
Insert(Q, z)
return Extract-Min(Q) // return the root of the tree
上面過程所產生的樹稱為Huffman樹,它是一棵滿樹(樹中的每個非葉結點都有兩個子結點),滿樹也是最優編碼的充分條件。非葉結點的左枝上編碼0,右枝編碼1,每個葉子結點的編碼是從根結點到該葉子結點的枝上的0、1串構成。
新節點z以x和y分別作為其左右子結點,由於左右的次序是任意的,因而Huffman演算法得到的最優字首碼不唯一。Huffman演算法的時間複雜度為O(n)。
Huffman演算法為什麼屬於貪心演算法?
Huffman樹的構建過程實際上是對最小頻度的字元的貪心選擇上進行的,具有|C|個字元的字符集需要執行|C-1|次合併得到Huffman樹,每次合併的時候選擇最小頻度的兩個葉結點(包括合併後新產生的結點),而若用頻度表示代價,則在每一步所有可能的合併中,Huffman總是選擇一個代價最小的合併,此即為貪心。
相關文章
- 【資料結構與演算法】Huffman樹&&Huffman編碼(附完整原始碼)資料結構演算法原始碼
- 貪心演算法——Huffman 壓縮編碼的實現演算法
- 05-樹9 Huffman Codes
- Huffman Tree (use priority queue) in C++C++
- Huffman編碼m檔案分析
- Huffman對檔案編碼和解碼
- 用 Huffman 樹實現檔案壓縮並解壓
- SICP:符號求導、集合表示和Huffman樹(Python實現)符號求導Python
- 用優先佇列構造Huffman Tree及判斷是否為最優編碼的應用佇列
- 【演算法】KMP演算法演算法KMP
- 演算法-回溯演算法演算法
- 【JAVA演算法】圖論演算法 -- Dijkstra演算法Java演算法圖論
- 演算法(2)KMP演算法演算法KMP
- 【演算法】遞迴演算法演算法遞迴
- 演算法題:洗牌演算法演算法
- [演算法之回溯演算法]演算法
- Manacher演算法、KMP演算法演算法KMP
- 【演算法】KMP演算法解析演算法KMP
- 介面限流演算法:漏桶演算法&令牌桶演算法演算法
- 前端演算法:快速排序演算法前端演算法排序
- 演算法初探--遞迴演算法演算法遞迴
- BP演算法和LMBP演算法演算法
- 隨機演算法 概率演算法隨機演算法
- STL::演算法::常見演算法演算法
- 常用演算法 插值演算法演算法
- 前向分步演算法 && AdaBoost演算法 && 提升樹(GBDT)演算法 && XGBoost演算法演算法
- c/c++ 通用的(泛型)演算法 之 只讀演算法,寫演算法,排序演算法C++泛型演算法排序
- 介面限流演算法:漏桶演算法&令牌桶演算法&redis限流演算法Redis
- 什麼是演算法?如何學習演算法?演算法入門演算法
- 演算法金 | 突破最強演算法模型,決策樹演算法!!演算法模型
- 分類演算法-AdaBoot 演算法演算法boot
- 演算法(八):圖解KNN演算法演算法圖解KNN
- 演算法那些事之冒泡演算法演算法
- 基礎演算法之排序演算法演算法排序
- 最短路-SPFA演算法&Floyd演算法演算法
- 複習常用演算法_冒泡演算法演算法
- 常用演算法之貪心演算法演算法
- 演算法修養--A*尋路演算法演算法