[老文章搬家] 关于 Huffman 编码

按:去年接手一个项目,涉及到一个一个叫作Mxpeg的非主流视频编码格式,编解码器是厂商以源代码形式提供的,可是可能代码写的不算健壮,以致于咱们tcp直连设备很正常,可是通过一个UDP数据分发服务器以后,在偶尔有丢包的状况下解码器会偶发崩溃,翻了翻他们的代码以为可能问题出在Huffman这一块。水平有限也没有看太懂他们的源码,并且我也不是科班出身当时对Huffman编码算法只是知道这么个名字,还好服务端软件那边作了修改,解决了丢包的问题。在回家过年的火车上想起这件事,阅读了一些关于Huffman编码的资料,算是对这个东西有了些通俗的认识,记在这里以防遗忘或者智力萎缩。
 
Huffman编码,是一种压缩编码算法,它利用“出现频率最大的信息应该用最短的码元来表示”这一原理对信息进行压缩。使用这种原理的编码算法统称“熵编码”。为了解释清楚Huffman编码的原理,我得先定义一些概念:
 
信息(Message)
含有某种语义的单元。好比拿经常使用的文本传输举例子,'a'就是个信息,它表示字母a,或者不定冠词a,又或者A片。总之它有一个预先定义的语义。
 
信息序列(Message Sequence)
信息排列组合组成的串。就像英文同样,光有字母是不行的,由于字母只有26个,可是单词有几百万个,因此要用字母的排列组合来构成单词,好比apple,再好比<a href="http: baike.baidu.com="" view="" 657095.htm?source="www.willlong.com""> 这个单词。而后咱们还用单词加空格组成句子来表达更复杂的意思(信息),好比"son of bitch",这也是一个序列
 
符号(Symbol)
咱们用电子设备来传输信息,可是设备不认识信息,只认识电平,1和0。0和1被叫做符号。
PS: 听说中国有个教授研究能表达3个状态的量子逻辑,成果还挺厉害的,不知道靠谱否。
 
符号序列(Symbol Sequence)
一样,光有符号也是不行的,由于符号只有两个(0,1),消息却有不少,好比字母有26个,因此要用符号的排列组合来表示信息,继而表示出信息序列。好比你去内存里看C字符串"son of bitch",就是0和1组成的符号序列。
 
编码(Message Code)
对于一个信息/信息序列M,用一个符号序列C来表示,在这个映射中,咱们称C为M的编码/编码序列(同时,咱们不妨把这个映射的过程叫作编码,不会产生歧义)。
有了上面这些概念,咱们很容易推知,在单位符号传输时间恒定的状况下,传输一样的消息,确定是生成的编码序列越短,花费的时间就越短。那么为了提升传输效率,咱们有必要找到一种编码算法,使得一个有限长信息序列编码生成的符号序列尽量的短,大神Shannon称之为“最小冗余编码(minimum-redundancy code)”——事实上Shannon的定义和我这里不太同样,我这是山寨解释。另外为了解码须要,一个 可行的编码算法还要符合两个 基本限制
 
1.不一样的信息不能编出一样的码,这个是天经地义的,不须要解释。
2.不须要额外的说明就能肯定信息编码之间的界限,从这个条件引伸,咱们能够将其解释为不能有一个编码C1是另外一个编码C2的前k位(也叫前缀k——kth prefix),好比01表示a,011表示b就是不合法的,由于给定符号序列011,若是没有额外说明,无法肯定是a加上一个1仍是b。虽然没有什么逻辑联系,可是看到第二条我就想到为何你们都喜欢配置文件而不是xml,尤为是手写解析器的状况下。

进一步考虑,假设待编码序列中的信息空间有N种取值,用1到N表示,P(n)为消息n出现的频率(由于是已知序列,因此是频率而不是几率),L(n)为消息n编码后的长度,C(n)为消息n的编码。咱们能够获得另一些结论,首先,有:
    若是 P(1)<=P(2)<=...<=P(N)
    那么 L(1)>=L(2)>=...>=L(N)
也就是说,频率小的信息编码以后不能比频率大的信息更短,由于若是不这样的话,咱们只要简单的互换两个信息的编码,就能减少编码序列的长度。而后咱们再考虑L(N-1)和L(N),假设L(N-1)=4,那L(N)是几?显然根据刚得出的结论L(N)不能小于4,那能不能是比4大,好比5?若是真等于5的话,根据前面的限制2,C(N)的前4位必然没有在编码空间中出现过,那第5位还有必要么?显然没有了,我读到第4位就知道必定是N了,还要第5位干什么?L(N)不能比4小,也不能比4大,那只能是4,也就是说,结论是L(N)=L(N-1)。
相关文章
相关标签/搜索