哈夫曼編碼原理

時間 2021-09-06 02:19:38

1樓:喵喵喵啊

赫夫曼碼的碼字(各符號的**)是異前置碼字,即任一碼字不會是另一碼字的前面部分,這使各碼字可以連在一起傳送,中間不需另加隔離符號,只要傳送時不出錯,收端仍可分離各個碼字,不致混淆。

哈夫曼編碼,又稱霍夫曼編碼,是一種編碼方式,哈夫曼編碼是可變字長編碼(vlc)的一種。huffman於2023年提出一種編碼方法,該方法完全依據字元出現概率來構造異字頭的平均長度最短的碼字,有時稱之為最佳編碼,一般就叫做huffman編碼。

擴充套件資料

赫夫曼編碼的具體方法:先按出現的概率大小排隊,把兩個最小的概率相加,作為新的概率

和剩餘的概率重新排隊,再把最小的兩個概率相加,再重新排隊,直到最後變成1。

每次相加時都將「0」和「1」賦與相加的兩個概率,讀出時由該符號開始一直走到最後的「1」,

將路線上所遇到的「0」和「1」按最低位到最高位的順序排好,就是該符號的赫夫曼編碼。

例如a7從左至右,由u至u″″,其碼字為1000;

a6按路線將所遇到的「0」和「1」按最低位到最高位的順序排好,其碼字為1001…

用赫夫曼編碼所得的平均位元率為:σ碼長×出現概率

上例為:0.2×2+0.19×2+0.18×3+0.17×3+0.15×3+0.1×4+0.01×4=2.72 bit

可以算出本例的信源熵為2.61bit,二者已經是很接近了。

2樓:我要換名字好嗎

霍夫曼(huffman)編碼屬於碼詞長度可變的編碼類,是霍夫曼在2023年提出的一種編碼方法,即從下到上的編碼方法。同其他碼詞長度可變的編碼一樣,可區別的不同碼詞的生成是基於不同符號出現的不同概率。生成霍夫曼編碼演算法基於一種稱為「編碼樹」(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 符號在文字中出現的概率

符號概率

e2/25

x1/25

a2/25

m2/25

p1/25

l1/25

o2/25

f2/25

h1/25

u1/25

c1/25

d1/25

i1/25

n2/25

g1/25

空格3/25

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

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

在霍夫曼編碼理論的基礎上發展了一些改進的編碼演算法。其中一種稱為自適應霍夫曼編碼(adaptive huffman code)。這種方案能夠根據符號概率的變化動態地改變碼詞,產生的**比原始霍夫曼編碼更有效。

另一種稱為擴充套件的霍夫曼編碼(extended huffman code)允許編碼符號組而不是單個符號。

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

採用霍夫曼編碼時有兩個問題值得注意:①霍夫曼碼沒有錯誤保護功能,在譯碼時,如果碼串中沒有錯誤,那麼就能一個接一個地正確譯出**。但如果碼串中有錯誤,那怕僅僅是1位出現錯誤,也會引起一連串的錯誤,這種現象稱為錯誤傳播(error propagation)。

計算機對這種錯誤也無能為力,說不出錯在**,更談不上去糾正它。②霍夫曼碼是可變長度碼,因此很難隨意查詢或呼叫壓縮檔案中間的內容,然後再譯碼,這就需要在儲存**之前加以考慮。儘管如此,霍夫曼碼還是得到廣泛應用。

哈夫曼編碼碼長怎麼算,霍夫曼編碼的平均碼長怎麼求

墨汁遊戲 假設用於通訊的電文由字符集中的字母構成,這8個字母在電文 現的概率分別為。哈夫曼編碼 根據上面可得編碼表 a 1001 b 01 c 10111 d 1010 e 11 f 10110 g 00 h 1000 用三位二進行數進行的等長編碼平均長度為3,而根據哈夫曼樹編碼的平均碼長為 4 0...

設某哈夫曼樹中有結點,則該哈夫曼樹中有 個葉子結點

痴情鐲 設某哈夫曼樹中有199個結點,則該哈夫曼樹中有100個葉子結點。給定n個權值作為n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。哈夫曼編碼 哈夫曼靜態編碼...

求C語言C 高手賜教額關於哈夫曼樹的程式急求一定要可以執行的噢

說實話,哈夫曼樹的編碼有點難度,這個 是我花了三四個小時寫的,不能完全滿足你的要求,但是可以進行哈夫曼編碼,你試著向你題目的要求改一下吧。include include define n 5 define m 2 n 1 typedef struct hf node htnode typedef s...