Huffman(哈夫曼)编码--又称最佳编码(最有效的二进制编码)

本文通过一道Google笔试题引入哈夫曼编码的概念,详细解释了哈夫曼编码的生成原理及其如何实现最优编码的过程。并通过实例说明了哈夫曼树的构建方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在看一道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 赫夫曼编码原理图1 赫夫曼编码原理

赫夫曼码的码字,各符号的代码是异前置码字,即任一码字不会是另一码字的前面部分,这使各码字可以连在一起传送,中间不需另加隔离符号,只要传送时不出错,收端仍可分离各个码字,不致混淆。

之所以会出现:任一码字不会是另一码字的前面部分这种情况,是因为从上到下(如图中的右上方至左下方)的每一次分支,都会导致两个分支的码字开始不同。就像河流一样,假设从头到尾最长的那条分支是主流,则每条分流(除主流)绝不会与主流的前部分重合,因为分流的最后一个拐向一定与主流不同,这也是出现该分流的原因。

从上可以看出,出现频率最多的字符的码字是最短的。这就使得一个字符串编码后的总码字更短,所以是最佳编码(当需要编码的是图像视频等时,应该是按各像素出现频率等要素来编码)。

 

转载于:https://my.oschina.net/henryking/blog/690821

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值