文本压缩算法的比较研究
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第22卷 第12期
2006年12月
甘肃科技
Gansu Science and Technology
V ol.22 N o.12Dec. 2006
文本压缩算法的比较研究
徐成俊1,舒 毅1,柴 蓉2,张其斌1,田全红1,郝 涛3
(1甘肃省计算中心,甘肃兰州730030;2西北师范大学,甘肃兰州730070;3兰州理工大学甘肃兰州730050)
摘 要:论述了4种不同的文本压缩算法。根据压缩算法的优点和缺点,在实践中,要有针对性选
择算法,用其优点,从而得到比较理想的压缩文本。关键词:压缩算法;哈夫曼;算术;L Z ;游程中图分类号:TP391
1 引言
随着计算机技术的快速发展,各种系统数据量越来越大,给信息存储特别是网络传输带来诸多的困难,己成为有效获取和使用信息的瓶颈。为了节省信息的存储空间和提高信息的传输效率,必须对大量的实际数据进行压缩。实践证明,采用数据压缩技术可以节省80%以上的费用,且一些难点问题通过压缩技术能够实现。
数据压缩技术种类繁多、应用广泛,技术不断发展,一些分支已成为当今研究的焦点。按照编码的失真程度数据压缩可以分为有损压缩和无损压缩。有损压缩即原始数据不能完全恢复,主要应用于图像和数字化的语音方面。无损压缩就是经过一个压缩后,能够产生和输入完全一致的压缩技术,主要用于存储数据库记录或处理文本文件。
2 目前主要文本压缩算法
文本压缩是根据一定方法对大量数据进行编码处理以达到信息压缩存储过程,被压缩的数据应该能够通过解码恢复到压缩以前的原状态,而不会发生信息丢失现象。发展到现在已经有很多关于文本压缩的算法,主要有Huff man 编码、算术编码等无损压缩和预测编码、量化、变换编码等有损压缩。如图1所示。
本文对常见的几种无损压缩算法进行综合分类,比较研究。
3 算法描述
3.1哈夫曼编码
美国数学家David Huff man 在上世纪五十年
代初就提出了这种编码,其主导思想是根据字符出
现的概率来构造平均长度最短的编码,并且保持编码的唯一可解性。也就是说,在源数据中出现概率越高的字符,相应码字越短;出现概率越小的字符,其码长越长,从而达到用尽可能少的码符号来表示源数据,达到压缩的效果。哈夫曼编码是一种变长的编码(因为其长度是随符号出现的概率而不同),在编码过程中,若各码字长度严格按照码字所对应符号出现概率的大小的逆序排列,则编码的平均长度是最小的。它最根本的原则是累计的(字符的统计数字3字符的编码长度)为最小,也就是权值(字符的统计数字3字符的编码长度)的和最小。
图1 文本压缩的分类
哈夫曼编码的编码过程如下:①对源信号的出现频率进行统计,每个源信号根据它出现频率大小被赋予一定的编码,高频率的信号对应短码,低频率的信号对应长码。
②用信号对应的编码去取代源数据中的信号。在已知源数据流中各字符发生的概率情况下使用,即在压缩数据时,遵循固定的源数据符号代码表。在不允许两次扫描源文件的情况下,往往根据先验统计概率或假设构造这张代码表。压缩处理时,若源数据流中的符号与代码表中的符号相匹配,则用与之相对应的较短的代码替代该字符,否则不
予处理。同时Huff man编码有一个十分重要的特性:任何一个编码决不会是其他编码的前缀。这一特性保证了对编码译码时的唯一性。因此,它是一种简单而且实用的算法,但不是最好的算法。因为Huff man编码在实际中只对单一、完备性的信号进行编码,穷举源数据中所有可能的信号是很困难的,而且压缩时必须知道每一要压缩的字符在文本中出现的概率,这势必造成两遍扫描输入串:第一遍统计原数据中各字符出现的频率,利用得到的频率值创建哈夫曼树,并必须把树的信息保存起来,以便解压时创建同样的哈夫曼树进行解压;第二遍则根据第一遍扫描得到的哈夫曼树进行编码,并把编码后得到的码字存储起来。显然,这种固定的代码表与源文件的匹配程度决定了该文件的压缩比。
这种编码方法是静态的哈夫曼编码,静态哈夫曼编码方法有一些缺点:①对于过短的文件进行编码的意义不大,因为光以4B YTES的长度存储哈夫曼树的信息就需1024Bytes的存储空间;②进行哈夫曼编码,存储编码信息时,若用于通讯网络,就会引起较大的时延;③对较大的文件进行编码时,频繁的磁盘读写访问会降低数据编码的速度。
后来在传统的Huff man编码的基础上产生了动态的Huff man算法,其基本的思想就是构造一棵动态变化的哈夫曼树,对第t+1个字符的编码是根据原始数据中前t个字符得到的哈夫曼树来进行的,编码和解码使用相同的初始哈夫曼树,每处理完一个字符,编码和解码使用相同的方法修改哈夫曼树,因此,这棵树能够随输入串的输入而不断的调整修改,保证它反映所输入串数据变化着的概率。并根据不同源文件的具体内容,采用完全不同的方法动态地构造代码表,并在构造代码表的同时进行编码压缩。其压缩算法框图如图2所示。
从上可知动态的Huff man编码只需一次扫描,没有必要为解码而保存哈夫曼树的信息,无须维护和传输串码对应表,对字符在整个串中出现频率不均现象有很好的压缩效果。
3.2算术编码
算术编码是基于统计的、无损数据压缩效率最高的方法。其与霍夫曼编码的一个很大的不同就是它跳出了分组编码的范畴,而是从全序列出发,采用递推形式的连续编码。它不是将单个的信源符号映射成一个码字,而是将整段要压缩的整个数据序列映射到一段实数半封闭范围[0,1]内的某一区段。其长度等于该序列的概率,即是所有使用在该信息内的符号出现概率全部相乘后的概率值。当要被编码的信息越来越长时,用来代表该信息的区段就会越来越窄,用来表达这个区段所需的二进位就越多。因此,它避开用一个特定码字代替---输入符号的思想,不需要传送像霍夫曼编码的霍夫曼表,而用一个单独的浮点数来代替一串输入符号,避开了Huff man编码中比特数必须取整的问题,而且算术编码还有自适应能力的优点。但是算术编码也有一些不足之处:①很难在具有固定精度的计算机完成无限精度的算术操作;②高度复杂的计算量不利于实际应用;③也是需两次扫描源数据流
。
图2 压缩算法图
3.3基于字典的LZ系列编码
字典算法是最为简单的压缩算法之一。它是把文本中出现频率较高的字符组合做成一个对应的字典列表,并用特殊代码来表示这个字符。基于字典的L Z系列编码包括:L Z77算法、L ZSS算法、L Z78算法、L ZW算法等几种基本算法,是通用数据压缩主流。L Z78和L ZW两种算法的编译码方法较为复杂,实现起来较为困难,而L Z77算法的压缩率又相对较低,比较而言L Z77算法在单片机上实现起来较为理想,其压缩率较高,编译码算法也较为简单。因此,主要论述L ZSS算法,它的字典模型使用自适应方式,基本的思路是搜索目前待压缩串是否在以前出现过,如果出现过则利用前次出现的位置和长度来代替现在的待压缩串,输出该字符串的出现位置及长度,否则输出新的字符串,从而起到压缩的目的。但是在实际使用过程中,由于被压缩的文件往往较大,一般使用“滑动窗口压缩”方式,也就是
28 甘 肃 科 技 第22卷