現在,我們經常會使用壓縮和解壓縮軟體來處理文件,因為它除了可以減少文件在磁碟上的空間外,還有重要的一點,就是我們可以在網路上一壓縮的形式傳輸大量資料,是的儲存和傳遞都更加高效。
那麼壓縮而不出錯是如何做到的呢?簡單說,就是把我們要壓縮的文字進行重新編碼,今天我們就介紹一種最基本的壓縮編碼方法——哈夫曼編碼。
在介紹哈夫曼編碼之前,我們必須的介紹哈夫曼 樹,首先,我們來看乙個例子:
現在,有的課程,老師通常會按照以下方法,將學生的成績將其分為不及格,及格,中等,良好和優秀這樣的等級。
但是,如果在實際生活中,學生的成績在5個等級上的分布規律如下:
那麼70分以上約佔總數80%的成績都需要經過3次以上的判斷才可以得到結果,這顯然不合理。
如是,我們根據上面的比例對這顆二叉樹進行重新分配,改成如下結果:
效率應該更高一些,但是到底高多少,以及這顆二叉樹是如何設計的,我們來看看這個過程,也就是哈夫曼樹的構造過程。
哈夫曼樹定義與原理
我們先把上面兩棵樹簡化成葉子結點帶權的二叉樹,如下圖所示,其中a表示不及格,b表示及格,c表示中等,d表示良好,e表示優秀。
那麼,從上圖我們可以得到幾個概念:
(1)路徑長度:從樹中乙個結點到另乙個結點之間的分支構成兩個結點之間的路徑,路徑上的分支數目稱作路徑長度,例如二叉樹a中,根節點到結點d的路徑長度為4.
(2)樹的路徑長度:指從樹根到每乙個結點的路徑長度之和。例如二叉樹a的路徑長度就是1+1+2+2+3+3+4+4=20.
(3)帶權路徑長度:結點的帶權路徑長度為從該節點到樹根之間的路徑長度與結點上權的乘積。
(4)樹的帶權路徑長度:樹中所有葉子結點的帶權路徑長度之和,例如二叉樹a的帶權路徑長度為:5*1+15*2+40*3+30*4+10*4=315.
(5)哈夫曼樹:指帶權路徑長度最小的二叉樹為哈夫曼樹。
哈夫曼樹的構造過程及演算法如下:
因此,上述成績的哈夫曼樹的構造過程為下:
哈夫曼編碼
如果我們想要有一段文字內容「badcadfeed」,通過網路傳輸給別人,顯然用二進位制的數字(0和1)來表示是很自然的想法,因此,我們可以用相應的二進位制資料表示:
那麼要傳輸的資料編碼以後為「0010000011010000011101100100011」,共30個字元。
但是,在英文中每個字母出現的頻率是不一樣的,例如「a e i o u」幾個母音字母出現頻率很高,那麼我們完全可是使用哈夫曼樹來重新規劃他們,假如六個字母出現的頻率為a 27,b 8,c 15,d 15,e 30, f 5.那麼我們可以構造如下的哈夫曼樹:
在上圖中,我們將權值左分支改為0,右分支改為1。得到如下的哈夫曼樹:
我們對這六個字母用其從樹根到葉子所經過的路徑的0和1來編碼,可以得到如下所示的定義:
我們對「badcadfeed」再次編碼為「1001010010101001000111100」,共17個字元,因此節約了17%的傳輸成本。
資料結構 哈夫曼樹 哈夫曼編碼
哈夫曼樹又稱最優樹 二叉樹 是一類帶權路徑最短的樹。構造這種樹的演算法最早是由哈夫曼 huffman 1952年提出,這種樹在資訊檢索中很有用。結點之間的路徑長度 從乙個結點到另乙個結點之間的分支數目。樹的路徑長度 從樹的根到樹中每乙個結點的路徑長度之和。結點的帶權路徑長度 從該結點到樹根之間的路徑...
哈夫曼編碼 哈夫曼樹 (資料結構)
哈夫曼編碼,又稱霍夫曼編碼,是一種編碼方式,哈夫曼編碼是可變字長編碼 vlc 的一種。huffman於1952年提出一種編碼方法,該方法完全依據字元出現概率來構造異字頭的平均長度最短的碼字,有時稱之為最佳編碼,一般就叫做huffman編碼 有時也稱為霍夫曼編碼 include include inc...
資料結構之哈夫曼樹及哈夫曼編碼
當樹中的節點被賦予乙個表示某種意義的數值,我們稱之為該節點的權。從樹的根節點到任意節點的路徑長度 經過的邊數 與該節點上權值的乘積稱為該節點的帶權路徑長度。樹中所有葉節點的帶權路徑長度之和稱為該樹的帶權路徑長度 wpl 當帶權路徑長度最小的二叉樹被稱為哈夫曼樹,也成為最優二叉樹。如下圖所示,有三課二...