Huffman(哈夫曼)编码--又称最佳编码(最有效的二进制编码)
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
在看一道Google筆試題時(shí)用到哈夫曼編碼,于是去搜了下資料。題目如下:
????用二進(jìn)制來(lái)編碼字符串“abcdabaa”,需要能夠根據(jù)編碼,解碼回原來(lái)的字符串,最少需要()長(zhǎng)的二進(jìn)制字符串?
A:12?? ? B:14 ?? ? C:18????? ? D:24
應(yīng)選B
?
?
以下是百度百科對(duì)Huffman編碼原理的解釋:
設(shè)某信源產(chǎn)生有五種符號(hào)u1、u2、u3、u4和u5,對(duì)應(yīng)概率P1=0.4,P2=0.1,P3=P4=0.2,P5=0.1。首先,將符號(hào)按照概率由大到小排隊(duì),如圖所示。
編碼時(shí),從最小概率的兩個(gè)符號(hào)開始,可選其中一個(gè)支 路為0,另一支路為1。這里,我們選上支路為0,下支路為1。再將已編碼的兩支路的概率合并,并重新排隊(duì)。多次重復(fù)使用上述方法直至合并概率歸一時(shí)為止。
從圖(a)和(b)可以看出,兩者雖平均碼長(zhǎng)相等,但同一符號(hào)可以有不同的碼長(zhǎng),即編碼方法并不唯一,其原因是兩支路概率合并后重新排隊(duì)時(shí),可能出現(xiàn)幾個(gè)支路概率相等,造成排隊(duì)方法不唯一。一般,若將新合并后的支路排到等概率的最上支路,將有利于縮短碼長(zhǎng)方差,且編出的碼更接近于等長(zhǎng)碼。這里圖(a)的編碼比(b)好。
圖1 赫夫曼編碼原理
赫夫曼碼的碼字,各符號(hào)的代碼是異前置碼字,即任一碼字不會(huì)是另一碼字的前面部分,這使各碼字可以連在一起傳送,中間不需另加隔離符號(hào),只要傳送時(shí)不出錯(cuò),收端仍可分離各個(gè)碼字,不致混淆。
之所以會(huì)出現(xiàn):任一碼字不會(huì)是另一碼字的前面部分這種情況,是因?yàn)閺纳系较?如圖中的右上方至左下方)的每一次分支,都會(huì)導(dǎo)致兩個(gè)分支的碼字開始不同。就像河流一樣,假設(shè)從頭到尾最長(zhǎng)的那條分支是主流,則每條分流(除主流)絕不會(huì)與主流的前部分重合,因?yàn)榉至鞯淖詈笠粋€(gè)拐向一定與主流不同,這也是出現(xiàn)該分流的原因。
從上可以看出,出現(xiàn)頻率最多的字符的碼字是最短的。這就使得一個(gè)字符串編碼后的總碼字更短,所以是最佳編碼(當(dāng)需要編碼的是圖像視頻等時(shí),應(yīng)該是按各像素出現(xiàn)頻率等要素來(lái)編碼)。
?
轉(zhuǎn)載于:https://my.oschina.net/henryking/blog/690821
總結(jié)
以上是生活随笔為你收集整理的Huffman(哈夫曼)编码--又称最佳编码(最有效的二进制编码)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 让XShell保存日志教程
- 下一篇: 日志服务接入方式之Unity 3D篇