1、引言
哈夫曼编码是分组编码,完全依据各字符出现的概率来构造码字。其基本原理是基于二叉树的编码思想,所有可能的输人符号在哈夫曼树上对应为一个节点,节点的位置就是该符号的哈夫曼编码。
2、来源
1951年,哈夫曼和他在MIT信息论的同学需要选择是完成学期报告还是期末考试。导师Robert M.Fano给他们的学期报告的题目是,寻找最有效的二进制编码。由于无法证明哪个已有编码是最有效的,哈夫曼放弃对已有编码的研究,转向新的探索,最终发现了基于有序频率二叉树编码的想法,并很快证明了这个方法是最有效的。由于这个算法,学生终于青出于蓝,超过了他那曾经和信息论创立者香农共同研究过类似编码的导师。哈夫曼使用自底向上的方法构建二叉树,避免了次优算法Shannon-Fano编码的最大弊端——自顶向下构建树。1952年,David A.Huffman在麻省理工攻读博士时发表了《一种构建极小多余编码的方法》(A Method for the Construction of Minimum-Redundancy Codes)一文,它一般就叫做Huffman编码。
Huffman在1952年根据香农(Shannon)在1948年和范若(Fano)在1949年阐述的这种编码思想提出了一种不定长编码的方法,也称哈夫曼(Huffman)编码。哈夫曼编码的基本方法是先对图像数据扫描一遍,计算出各种像素出现的概率,按概率的大小指定不同长度的唯一码字,由此得到一张该图像的哈夫曼码表。编码后的图像数据记录的是每个像素的码字,而码字与实际像素值的对应关系记录在码表中。
哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就称Huffman编码。
3、编码方法
(1)将信源消息符号按其出现的概率大小依次排列为P1≥P2≥...≥Pn
(2)取两个概率最小的字母分别配以0和1两个码元,并将这两个概率相加作为一个新字母的概率,与未分配二进符号的字母一起重新排队。
(3)对重排后的两个概率最小符号重复步骤(2)的过程。
(4)不断继续上述过程,直到最后两个符号配以0和1为止。
(5)从最后一级开始,向前返回得到各个信源符号所对应的码元序列,即相应的码字
哈夫曼编码方法得到的码并非是唯一的。造成非唯一的原因如下:
(1).每次对信源缩减时,赋予信源最后两个概率最小的符号,用0和1是可以任意的,所以可以得到不同的哈夫曼码,但不会影响码字的长度。
(2).对信源进行缩减时,两个概率最小的符号合并后的概率与其他信源符号的概率相同时,这两者在缩减信源中进行概率排序,其位置放置次序可以是任意的,故会得到不同的哈夫曼码。此时将影响码字的长度,一般将合并的概率放在上面,这样可获得较小的码方差。
4、二进制编码过程
5、多进制扩展哈夫曼编码
如果要求编出N进制的哈夫曼码,则应在每次最小概率合并时取个符号。另外,为了得到最短平均码长,尽量减少量长码的信源符号,有时在编码前需要对信源符号作添加,使得信源的符号数量满足M(N-1)+1,M为正整数。添加的信源符号的概率为零。这样在多次合并后就能充分利用短码,以便降低平均码长。例如要将信源
编成三进制的哈夫曼码,如果直接编码,形成的码长为(1,2,2,2)。如果先对
信源添加1个符号,变成
这时编码形成的码长为(1,1,2,2)。
三进制哈夫曼编码
(1)将信源消息符号按其出现的概率大小依次排列为P1≥P2...≥Pn
(2)取三个概率最小的字母分别配以0,1,2三个码元,并将这三个概率相加作为一个新字母的概率,与未分配三进符号的字母一起重新排队。
(3)对重排后的三个概率最小符号重复步骤(2)的过程。
(4)不断继续上述过程,直到最后三个符号配以0,1,2为止。
(5)从最后一级开始,向前返回得到各个信源符号所对应的码元序列,即相应的码字。
四进制哈夫曼编码
(1)将信源消息符号按其出现的概率大小依次排列为P1≥P2...≥Pn
(2)取四个概率最小的字母分别配以码元0,1,2,3,并将这四个概率相加作为一个新字母的概率,与未分配四进符号的字母一起重新排队。
(3)对重排后的四个概率最小符号重复步骤(2)的过程。
(4)不断继续上述过程,直到最后四个符号配以0.1.2.3四个码元为止。
(5)从最后一级开始,向前返回得到各个信源符号所对应的码元序列,即相应的码字。
6、哈夫曼编码的特点
(1)Huffman编码的构造顺序明确,但码不是唯一的。因为在为两个分支赋值时,可以是左支(或上支)为0,也可以是右支(或下支)为0,造成编码的不唯一。此外,当两个符号的概率相等时,谁前谁后也是随机的,构造出来的码字就不是唯一的。
(2)Huffman编码的字长参差不齐,硬件实现不是很方便。
(3)Huffman编码在概率分布很不均匀时能够具有显著的效果,而在信源分布均匀时,一般不使用Huffman编码。
(4)对信源进行Huffman编码后,形成了一个Huffman编码表。解码时,必须参照Huffman:编码表才能正确译码。
理论研究表明,Huffman编码是一种接近压缩比上限的编码方法,因此它被广泛用于多种压缩算法之中。
哈夫曼码在实际中已有所应用,但它仍存在一些分组码所具有的缺点。例如慨率特性必须精确地测定,以此来编制码表,它若略有变化,还需更换码表。因而在实际的编码过程中,需要对原始数据扫描两遍,第一遍用来统计原始数据中各字符出现的概率,创建码表存放起来,第二遍则依据码表在扫描的同时进行编码,才能传输信息。如果将这种编码用于网络通信中,两遍扫描会引起较大的延时:如果用于数据压缩,则会降低速度。因此出现了自适应哈夫曼编码方法,其码表不是事先构造,而是随着编码的进行,不断动态地构造、调整,所以码表不仅取决于信源的特性,还与编码、解码过程相关。
另外,对于二元信源,常需多个符号合起来编码,才能取得好的效果,但当合并的符号数不大时,编码效率提高不多,尤其对于相关信源,不能令人满意,而合并的符号数增大时,码表中的码字数很多,设备将越来越复杂。在大多数情况下,哈夫曼编码用于无失真编码,但也可以用于有失真情况。例如在符号数很多且有部分符号的概率非常小时,为了减小码表,可以将这些小概率符号合并对应同一个码字,在解码时出现的错误概率即为这些符号慨率之和。