日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

huffman编码压缩算法

發(fā)布時間:2024/9/30 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 huffman编码压缩算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)自:http://coolshell.cn/articles/7459.html

前兩天發(fā)布那個rsync算法后,想看看數(shù)據(jù)壓縮的算法,知道一個經(jīng)典的壓縮算法Huffman算法。相信大家應(yīng)該聽說過?David Huffman?和他的壓縮算法——?Huffman Code,一種通過字符出現(xiàn)頻率,Priority Queue,和二叉樹來進(jìn)行的一種壓縮算法,這種二叉樹又叫Huffman二叉樹 —— 一種帶權(quán)重的樹。從學(xué)校畢業(yè)很長時間的我忘了這個算法,但是網(wǎng)上查了一下,中文社區(qū)內(nèi)好像沒有把這個算法說得很清楚的文章,尤其是樹的構(gòu)造,而正好看到一篇國外的文章《A Simple Example of Huffman Code on a String》,其中的例子淺顯易懂,相當(dāng)不錯,我就轉(zhuǎn)了過來。注意,我沒有對此文完全翻譯。

我們直接來看示例,如果我們需要來壓縮下面的字符串:

?“beep boop beer!”?

首先,我們先計算出每個字符出現(xiàn)的次數(shù),我們得到下面這樣一張表 :


字符 次數(shù)
‘b’ 3
‘e’ 4
‘p’ 2
‘ ‘ 2
‘o’ 2
‘r’ 1
‘!’ 1


然后,我把把這些東西放到Priority Queue中(用出現(xiàn)的次數(shù)據(jù)當(dāng) priority),我們可以看到,Priority Queue 是以Prioirry排序一個數(shù)組,如果Priority一樣,會使用出現(xiàn)的次序排序:下面是我們得到的Priority Queue:

接下來就是我們的算法——把這個Priority?Queue 轉(zhuǎn)成二叉樹。我們始終從queue的頭取兩個元素來構(gòu)造一個二叉樹(第一個元素是左結(jié)點,第二個是右結(jié)點),并把這兩個元素的priority相加,并放回Priority中(再次注意,這里的Priority就是字符出現(xiàn)的次數(shù)),然后,我們得到下面的數(shù)據(jù)圖表:

(這里應(yīng)該要講得更細(xì)致些,我們可以把這個數(shù)列看成一個排序堆的數(shù)組實現(xiàn),當(dāng)選擇第一個頭元素后,必須通過一個迭代把剩余元素的最小的元素作為頭元素,然后再取得這個頭元素,拿這兩個頭元素相加,再放入相加之后的元素)

同樣,我們再把前兩個取出來,形成一個Priority為2+2=4的結(jié)點,然后再放回Priority?Queue中 :

繼續(xù)我們的算法(我們可以看到,這是一種自底向上的建樹的過程):

最終我們會得到下面這樣一棵二叉樹:

此時,我們把這個樹的左支編碼為0,右支編碼為1,這樣我們就可以遍歷這棵樹得到字符的編碼,比如:‘b’的編碼是 00,’p'的編碼是101, ‘r’的編碼是1000。我們可以看到出現(xiàn)頻率越多的會越在上層,編碼也越短,出現(xiàn)頻率越少的就越在下層,編碼也越長。

最終我們可以得到下面這張編碼表:


字符 編碼
‘b’ 00
‘e’ 11
‘p’ 101
‘ ‘ 011
‘o’ 010
‘r’ 1000
‘!’ 1001


這里需要注意一點,當(dāng)我們encode的時候,我們是按“bit”來encode,decode也是通過bit來完成,比如,如果我們有這樣的bitset “1011110111″ 那么其解碼后就是 “pepe”。所以,我們需要通過這個二叉樹建立我們Huffman編碼和解碼的字典表。

這里需要注意的一點是,我們的Huffman對各個字符的編碼是不會沖突的,也就是說,不會存在某一個編碼是另一個編碼的前綴,不然的話就會大問題了。因為encode后的編碼是沒有分隔符的。

于是,對于我們的原始字符串 ?beep boop beer!

其對就能的二進(jìn)制為 : 0110 0010 0110 0101 0110 0101 0111 0000 0010 0000 0110 0010 0110 1111 0110 1111 0111 0000 0010 0000 0110 0010 0110 0101 0110 0101 0111 0010 0010 0001

我們的Huffman的編碼為: 0011 1110 1011 0001 0010 1010 1100 1111 1000 1001

從上面的例子中,我們可以看到被壓縮的比例還是很可觀的。

作者給出了源碼你可以看看( C99標(biāo)準(zhǔn))?Download the source files


總結(jié)

以上是生活随笔為你收集整理的huffman编码压缩算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。