首頁>Club>
6
回覆列表
  • 1 # 使用者2458114238191884

    霍夫曼(Huffman)編碼屬於碼詞長度可變的編碼類,是霍夫曼在1952年提出的一種編碼方法,即從下到上的編碼方法。同其他碼詞長度可變的編碼一樣,可區別的不同碼詞的生成是基於不同符號出現的不同機率。生成霍夫曼編碼演算法基於一種稱為“編碼樹”(coding tree)的技術。演算法步驟如下:

    (1)初始化,根據符號機率的大小按由大到小順序對符號進行排序。

    (2)把機率最小的兩個符號組成一個新符號(節點),即新符號的機率等於這兩個符號機率之和。

    (3)重複第2步,直到形成一個符號為止(樹),其機率最後等於1。

    (4)從編碼樹的根開始回溯到原始的符號,並將每一下分枝賦值為1,上分枝賦值為0。

    以下這個簡單例子說明了這一過程。

    1).字母A,B,C,D,E已被編碼,相應的出現機率如下:

    p(A)=0.16, p(B)=0.51, p(C)=0.09, p(D)=0.13, p(E)=0.11

    2).C和E機率最小,被排在第一棵二叉樹中作為樹葉。它們的根節點CE的組合機率為0.20。從CE到C的一邊被標記為1,從CE到E的一邊被標記為0。這種標記是強制性的。所以,不同的哈夫曼編碼可能由相同的資料產生。

    3).各節點相應的機率如下:

    p(A)=0.16, p(B)=0.51, p(CE)=0.20, p(D)=0.13

    D和A兩個節點的機率最小。這兩個節點作為葉子組合成一棵新的二叉樹。根節點AD的組合機率為0.29。由AD到A的一邊標記為1,由AD到D的一邊標記為0。

    如果不同的二叉樹的根節點有相同的機率,那麼具有從根到節點最短的最大路徑的二叉樹應先生成。這樣能保持編碼的長度基本穩定。

    4).剩下節點的機率如下:

    p(AD)=0.29, p(B)=0.51, p(CE)=0.20

    AD和CE兩節點的機率最小。它們生成一棵二叉樹。其根節點ADCE的組合機率為0.49。由ADCE到AD一邊標記為0,由ADCE到CE的一邊標記為1。

    5).剩下兩個節點相應的機率如下:

    p(ADCE)=0.49, p(B)=0.51

    它們生成最後一棵根節點為ADCEB的二叉樹。由ADCEB到B的一邊記為1,由ADCEB到ADCE的一邊記為0。

    6).圖03-02-2為霍夫曼編碼。編碼結果被存放在一個表中:

    w(A)=001, w(B)=1, w(C)=011, w(D)=000, w(E)=010

    圖03-02-2 霍夫曼編碼例

    霍夫曼編碼器的編碼過程可用例子演示和解釋。

    下面是另一個霍夫曼編碼例子。假定要編碼的文字是:

    "EXAMPLE OF HUFFMAN CODE"

    首先,計算文字中符號出現的機率(表03-02-2)。

    表03-02-2 符號在文字中出現的機率

    符號

    機率

    E

    2/25

    X

    1/25

    A

    2/25

    M

    2/25

    P

    1/25

    L

    1/25

    O

    2/25

    F

    2/25

    H

    1/25

    U

    1/25

    C

    1/25

    D

    1/25

    I

    1/25

    N

    2/25

    G

    1/25

    空格

    3/25

    最後得到圖03-02-3所示的編碼樹。

    圖03-02-3 霍夫曼編碼樹

    在霍夫曼編碼理論的基礎上發展了一些改進的編碼演算法。其中一種稱為自適應霍夫曼編碼(Adaptive Huffman code)。這種方案能夠根據符號機率的變化動態地改變碼詞,產生的程式碼比原始霍夫曼編碼更有效。另一種稱為擴充套件的霍夫曼編碼(Extended Huffman code)允許編碼符號組而不是單個符號。

    同夏農-範諾編碼一樣,霍夫曼碼的碼長雖然是可變的,但卻不需要另外附加同步程式碼。這是因為這兩種方法都自含同步碼,在編碼之後的碼串中都不需要另外新增標記符號,即在譯碼時分割符號的特殊程式碼。當然,霍夫曼編碼方法的編碼效率比夏農-範諾編碼效率高一些。

    採用霍夫曼編碼時有兩個問題值得注意:①霍夫曼碼沒有錯誤保護功能,在譯碼時,如果碼串中沒有錯誤,那麼就能一個接一個地正確譯出程式碼。但如果碼串中有錯誤,那怕僅僅是1位出現錯誤,也會引起一連串的錯誤,這種現象稱為錯誤傳播(error propagation)。計算機對這種錯誤也無能為力,說不出錯在哪裡,更談不上去糾正它。②霍夫曼碼是可變長度碼,因此很難隨意查詢或呼叫壓縮檔案中間的內容,然後再譯碼,這就需要在儲存程式碼之前加以考慮。儘管如此,霍夫曼碼還是得到廣泛應用。

  • 中秋節和大豐收的關聯?
  • 茅臺酒一共有多少種啊?