哈夫曼樹與哈夫曼編碼

2022-08-11 10:21:14 字數 1812 閱讀 8956

2018-03-02 15:03:37

編碼問題是電腦科學乃至ee中的乙個核心的問題,最基礎的編碼方式是採用等長的編碼,比如計算機中的字元的編碼就是採用等長的8位,即乙個位元組進行的編碼。

但是在實際生活中,每個字元出現的頻率是不同的,因此,如果我們採用不等長編碼,將出現頻率高的字元採用較短的編碼,對出現頻率低的字元採用較長的編碼,就可以實現更高效和節省的編碼。

一、哈夫曼樹

霍夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的權值乘上其到根結點的路徑長度(若根結點為0層,葉結點到根結點的路徑長度為葉結點的層數)。樹的路徑長度是從樹根到每一結點的路徑長度之和,記為wpl=(w1*l1+w2*l2+w3*l3+...+wn*ln),n個權值wi(i=1,2,...n)構成一棵有n個葉結點的二叉樹,相應的葉結點的路徑長度為li(i=1,2,...n)。可以證明霍夫曼樹的wpl是最小的。

2023年,霍夫曼和他在mit資訊理論的同學得選擇是完成學期報告還是期末考試。導師羅伯特·法諾出的學期報告題目是,查詢最有效的二進位制編碼。由於無法證明哪個已有編碼是最有效的,霍夫曼放棄對已有編碼的研究,轉向新的探索,最終發現了基於有序頻率二叉樹編碼的想法,並很快證明了這個方法是最有效的。霍夫曼使用自底向上的方法構建二叉樹,避免了次優演算法夏農-范諾編碼的最大弊端──自頂向下構建樹。

演算法流程:

假設有n個權值,則構造出的哈夫曼樹有n個葉子結點。 n個權值分別設為 w1、w2、…、wn,則哈夫曼樹的構造規則為:

(1) 將w1、w2、…,wn看成是有n 棵樹的森林(每棵樹僅有乙個結點);

(2) 在森林中選出兩個根結點的權值最小的樹合併,作為一棵新樹的左、右子樹,且新樹的根結點權值為其左、右子樹根結點權值之和;

(3)從森林中刪除選取的兩棵樹,並將新樹加入森林;

(4)重複(2)、(3)步,直到森林中只剩一棵樹為止,該樹即為所求得的哈夫曼樹。

typedef struct treenode *huffmantree;

struct treenode

huffmantree huffman( minheap h )

t = deletemin(h);

return t;

}

二、哈夫曼編碼問題:給定一段字串,如何對字元進行編碼 ,可以使得該字串的編碼儲存空間最少?

【例】假設有一段文字,包含58 個字元,並由以下7 個字元構:a ,e ,i, s ,t ,空格(sp),換行(nl);這7個字元出現的次數不同。如何對這7個字元進行編碼,使得總編碼空間最少?

【分析】

(1)用等長ascii 編碼:58  ×8 = 464 位;

(2)用等長3 位編碼:58  ×3 = 174 位;

(3)不等長編碼:出現頻率高的字元用的編碼短些 ,出現頻率低的字元則可以用較長的編碼進行表示。

採用不定長編碼編碼最本初的問題就是如何避免二義性,在解釋一段編碼的時候如果有多於一種的解釋,顯然這種編碼就是不可靠的。

經過證明只要任何字元的編碼都不是另一字元編碼的字首,就可以避免二義性。

顯然的是,只要字元出現在葉子結點就不能是另乙個編碼的字首碼,並且當前的編碼問題本質上就是構造哈夫曼樹。

哈夫曼樹與哈夫曼編碼

在一般的資料結構的書中,樹的那章後面,著者一般都會介紹一下哈夫曼 huffman 樹和哈夫曼編碼。哈夫曼編碼是哈夫曼樹的乙個應用。哈夫曼編碼應用廣泛,如 jpeg中就應用了哈夫曼編碼。首先介紹什麼是哈夫曼樹。哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的...

哈夫曼樹與哈夫曼編碼

1.哈夫曼 huffman 編碼是哈夫曼樹的乙個應用。2.哈夫曼樹又稱為最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的相對值乘上其到根結點的路徑和權值。3.影象jpg就是利用了哈夫曼編碼。4.哈夫曼樹是最優二叉樹,子樹有左右次序之分。5.哈夫曼樹的形態不是唯...

哈夫曼樹與哈夫曼編碼

哈夫曼樹是一種簡單的樹結構,建樹過程如下 給出一組資料,不斷選擇最小的兩個數,並用兩個數的和作為它們的parent節點,再從資料中刪除這兩個數,將兩個數的和加入資料中,直到所有的資料都被加入樹結構,形成一顆樹。這顆樹的所有非葉子節點都有兩個child,兩個child的值的和則是這個節點的值,根節點是...