在看一道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)好。
赫夫曼码的码字,各符号的代码是异前置码字,即任一码字不会是另一码字的前面部分,这使各码字可以连在一起传送,中间不需另加隔离符号,只要传送时不出错,收端仍可分离各个码字,不致混淆。
之所以会出现:任一码字不会是另一码字的前面部分这种情况,是因为从上到下(如图中的右上方至左下方)的每一次分支,都会导致两个分支的码字开始不同。就像河流一样,假设从头到尾最长的那条分支是主流,则每条分流(除主流)绝不会与主流的前部分重合,因为分流的最后一个拐向一定与主流不同,这也是出现该分流的原因。
从上可以看出,出现频率最多的字符的码字是最短的。这就使得一个字符串编码后的总码字更短,所以是最佳编码(当需要编码的是图像视频等时,应该是按各像素出现频率等要素来编码)。