世間熙熙,皆為利來,世間攘攘,皆為利往。人為什麼一生擺脫不了名利二字?
赫夫曼樹:帶權的路徑長度(WPL)最小的二叉樹稱為赫夫曼樹。
權:樹結點間的邊相關的數。
路徑長度:從樹中的一個結點到另一個節點之間的分支構成兩個結點之間的路徑,路徑的分支數目稱為路徑的長度。
樹的路徑長度:從樹根到每一個節點的路徑長度之和
帶權路徑長度:從該結點到樹根之間的路徑長度與結點上權的乘積。
樹的帶權路徑長度:樹中所有葉子節點的帶權路徑長度之和。如下:
此樹的帶權路徑長度WPL = 5*3 + 15*3 + 40*2 + 30*2 + 10*2 = 220
那麼問題來了,怎樣構造一棵最優的赫夫曼樹那?具體的方法如下:
1、將有權值得葉子結點按照從大到小的順序進行排列。(A5 E10 B15 D30 C40)
2、取前兩個較小的葉子結點,最小的為左孩子,次小的為右孩子重新構造一棵二叉樹,根結點為N1,算出根結點權值,替換有序排列中的兩個葉子結點,重新排列(注意按照權值大小進行從大到小排列)
3、排列生成的樹也是權值小的為左孩子,權值大的為右孩子。
赫夫曼編碼:一般的,設需要編碼的字符集為{d1,d2,...,dn},各個字元在電文中出現的次數或者頻率集合為{w1,w2,...,wn},以d1,d2,...dn作為葉子結點,以w1,w2,...,wn作為相應葉子結點的權值來構造一棵赫夫曼樹。規定赫夫曼樹的左支代表0,右支代表1,則從根結點到葉子結點所經過的路徑分支組成的0和1的序列便為該結點對應字元的編碼,這就是赫夫曼編碼。
利用赫夫曼編碼實現資料的壓縮和解壓:
原理:利用哈夫曼樹對檔案中的字元進行重新編碼,也就是根據檔案中出現的所有字元的頻率來建立哈夫曼樹,然後生成哈夫曼編碼來對檔案中的所有字元進行重新編碼,使檔案中出現頻率高的字元的編碼變短,從而實現檔案的壓縮儲存。相應的,解壓過程也就是對檔案按照哈夫曼編碼的譯碼過程。
實現資料壓縮和解壓程式碼實現:
MyZipApplication.cpp: