一文看懂哈夫曼树与哈夫曼编码
轉(zhuǎn)自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299884.html
在一般的數(shù)據(jù)結(jié)構(gòu)的書中,樹的那章后面,著者一般都會(huì)介紹一下哈夫曼(HUFFMAN)樹和哈夫曼編碼。哈夫曼編碼是哈夫曼樹的一個(gè)應(yīng)用。哈夫曼編碼應(yīng)用廣泛,如JPEG中就應(yīng)用了哈夫曼編碼。 首先介紹什么是哈夫曼樹。哈夫曼樹又稱最優(yōu)二叉樹,是一種帶權(quán)路徑長(zhǎng)度最短的二叉樹。所謂樹的帶權(quán)路徑長(zhǎng)度,就是樹中所有的葉結(jié)點(diǎn)的權(quán)值乘上其到根結(jié)點(diǎn)的 路徑長(zhǎng)度(若根結(jié)點(diǎn)為0層,葉結(jié)點(diǎn)到根結(jié)點(diǎn)的路徑長(zhǎng)度為葉結(jié)點(diǎn)的層數(shù))。樹的帶權(quán)路徑長(zhǎng)度記為WPL= (W1*L1+W2*L2+W3*L3+…+Wn*Ln),N個(gè)權(quán)值Wi(i=1,2,…n)構(gòu)成一棵有N個(gè)葉結(jié)點(diǎn)的二叉樹,相應(yīng)的葉結(jié)點(diǎn)的路徑長(zhǎng)度為L(zhǎng)i(i=1,2,…n)??梢宰C明哈夫曼樹的WPL是最小的。
哈夫曼編碼步驟:
一、對(duì)給定的n個(gè)權(quán)值{W1,W2,W3,…,Wi,…,Wn}構(gòu)成n棵二叉樹的初始集合F= {T1,T2,T3,…,Ti,…,Tn},其中每棵二叉樹Ti中只有一個(gè)權(quán)值為Wi的根結(jié)點(diǎn),它的左右子樹均為空。(為方便在計(jì)算機(jī)上實(shí)現(xiàn)算 法,一般還要求以Ti的權(quán)值Wi的升序排列。)
二、在F中選取兩棵根結(jié)點(diǎn)權(quán)值最小的樹作為新構(gòu)造的二叉樹的左右子樹,新二叉樹的根結(jié)點(diǎn)的權(quán)值為其左右子樹的根結(jié)點(diǎn)的權(quán)值之和。
三、從F中刪除這兩棵樹,并把這棵新的二叉樹同樣以升序排列加入到集合F中。
四、重復(fù)二和三兩步,直到集合F中只有一棵二叉樹為止。
簡(jiǎn)易的理解就是,假如我有A,B,C,D,E五個(gè)字符,出現(xiàn)的頻率(即權(quán)值)分別為5,4,3,2,1,那么我們第一步先取兩個(gè)最小權(quán)值作為左右子樹構(gòu)造一個(gè)新樹,即取1,2構(gòu)成新樹,其結(jié)點(diǎn)為1+2=3,如圖:
虛線為新生成的結(jié)點(diǎn),第二步再把新生成的權(quán)值為3的結(jié)點(diǎn)放到剩下的集合中,所以集合變成{5,4,3,3},再根據(jù)第二步,取最小的兩個(gè)權(quán)值構(gòu)成新樹,如圖:
再依次建立哈夫曼樹,如下圖:
其中各個(gè)權(quán)值替換對(duì)應(yīng)的字符即為下圖:
所以各字符對(duì)應(yīng)的編碼為:A->11,B->10,C->00,D->011,E->010
霍夫曼編碼是一種無(wú)前綴編碼。解碼時(shí)不會(huì)混淆。其主要應(yīng)用在數(shù)據(jù)壓縮,加密解密等場(chǎng)合。
總結(jié)
以上是生活随笔為你收集整理的一文看懂哈夫曼树与哈夫曼编码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: VUE 身份证号验证
- 下一篇: Windows 手动与脚本自动重启Pri