霍夫曼編碼壓縮算法


更多內容請訪問 www.uusystem.com

 
霍夫曼編碼壓縮算法,是數據壓縮中經典的一種算法。這是一種根據文本字符出現的頻率,重新對字符進行編碼,頻率越高的詞,編碼越短,從而達到數據壓縮的效果。
假設我們有這樣的一段數據需要進行編碼——“beep boop beer!”。這段字符通過ASCII編碼后的結果為62 65 65 70 20 62 6F 6F 70 20 62 65 65 72 21 (十六進制),總共有十五個字節。
每天一個算法——霍夫曼編碼壓縮算法
首先,我們先計算每個字符出現的頻率,經過我們統計,得到下面一張表:
 
 
 
然后把這些數放到優先級隊列中,從左到右,頻率逐漸增加。
每天一個算法——霍夫曼編碼壓縮算法
下面我們需要把這個隊列,轉換成霍夫曼二叉樹,這是一個帶有權重的二叉樹,在隊列中每個字符出現的次數,標識這個字符的權重,霍夫曼二叉樹始終保證權重高的在越高的地方。下面來介紹,二叉樹是如何演變的。
我們從最左邊開始,取兩個元素來構造一個二叉樹(第一個元素是左結點,第二個是右結點),並把這兩個元素的權重相加,得到新的空元素。
每天一個算法——霍夫曼編碼壓縮算法
同理,我們繼續取最左邊兩個元素,進行權重相加(2+2=4),相加結果變大,需要對權重進行重新排序。
每天一個算法——霍夫曼編碼壓縮算法
繼續執行同樣的操作,這里可以看到自底向上的構建二叉樹的一個過程。
每天一個算法——霍夫曼編碼壓縮算法
每天一個算法——霍夫曼編碼壓縮算法
最后,我們得到這樣一個帶有權重的二叉樹:
每天一個算法——霍夫曼編碼壓縮算法
這里,我們把這個樹的左邊分支用0編碼,右邊分支用1,這樣我們就可以遍歷這棵二叉樹獲取每個字符的編碼,例如:‘b’的編碼是 00,’p’的編碼是101, ‘r’的編碼是1000。我們可以發現出現次數越多的字符會越在上層,它的編碼也越短,次數少的字符,編碼越長。
每天一個算法——霍夫曼編碼壓縮算法
最后我們可以得到下面這張編碼表:
每天一個算法——霍夫曼編碼壓縮算法
 
利用這個編碼表我們對字符串“beep boop beer!”重新進行編碼,得到:0011 1110 1011 0001 0010 1010 1100 1111 1000 1001。共計40位二進制,而之前沒重新編碼時,是15字節共120位,這樣看來壓縮比例還是比較客觀的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM