【数据压缩】Exp03.HUffman_Coding霍夫曼编码及其编码效率分析

来源:互联网 发布:win10网络连接图标消失 编辑:程序博客网 时间:2024/06/09 14:49

实验原理:

霍夫曼编码是一种无失真的信源编码,其基本思想是对于概率大的符号用短码表示,对概率小的符号用长码表示,从而使得编码后的信源的平均码长接近香农定理中给出的变长编码平均码长的下界H(X)/logr。为了使得编码得到的码字为即时码,在程序中使用二叉树来对信源进行编码。

霍夫曼编码的步骤如下:


第一步:将文件读入缓存区;

第二步:之字形扫描,统计信源的各符号的概率;

第三步:按照概率排列信源符号,将两个最小的概率作为二叉树的树叶节点,两个概率的和作为根节点,在将新的节点(树叶节点不参与比较)重新排序,选出概率最小的作为树叶节点,重复该步骤直到最终的根节点概率为1,码树生成结束;

第四步:将码表及其他信息写到输出文件,写码表时采用深度优先的遍历方法,将形成的二叉树所有左节点标0,右节点标1,再从根节点向下读,得到每个信源符号的码字,形成完整的码表;

第五步:对原文件进行再次扫描并编码输出。

实验代码分析:

第一步:先看代码中的三个结构体,从结构体可以看数据存储的结构:

Huffman节点:


Huffman码字结构体:


存统计信息的结构体:


第二步:根据编码的过程分析代码:

01.第一次扫描文件,得到256个符号对应的频率,并创建256个huffman_node(树叶节点),得到符号频率的代码如下:


02.根据得到的符号频率生成一棵霍夫曼树,从树叶->根,并根据生成的树从根到树叶采用深度优先的遍历方法得到每个符号对应的码字,代码如下:




03.将生成的码表写到输出文件中,代码如下:


04.再次扫描文件,将每个符号对应的码字写入到输出文件中,代码如下:


实验结果分析:

将十种不同格式的文件进行霍夫曼编码,下列是十种不同格式文件符号概率分布图:






十个文件的统计信息如下表所示:


根据结果可以看出,不同的文件编码效率有所差异。对于符号概率分布越不均匀的信源,其编码效率更高,压缩得越好,由于编码后的文件中存入了码表,因此由结果看来,原文件越大,其压缩比才更小。对于一些信源符号概率分布较为均匀,且文件大小较小的文件如本实验中的gif文件和rar文件,其编码后的文件大小与原文件相差不大甚至可能比原文件更大,就是因为码表的原因。

通过该实验,可以验证霍夫曼编码的编码效率是比较高的,编码后的平均码长与香农定理中给出的变长编码码长的下界很接近了。也可以看出熵编码对于概率分布不均的信源其压缩效果更好,因此在实际操作中应尽量信源转换为概率分布不均的模型后再对其进行熵编码。除了验证了霍夫曼编码的效率外,还通过该实验了解了数据结构和数据的存储方式等相关的知识。


原创粉丝点击