前綴碼的本質(哈夫曼樹)---數據結構

首先回顧一下通信編碼背景與基礎知識。

在日常通信中,將ABCD分別 以00-01-10-11來編碼,是比較原始的方法。然而,我們總是希望傳遞的電文總長儘可能短
於是,我們設計ABCD的編碼分別爲0-00-1-01,這樣雖簡短,但卻無法實行,原因是產生了二義性。比如0000可爲AAB,BB等。
若要設計 不等長的編碼,則必須保證一個字符的編碼不是另一個字符的前綴,這種稱爲前綴碼
解決方法:通過構造哈夫曼樹即可形成通行上使用的二進制不等長碼。
(如下圖)
在這裏插入圖片描述

這樣便可以一舉兩得:

  1. 編碼不會產生二義性,即雖然G 01的整個編碼01與F 10001的最後兩個編碼01重合,但也無法在樹中找出編碼爲100的有效數據節點
  2. 由圖可見,頻數越大,編碼相應越短(利用了哈夫曼樹的特點),這樣一來,也就從總體上減少了傳送的信息量,提高了傳送效率
    (生活中對於文件的壓縮正是利用了這一方法)

利用以上知識,我們便可以來判定前綴碼了!
例題:(1){0,10,110,1111} (2){11,10,001,101,0001}
判斷他們是否爲前綴碼。

法一:構造哈夫曼樹辨別
法二:直接判別
(對於法二的理解是建立在法一上的)

下面我們來進行求解:
在這裏插入圖片描述
由“哈夫曼樹的數據(權值)節點均爲葉子節點”可知,(1)符合哈夫曼樹的定義,即(1)是前綴碼而(2)不符合,(2)非前綴碼。

法二:
(1){0,10,110,1111} (2){11,10,001,101,0001}
(1)中不存在任意數據的整個編碼與其他任一數據的前綴碼重合,則(1)爲前綴碼。
(2)排在第二位的整個編碼(10)與排在第四位的前綴碼(10)完全重合,固然(2)非前綴碼。
結合哈夫曼樹易知,以101爲編碼的數據節點是以10爲編碼的數據節點的右孩子,正應如此,違背了哈夫曼樹中數據(權值)節點是葉子節點這一定義,固然(2)非前綴碼。

大家在真正理解了這兩種做法後,在日後的訓練中就可以直接用法二來判別前綴碼了~~

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