1. 程式人生 > >霍夫曼樹(最優二叉樹)簡介

霍夫曼樹(最優二叉樹)簡介

一、霍夫曼編碼

      說到霍夫曼樹,就不得不提霍夫曼編碼(Huffman Coding)。霍夫曼編碼是可變字長編碼(VLC)的一種。David.A.Huffman於1952年提出該編碼方法,即完全依據字元出現概率來構造異字頭的平均長度最短的碼字,亦稱之為最佳編碼。

      在資料通訊中,需要將傳送的文字轉換成二進位制的字串,用0,1碼的不同排列來表示字元。例如,需傳送的報文為“AFTER DATA EAR ARE ART AREA”,這裡用到的字符集為“A,E,R,T,F,D”,各字母出現的次數為{8,4,5,3,1,1}。現要求為這些字母設計編碼。要區別6個字母,最簡單的二進位制編碼方式是等長編碼

,固定採用3位二進位制,可分別用000、001、010、011、100、101對“A,E,R,T,F,D”進行編碼傳送,當對方接收報文時再按照三位一分進行譯碼。顯然編碼的長度取決報文中不同字元的個數。若報文中可能出現26個不同字元,則固定編碼長度為5。然而,傳送報文時總是希望總長度儘可能短。

      在實際應用中,各個字元的出現頻度或使用次數是不相同的,如A、B、C的使用頻率遠遠高於X、Y、Z,自然會想到設計編碼時,如果能讓出現頻率高的字元的編碼長度減少,頻率低的字元編碼長度 長於 頻率高的。這樣整個資訊的編碼長度會減少,並且能區分出不同的字元。

      為了實現這種更高效的編碼方式,就需要利用一個二叉樹的結構來進行輔助編碼,這種二叉樹即為霍夫曼樹

,也稱作最優二叉樹。來實現一個字元的編碼不是另一個字元編碼的字首。

二、霍夫曼樹的定義與演算法描述

         在說明霍夫曼樹之前,需要介紹幾個術語。

      1、路徑和路徑長度       在一棵樹中,從一個結點往下可以達到的孩子或孫子結點之間的通路,稱為路徑。通路中分支的數目稱為路徑長度。若規定根結點的層數為1,則從根結點到第L層結點的路徑長度為L-1。
      2、結點的權及帶權路徑長度       若將樹中結點賦給一個有著某種含義的數值,則這個數值稱為該結點的。結點的帶權路徑長度為:從根結點到該結點之間的路徑長度與該結點的權的乘積       3、樹的帶權路徑長度       樹的帶權路徑長度規定為所有葉子結點
的帶權路徑長度之和,記為WPL。(Weighted Path Length of Tree)

      所謂赫夫曼樹,就是帶權路徑長度之和WPL最小的那個二叉樹。(因此也叫作最優二叉樹)

一般來說,用n(n>0)個帶權值的葉子來構造二叉樹,限定二叉樹中除了這n個葉子外只能出現度為2的結點

     演算法描述

     

      例如

三、霍夫曼編碼的實現