數據結構之樹的應用——赫夫曼編碼

前言

樹是一個比較高級的數據結構,他的應用也有很多,程傑老師的書中舉了一個很典型的應用:赫夫曼編碼。
在計算機和互聯網技術中,文本壓縮是一個非常重要的技術。它除了可以減少文檔在磁盤的空間外,在網絡上以壓縮的形式傳輸數據,使得保存和傳遞都更加高效。
壓縮而不出錯,就是把我們的文本進行重新編碼,以減少不必要的空間。最基本的編碼方法:赫夫曼編碼。

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:5
3+153+402+302+102=220

判斷比較方式少了三分之一量

2.得出赫夫曼(最優)二叉樹的方法

  1. 選取兩個權值最小的樹作爲左右子樹構造一顆新的二叉樹,且置新的二叉樹的根節點的權值爲左右子樹權值之和。
  2. 依次重複
  3. 圖解:
    按權值從大到小排成有序序列:
    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

這種叫做前綴編碼,任一字母的編碼都不是另一個字符編碼的前綴,很好的解決了網絡傳輸速度的問題。這就是赫夫曼編碼。

後記

以上就是樹的各種儲存結構,喜歡的多多支持哦~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章