基于改进哈夫曼编码的数据压缩方法研究
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第36卷第5期 唐山师范学院学报 2014年9月 Vol.36 No.5 Journal of Tangshan Teachers College Sep. 2014
────────── 收稿日期:2014-04-10
作者简介:张红军(1979-),男,河南平舆县人,硕士,讲师,研究方向为网络与多媒体技术。
-40-
计算机科学与技术
基于改进哈夫曼编码的数据压缩方法研究
张红军,徐 超
(安阳师范学院 人文管理学院,河南 安阳 455000)
摘 要:作为一种无损压缩编码方法,哈夫曼编码在数据压缩中具有重要的应用。
经典的哈夫曼编码是在构造哈夫曼的基础上自下而上进行的,通过分析哈夫曼算法的思想,给出了一种改进的哈夫曼数据压缩算法。
该算法利用队列结构,从哈夫曼的根节点出发,向叶子节点进行编码,在编码过程中仅将哈夫曼树的每个叶子节点进行一次扫描便可以得到各个叶子节点的哈夫曼编码。
实验表明,改进算法不仅压缩率高于以往算法,而且保证了最终生成的压缩文件的安全性。
关键词:哈夫曼编码;哈夫曼算法;改进;数据压缩 中图分类号:TP312
文献标识码:
A 文章编号:1009-9115(2014)05-0040-04
DOI :10.3969/j.issn.1009-9115.2014.05.015
Research of Data Compression Method Based on the Improved
Huffman Code Algorithm
ZHANG Hong-jun, XU Chao
(College of Humanistic and Management, Anyang Normal University, Anyang 455000, China)
Abstract: As a non-losing compressing coding algorithm, Huffman coding has many important application to the current data compression field.The classic algorithm to get Huffman coding is from bottom to top on the basis of the Huffman tree. This paper gives an improved Huffman algorithm of data compression by the analysis of the Huffman algorithm, in which algorithm go from the root node to leaf nodes of the Huffman tree by using the queue structure.In the coding process, every leaf node is only scanned once before getting the Huffman coding.The experimental result shows the fact that the improved algorithm not only the compression ratio is higher than classic algorithm, but also ensure the security and confidentiality of the resulting compressed.
Key Words: Huffman coding; Huffman algorithm; improve; data compression
在互联网时代,在数据通信传送和下载中,媒体数据(包括视频媒体和音频媒体等)采用数字化的格式,大量的数据资源给存储器的存储容量、通信信道带宽和计算机处理速度带来很大的负担,但因当前科学技术发展有限,很多硬件技术还无法完全满足计算机存储资源的需求,与带宽之间差距还很大,仅靠通过增加存储容量、扩充信道容量以及提高计算机处理速度等方法来解决这个问题还有一定难度,这就需要考虑压缩。
压缩的关键技术在于设计合理的编码技术,如果在计算机通信数据传输过程中,根据各字符在电文中出现的频率的高低,采用变长的二进制
位表示,出现频率高的字符则编码较短,出现频率低的则编码较短的原则对报文字符重新进行编码,从而使原本很长的电文代码大大缩短,得到平均长度最短的电文编码,使报文在存储和传输中,存储空间降低,信息传输效率提高,实现压缩目的[1]。
计算机数据编码方式有哈夫曼编码、限定长度变化编码、算法编码等。
作为一种无损数据压缩编码,哈夫曼编码广泛应用于文本、图像、视频压缩、通信数据传输、密码等信息压缩编码标准中。
但目前的哈夫曼编码方式是通过对构造好的哈夫曼树进行自下向上的方式实现数据编
张红军,等:基于改进哈夫曼编码的数据压缩方法研究
-41-
码,该方式有一些可以待改进之处[2,3]:在算法的时间复杂度上,如果定义叶子节点所在的层次为第1层,其父节点为第2层,依次类推,处在第n 层上的节点要被扫描n-1次,在程序运行过程中存在着许多指针移动,其时间复杂度为O(n 2)。
针对以上问题,本文设计出一种改进的哈夫曼编码方式,它不仅可实现从树的根节点向叶子节点的编码,而且可以使编码的时间复杂度降低为O(n),从而节省了程序的执行时间,达到了高效压缩的目的。
1 哈夫曼编码与数据压缩理论
哈夫曼编码是David Huffman 于1952年提出的一种编码方法,其理论基础是根据字符出现的频率值来构造出一棵哈夫曼树,利用该哈夫曼树来设计平均长度最短的前缀编码,从而实现用最短的编码表示最常用的数据块或出现频率最高的数据。
因其编码效率最接近或达到100%,有时又称为最佳编码,通常应用在数据通信、数据传送以及对数据的压缩处理等方面。
1.1 数据压缩
数据压缩是一种对原始的数据进行一系列的再次编码,这样可以消除掉原始数据中多余的数据,可以把数据量减低到最小,从而达到压缩处理计算机上图像、音频以及视频等各种媒体数据的目的。
一般来说这种技术的产生是因为多媒体数据的量太大,很容易对计算机的存储造成负担,对网络的传输带来不便,如果按照帧的速率为25帧/秒,那么1 s 传输的数据量也只有25 MB 左右,用640 MB 的光盘进行存贮也只能存放仅仅25 s 的动态画面,因此需要对其进行数据压缩,压缩后的文件和数据到需要时通过解压或者还原,通过对数据的冗余进行很大程度的压缩,才更有可能方便计算机的存贮和传输[4]。
常见的压缩方法有无损压缩方法和有损压缩方法。
无损压缩方法是压缩后的数据经解压缩还原后,得到数据与原始数据是完全一样的,是一种基于信息原理的可逆编码方法。
无损压缩方法常用的有游程编码、基于字典编码技术的LZW 算法和基于哈夫曼编码原理的压缩算法[5]。
1.2 哈夫曼树
哈夫曼树(Huffman 的音译,又叫赫夫曼、霍夫曼),是由n 个带权叶子结点构成的所有二叉树中带权路径长度WPL 最小的二叉树,是一种带权路径长度最短的树,又叫最优二叉树。
1.3 哈夫曼树算法的构造过程
(1)根据给定的n 个权值{w 1,w 2,…,w n }对应的n 个结点,构造n 棵只有根结点的二叉树,n 棵二叉树构成了二叉树的森林F={F 1,F2,…,F n }。
(2)在森林F 中选取两棵根结点权值最小的二叉树作为左、右子树,构造一棵新的二叉树,置新二叉树根结
点权值为其左、右子树根结点权值之和。
(3)从森林F 中删除被选中的两棵树,同时将新得到的二叉树加入森林F 中。
(4)重复(2)、(3)两步,直到森林中只含有一棵二叉树为止,此时得到的这棵二叉树即为哈夫曼树。
例如,给定权值集合为w={5,2,7,10,4,18,32,22},可以构造如下图1所示的哈夫曼树。
图1 哈夫曼树的构造
1.4 哈夫曼编码算法
哈夫曼编码算法基本思想:以每个电文的使用频率为权值构造哈夫曼树,然后在构造好的哈夫曼树约定:叶结点表示电文字符,向左的分支(即左子树)用0表示,向右的分支(即右子树)用1表示,从根结点开始,沿线到达各频度电文字符的叶子结点,所经过的分支代码序列就构成了相应频度电文的哈夫曼编码。
利用哈夫曼算法,可以设计出最优的前缀编码[6]。
1.5 哈夫曼编码的构造
例,电文字符集{a,b,c,d,e,f,g,h}出现的频度分别为{10,4,2,5,7,18,32,22},其哈夫曼编码构造如图2所示。
图2 哈夫曼编码的构造
1.6 现有编码的弊端
在数据压缩中,哈夫曼编码是一种变长编码,采用的
第36卷第5期 唐山师范学院学报 2014年9月
-42-
是一种优化静态编码方法。
具有以下不足:
(1)需要事先知道输入码字符集的频率分布,在不同的数据文件中,不同字符出现的频率不同。
(2)需要对原始数据块扫描两次:第一次是统计原始数据中各符号出现的频率并排序,利用得到的频率值创建哈夫曼树并将树的有关信息保存起来,便于解压时使用;第二次是进行编码,根据前面得到的哈夫曼树对原始数据进行编码,并将编码信息存储起来,便于存储和传输。
如果将这种方法用于数据的网络通信中.两遍扫描势必会引起较大的延时,两次扫描所引发的低效率不容忽视;同时,如果用于文件数据的压缩中,重复扫描增加了磁盘访问,额外的磁盘访问将会降低该算法的数据压缩速度,从而降低压缩效率[7]。
2 改进的哈夫曼编码算法
本算法用二叉树层次遍历方式,利用队列(Queue )对整棵哈夫曼树进行一次扫描,即可得到各节点的哈夫曼编码。
2.1 数据结构设计
在本结构体中,除了包含节点的编码信息域及权值之外,还应包含该节点所对应的排序码key ,指向其右右孩子的指针left 和right ,指针其双亲结点的指针parent ,具体设计如下:
Typedef struct node *BT; Struct node { char date,key[10]; Int weight;
Struct node *left,*right,*parent;};
本算法采用循环队列,head 指向队头节点,tail 指向队尾节点,numbers 表示当前队列中节点的个数,queuelist[]是表示队列的数组。
Typedef struct circle {
int head,tail; int numbers; BT queuelist[size];}; 2.2 算法描述
改进算法从哈夫曼的根节点出发,通过利用队列,按照层次遍历的方法依次对树中每个叶子节点进行编码。
算法执行过程如下:
(1)根据字符集{c1,c2,…,cn }和相应的权值集{w1,w2,…,wn}建立相应的哈夫曼树,并将哈夫曼树的根节点入队;
(2)当队列为非空时,递归执行以下操作: a .指针p 指向当前队头节点;
b .若当前队头节点无双亲节点,表示该节点为根节点,将该根节点出队(Dequeue ),并让其左孩子节点和右孩子节点先后入队(Enqueue );
c .若当前节点有双亲节点,则给其左、右孩子节点分别赋值为父节点的哈夫曼编码,然后,若此节点为其父节点的左孩子,则在其父节点所赋给的编码后面加一个“0”,若此节点为其父节点的右孩子,则在其父节点所赋给的编码后面加一个“1”;由于根节点无编码,可以直接分别得到“O ”,“1”作为自己的编码;
d .队头节点出队;若出队节点有左右孩子节点,则让其左右孩子分别入队,若出队节点没有左右孩子节点,转向
e ;
e .判断当前队列是否为空,若为空则编码工作完成。
编码过程如图3所示。
图3(a)表示一棵已经建好但还未进行编码的二叉树。
图3(b)表示对根节点的孩子进行编码。
图3(c)表示先将B 节点的编码“0”赋给其孩子节点D 和E ,而D 是B 的左孩子,故在编码“0”的后面加“0”,E 是B 的右孩子节点,故在编码“0”的后面加“1”;同理,将C 节点的编码“1”赋给其孩子节点F 和G ,而F 是C 的左孩子,故在编码“1”的后面加“0”,G 是C 的右孩子节点,故在编码“1”的后面加“1”;图3(d)表示先将D 的编码“00”赋给其孩子节点H 和I ,H 是D 的左孩子,故在编码“00”后面加“000”,I 是D 的右孩子,故在编码“00”后面加“001”。
(a)编码前的哈夫曼树
(b)给第3
层节点编码
(c)给第2层节点编码 (d)给第1层节点编码
图3 编程过程示意图
2.3 算法具体实现流程
开始;
将根节点入队列;
判断队列是否为空;如果为空,则转向j ; 指针q 指向队头节点;
张红军,等:基于改进哈夫曼编码的数据压缩方法研究
-43-
判断q 是否为根节节;如果是根节点,则转向h ;否则复制其父节点的编码信息;
判断该节点是父节点的左孩子还是右孩子;如果是左孩子,则在复制的父节点的编码后面添加一个“0”,否则在复制的父节点的编码后面添加一个“1”;
队头节点出队;
判断出队节点是否有左右孩子,如果有,则将出队节点的左右孩子节点入队,否则转向c ;
结束。
利用C 、C++或VC++等编程语言,可以方便地将该算法进行具体实现。
2.4 算法测试
假定某个压缩信息所含的五种字符a,b,c,d,e 出现频率分别为10,16,5,6,9。
如果采用ASCII 码表示该信息需要
8*(10+16+5+6+9)=368位。
如果通过调用本文描述的算法,对这五种字符进行哈夫曼编码,得到这五种字符的编码表为
a:00, b:11, c:100, d:101, e:01。
该信息编码后的码长为
2*16+2*(9+10)+3*(5+6)=103位。
从测试结果看,压缩后的字符传送编码要比原来的小,因此在报文存储和传输中,用改进的哈夫曼算法可以达到压缩的目的,减少了存储空间,提高了信息传输效率。
2.5 算法效率分析
用改进的编码算法对m 个节点进行改进编码,生成的哈夫曼树共有2m-1个节点。
本改算法通过队列对节点进行编码,所以每个节点只扫描了一次。
因此该改进算法在有2m-1个节点的哈夫曼树上的执行频度为2m-1,其时间复杂度为O(n)。
3 结束语
哈夫曼编码作为一种无损数据压缩编码,被证明是一种有效的熵编码方式,也是一种有效的数据压缩算法[8]。
本文所介绍的这种改进的哈夫曼编码方法和实现流程,具有一般哈夫曼编码节省存储空间的特点,在算法的时间复杂度上有很大程度的改观,其应用优势更为明显。
实验表明,改进的算法在压缩率上优于传统经典算法,从而降低存储空间,提高信息传输效率。
研究哈夫曼码算法只是增强编码压缩效果的一个环节,如何利用好这个算法,可作进一步的研究。
[参考文献]
[1] 卢冰,刘兴海.利用改进的哈夫曼编码实现文件的压缩
与解压[J].科技通报,2013(6):22-24.
[2] 王防修,周康.基于二叉排序树的哈夫曼编码[J].武汉工
业学院学报,2011(12):45-48.
[3] 张凤林,刘思峰.Huffman:一个改进的Huffman 数据压缩
算法[J].计算机工程与应用,2007,43(2):73-74.
[4] 朱怀宏,吴楠,夏黎春.利用优化哈夫曼编码进行数据压
缩的探索[J].微机发展(现计算机应用与研究),2002(5): 1-4.
[5] 叶倩,张俊兰,冯雄伟.浅析数据压缩技术[J].延安大学学
报(自然科学版),2008(4):29-33.
[6] 王国钧,唐国民.数据结构第2版(C 语言)[M].清华大学
出版社,2013:133-138.
[7] 程佳佳,熊志斌.哈夫曼算法在数据压缩中的应用[J].电
脑编程技巧与维护,2013(2):35-37.
[8] 付勇.一个利用小顶堆构造哈夫曼树的C++算法[J].计
算机应用与软件,2011(3):253-256.
(责任编辑、校对:田敬军)。