哈夫曼编码的实现及多进制扩展-P22214013李佳颖 P22214014刘政均

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编码是一种接近压缩比上限的编码方法,因此它被广泛用于多种压缩算法之中。

哈夫曼码在实际中已有所应用,但它仍存在一些分组码所具有的缺点。例如慨率特性必须精确地测定,以此来编制码表,它若略有变化,还需更换码表。因而在实际的编码过程中,需要对原始数据扫描两遍,第一遍用来统计原始数据中各字符出现的概率,创建码表存放起来,第二遍则依据码表在扫描的同时进行编码,才能传输信息。如果将这种编码用于网络通信中,两遍扫描会引起较大的延时:如果用于数据压缩,则会降低速度。因此出现了自适应哈夫曼编码方法,其码表不是事先构造,而是随着编码的进行,不断动态地构造、调整,所以码表不仅取决于信源的特性,还与编码、解码过程相关。

另外,对于二元信源,常需多个符号合起来编码,才能取得好的效果,但当合并的符号数不大时,编码效率提高不多,尤其对于相关信源,不能令人满意,而合并的符号数增大时,码表中的码字数很多,设备将越来越复杂。在大多数情况下,哈夫曼编码用于无失真编码,但也可以用于有失真情况。例如在符号数很多且有部分符号的概率非常小时,为了减小码表,可以将这些小概率符号合并对应同一个码字,在解码时出现的错误概率即为这些符号慨率之和。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值