前言
樹是一個比較高級的數據結構,他的應用也有很多,程傑老師的書中舉了一個很典型的應用:赫夫曼編碼。
在計算機和互聯網技術中,文本壓縮是一個非常重要的技術。它除了可以減少文檔在磁盤的空間外,在網絡上以壓縮的形式傳輸數據,使得保存和傳遞都更加高效。
壓縮而不出錯,就是把我們的文本進行重新編碼,以減少不必要的空間。最基本的編碼方法:赫夫曼編碼。
1.赫夫曼樹定義及其原理
我們先看一個例子,試卷分數按百分制再給出五級分製成績,而好的試卷應該讓學生都處於中等或良好的範圍內,如圖:
分數 | 0~59 | 60~69 | 70~79 | 80~89 | 90~100 |
---|---|---|---|---|---|
等級 | A | B | C | D | E |
所佔比例 | 5% | 15% | 40% | 30% | 10% |
下面代碼實現了按百分制再給出五級分製成績的轉換:
if(a < 60)
b = “A”;
else if(a < 70)
b = “B”;
else if(a < 80)
b = “C”;
else if(a < 90)
b = “D”;
else
b = “E”;
但是由於每個等級所佔百分比不同,這樣算效率是有問題的:
把二叉樹簡化成葉子結點帶權的二叉樹(注意這裏的權是什麼)
有沒有好的方法,把這顆二叉樹重新分配:
這樣效率就要高一點了
樹a路徑長度:1+1+2+2+3+3+4+4=20
樹b路徑長度:1+2+3+3+2+1+2+2=16
樹a的WPL:51+152+403+304+104=315
樹b的WPL:53+153+402+302+102=220
判斷比較方式少了三分之一量
2.得出赫夫曼(最優)二叉樹的方法
- 選取兩個權值最小的樹作爲左右子樹構造一顆新的二叉樹,且置新的二叉樹的根節點的權值爲左右子樹權值之和。
- 依次重複
- 圖解:
按權值從大到小排成有序序列:
A5, E10, B15, D30, C40
依次選出最小的兩個:
N115, B15, D30, C40
N230, D30, C40
C40, N360
T100(根結點)
不過現實複雜的多,在這棵樹每個結點都需要兩次比較。當然這不是我們要討論的重點了。
3.赫夫曼編碼:
爲了解決遠距離通信(主要是電報)的數據傳輸的最優化問題
假設只傳輸剛開始幾個字母,出現的頻率(權值)如表:
字母 | A | B | C | D | E | F |
---|---|---|---|---|---|---|
二進制字符 | 000 | 001 | 010 | 011 | 100 | 101 |
頻率 | 27 | 8 | 15 | 15 | 30 | 5 |
下圖左圖爲構造赫夫曼過程的權值顯示,右圖將左權值改爲0,右權值改爲1:
此時,我們對這六個字母從樹根到葉子所經過的路徑的0或1編碼,得到下表:
字母 | A | B | C | D | E | F |
---|---|---|---|---|---|---|
編碼 | 01 | 1001 | 101 | 00 | 11 | 1000 |
這種叫做前綴編碼,任一字母的編碼都不是另一個字符編碼的前綴,很好的解決了網絡傳輸速度的問題。這就是赫夫曼編碼。
後記
以上就是樹的各種儲存結構,喜歡的多多支持哦~