1. 程式人生 > >演算法學習之哈夫曼編碼演算法

演算法學習之哈夫曼編碼演算法

   3、貪心選擇性質

     二叉樹T表示字符集C的一個最優字首碼,證明可以對T作適當修改後得到一棵新的二叉樹T”,在T”中x和y是最深葉子且為兄弟,同時T”表示的字首碼也是C的最優字首碼。設b和c是二叉樹T的最深葉子,且為兄弟。設f(b)<=f(c),f(x)<=f(y)。由於x和y是C中具有最小頻率的兩個字元,有f(x)<=f(b),f(y)<=f(c)。首先,在樹T中交換葉子b和x的位置得到T',然後再樹T'中交換葉子c和y的位置,得到樹T''。如圖所示:


    由此可知,樹T和T'的字首碼的平均碼長之差為:


     因此,T''表示的字首碼也是最優字首碼

,且x,y具有相同的碼長,同時,僅最優一位編碼不同。

     4、最優子結構性質

     二叉樹T表示字符集C的一個最優字首碼,x和y是樹T中的兩個葉子且為兄弟,z是它們的父親。若將z當作是具有頻率f(z)=f(x)+f(y)的字元,則樹T’=T-{x,y}表示字符集C’=C-{x, y} ∪ { z}的一個最優字首碼。因此,有:


     如果T’不是C’的最優字首碼,假定T”是C’的最優字首碼,那麼有,顯然T”’是比T更優的字首碼,跟前提矛盾!故T'所表示的C'的字首碼是最優的。

     由貪心選擇性質和最優子結構性質可以推出哈夫曼演算法是正確的,即HuffmanTree產生的一棵最優字首編碼樹。

     程式執行結果如圖: