用面向对象方法实现字典压缩编码.DOC

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
用面向对象方法实现字典压缩编码

改进的字典压缩LZW编码 向君 摘要:本文用 Object Pascal 语言实现了 LZW 压缩方法,并用面向对象方法进行封装,还在其编码算法上做了改进,实现了零搜索,大大加快了编码速度。 关键词:面向对象,字典压缩 一.字典压缩方法简述 目前广泛采用的字典压缩方法包括两种类型:一种是在数据压缩过程中,寻找当前等待进行压缩处理的数据串中是否在已经处理过的数据串中出现过,如果确实曾经出现过,则利用指向该已经进行处理数据串的指针代替当前等待进行压缩的数据串。此时,字典是隐式的,它用曾经处理过的数据描述。这类字典压缩算法都是基于Abraham与Jakob Ziv于1977年提出并发表的LZ77算法,该算法提出后,Storer与Szymanski于1982年对其进行了改进,并提出相应的LZSS算法,成为现在实践中广泛使用的该类算法的基础。如流行的压缩程序:WINZIP,PKZIP等就是基于这种算法的。另外一种字典压缩算法是为输入数据创建一个短语字典,如果在当前等待进行压缩的数据流中发现字典中已经存在相应的短语,则利用该短语在字典中的相应索引值取代原始数据,这种类型的算法基于Lampel与Ziv在1978年提出并发表的LZ78算法。后来该压缩算法由Sperry公司的研究员Welch于1984年在硬件设计过程中,改进并用于高性能磁盘控制器的设计,同时,由Lempel和Ziv在实际工作中实现,LZW编码也由此而得名。这种编码不仅可以用于文字数据的压缩,而且也可以成功地用于某些图像数据的压缩处理,如GIF和TIFF等图像格式。本文正是基于这种LZW编码的。 二.算法改进 有关LZW原理和传统编码过程这里就不再赘述。下面提出的是该算法的几个改进方面。 (1)面向对象 使用面向对象设计方法对于用户来说是有利的。如用户在用该算法进行数据压缩时,只需创建一个编码对象,使用对象的三个方法:GetBegin,Execute,GetEnd即可轻松实现。在对算法功能进行改进或添加时,只需继承该类和重载方法。 本文使用的开发工具是Delphi5.0,封装过程定义了ExportData和Execute这两个虚方法,重设这两个方法可以修改或扩充算法执行过程和数据输出过程。 其中编码和解码类都使用Execute方法作为核心过程,Execute方法的说明如下: procedure Execute(Data: array of Byte; DataSize: Integer); virtual; Data是一个指针,指向待处理数据的首地址;DataSize是待处理数据的大小;处理完毕后的数据保存在对象内部,使用GetExportPointer方法可得到该地址指针,然后调用GetExportSize方法返回输出数据的大小。 (2)零搜索 本文实现了真正意义上的零搜索,这是LZW算法区别于LZSS算法的一点。 对于LZSS算法来说,查找过程作为其核心过程总不可避免的存在,而传统LZW算法在早期由于内存空间的限制,编码表不能过大,但这样导致以字头码和字尾码建立索引时,要依赖于一个有效的索引公式。但不同的字头码和字尾码可能产生相同的索引值,字典存放地址也就可能会被占用,于是还得查找一个自由的地址空间,这样使得算法在查找过程上开销不少。如何才能使根据字头码和字尾码建立的索引值不重复,显而易见的办法是以其本身的值合成为内存地址,依靠指针进行定位,从而不再需要查找过程。但在16位操作系统下,若数据处理位是8位的话,至少需要的空间为2^16,刚好是16位操作系统寻址能力的极限,操作系统无法分配这样大的堆空间。降低数据处理位也许是一种方法,但理论上其编码效率是低于8位的,而且在编码时还要进行复杂的位处理过程,于是这种方法也不可取。 如今32位操作系统已成主流,其寻址能力可达4GB,再加上硬件设施大大提高,物理内存空间一般达到了128MB,技术上虚拟内存可达4GB,使得上述方法成为可能。在标准数据处理上采用这种方法,编码表实际使用内存空间仅为2MB。 (3)动态编码长度 这是借鉴了LZW For GIF的思想,使用动态编码长度进一步提高了算法效率。这种方法允许压缩代码长度的更改,即利用不固定长度的代码存储压缩数据。LZW算法一般从9位开始编码,这时存储代码也是9位,直到编码增加到10位时,存储代码才增加到10位。传统的LZW算法是直接存储最大编码位的,这样做导致非编码数据也要存储这样大的位数,浪费了完全没有用处的几个高位。考虑到字典编码是按位逐渐增大的,于是应用动态编码既能保证字典编码的完整,又能起到对非编码数据的优化作用。但应用动态编码在存储代码时需要增加一个位处理过程。 三.数据结构 常量定义: NOCODE = -1; // 空

您可能关注的文档

文档评论(0)

2105194781 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档