樹(4)--赫夫曼樹及其應用

fan_rockrock發表於2014-02-17

一:基本概念:


1.路徑:由一結點到另一結點間的分支所構成

2.路徑長度:路徑上的分支數(A->E=2)

3.樹的路徑長度:從樹根到每一結點的路徑長度之和=10

4.結點帶權路徑長度:結點到根的路徑長度與結點上權的乘積
                                                         F的帶權路徑長度WPL=9*2=18

5.樹的帶權路徑長度:WPL=,Wi表示第i個結點的權值,Li表示結點的路徑長度。


二.赫夫曼樹:

1.概念:使得WPL=最小的那一棵樹就叫做赫夫曼樹.

2.思想:我們可以這樣想,要想使得WPL最小,即權值Wi越大的Li就讓它越小,越小的Wi的Li值就讓它越大。

   做法:

              (1) 由給定的 n 個權值{w0, w1, w2, …, wn-1},構造具有 n 棵擴充二叉樹的森林F = { T0, T1, T2, …, Tn-1 },其中每一棵擴充二叉樹 Ti 只有一個帶有權值 wi 的根結點,     其左、右子樹均為空。
             (2) 重複以下步驟, 直到 F 中僅剩下一棵樹為止:
                     ① 在 F 中選取兩棵根結點的權值最小的擴充二叉樹, 做為左、右子樹構造一棵新的二叉樹。置新的二叉樹的根結點的權值為其左、右子樹上根結點的權值之和。
                     ② 在 F 中刪去這兩棵二叉樹。
                     ③ 把新的二叉樹加入 F。


三.赫夫曼樹的應用:

1.判定樹:

   

           我們想能不能找到一種方式讓它比較的少一點呢?很明顯,我們讓比例大的分數就讓它少比較一點,讓比例小的分數讓它多比較一點,

    這樣的話就能達到比較次數少的目的了,,,很顯然我們可以採用赫夫曼樹的思想。。。


再將每一比較框的兩次比較改為一次得到:


2.赫夫曼編碼

          1)通訊中,可以採用0、1的不同排列來表示不同的字元,稱為二進位制編碼。傳送端需要將電文中的字元序列轉換成二進位制的0、1序列,即編碼 ; 

              接受端需要把接受的0、1序列轉換成對應的字元序列,即譯碼。 

          2)等長編碼:用相等長度的01序列來編碼,如A:01 B:10 C:11等;

             不等長編碼:用不同長度的01序列來編碼,如A:001 B:01 C:1等(不等長的目的是讓出現頻率高的字元具有較短的編碼,讓出現頻率低的字元具有較長的編碼,縮短傳送電文的總長度), 採用不等長編碼很明顯不應該存在:字符集中任一字元的編碼都不能是其他字元編碼的字首。符合此要求的編碼叫做字首編碼

           3)利用二叉樹就可以實現這種編碼,讓左分支為0,右分支為1就可以實現字首編碼(可以證明的)

                 

                如圖:a:0   b:110   c:10   d:111

            4).赫夫曼編碼:

                      設計電文總長最短的二進位制字首編碼即:以n種字元出現的頻率作權,設計一棵赫夫曼樹的問題,由此得到的二進位制字首編碼稱赫夫曼編碼

                    例:

                             

                   可得對應的哈夫曼編碼(並與二進位制編碼比較)為:

                             

                             

相關文章