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