哈夫曼编码的MATLAB实现

本文介绍了如何使用MATLAB实现哈夫曼编码,重点在于理解编码矩阵c和合并关系矩阵m的构建,以及sort函数在其中的作用。通过示例详细解析了编码过程,包括概率合并、编码规则和矩阵操作的注意事项。
摘要由CSDN通过智能技术生成

在手动计算时,对哈夫曼编码的流程还是非常熟悉的,所以难点就是代码实现。在实现以前,我考虑了以下一些问题:一个符号的哈夫曼编码值可以用一个向量进行存储,符号合并以后的结果用什么表示,对其赋值0,1如何作用在被合并的原始符号上面。由于哈夫曼编码是从树根开始,存在继承上一节点编码的现象,故要与手动计算的方向相反,先根据概率及其合并得出各层次之间的关系,然后从底层向上开始编码。
编码中用到的一个核心函数是sort函数,用法如下:
[B,I]=sort(A)
如果 A=[5 4 7 0 2 ]
B=[0 2 4 5 7]
I=[4 5 2 1 3]是排序以后的数在原序列中的位置
以输入概率P=[0.2 0.15 0.4 0.25]为例对编码思路进行分析。
每经过一次合并,排序的概率少一个,最终由n个变成2个。为此可开辟一个n-1行 n*n列的编码矩阵c,第一行是对n个符号进行编码,直到n-1行是对2个符号进行编码。上一层编码是在下一层的基础上增加0或1 但是是在下一层哪个编码的基础上增加呢,这就要知道概率和是由原来的哪两个概率就和得到的。//为解决这个问题,需要用到sort()函数返回I的用法(上文提到的)。构建n-1行n列的合并关系矩阵m,与编码矩阵相对应。m矩阵对应位置的值就是指编码矩阵中该位置在排序前是在哪一位。
由于哈夫曼编码的不唯一性,规定概率小编码0,大的编码1。
生成m矩阵在这里插入图片描述
红框中3的含义是:四个符号按概率从小到大进行排序,将概率较小的两个合并,变成三个符号。这三个符号进行新的排序以后,该位置上的符号是原始序列的第三个。

下面是代码及其详细解释:

p=[0.2 0.15 0.4 0.25]
%判断信源的合理性
if length(find(p<0))~=0
    error('错误!出现小于0的概率')
end
 
if abs(sum(p)-1)>10e-10
    error('错误!信源不满足完备性')
end
n=length(p);
q=p;
%构建概率合并关系矩阵
m=zeros(n-1,n);
for i=1:n-1
 哈夫曼编码(Huffman Coding)是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。 Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长 度最短的码字,有时称之为最佳编码,一般就叫作Huffman编码。 以哈夫曼树─即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。 在计算机信息处理中,“哈夫曼编码”是一种一致性编码法(又称"熵编码法"),用于数据的无损耗压缩。这一术语是指使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。这种方法是由David.A.Huffman发展起来的。 例如,在英文中,e的出现概率很高,而z的出现概率则最低。当利用哈夫曼编码对一篇英文进行压缩时,e极有可能用一个位(bit)来表示,而z则可能花去25个位(不是26)。用普通的表示方法时,每个英文字母均占用一个字节(byte),即8个位。二者相比,e使用了一般编码的1/8的长度,z则使用了3倍多。倘若我们能实现对于英文中各个字母出现概率的较准确的估算,就可以大幅度提高无损压缩的比例。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值