LZW算法分析及C++模拟实现.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
LZW算法分析及C++模拟实现   【摘要】LZW算法是一种无损数据压缩算法。本文通过介绍LZW压缩算法基本概念及示例的压缩编码过程分析和用C++语言进行了编码算法的模拟实现,阐述了LZW算法原理和压缩算法流程。   【关键词】压缩技术 LZW算法 编码 解码   【中图分类号】G64 【文献标识码】A 【文章编号】1009-9646(2008)10(a)-0216-02      LZW压缩算法是一种无损数据压缩算法。在众多的压缩技术中,LZW算法是一种通用的、性能优良并得到广泛应用的压缩算法,它是一种完全可靠的算法,与其他算法相比,往往具有更高的压缩效率,因此被广泛应用于多种流行的压缩软件中。它采用了一种先进的串表压缩法,将每个第一次出现的串放在一个串表中,用一个字来表示串,压缩文件只存贮数字,则不存贮串,从而使图象文件的压缩效率得到较大的提高。奇妙的是,不管是在压缩还是在解压缩的过程中都能正确的建立这个串表,压缩或解压缩完成后,这个串表又被丢弃。      1 LZW压缩算法的基本概念:   LZW压缩有三个重要的对象:数据流(CharStream)、编码流(CodeStream)和编译表(String?Table)。在编码时,数据流是输入对象(图象的光栅数据序列),编码流就是输出对象(经过压缩运算的编码数据);在解码时,编码流则是输入对象,数据流是输出对象;而编译表是在编码和解码时都须要用借助的对象。   .字符:最基础的数据元素,在文本文件中就是一个字节,在光栅数据中就是一个像素的颜色在指定的颜色列表中的索引值;   .字符串:由几个连续的字符组成;   .前缀:也是一个字符串,不过通常用在另一个字符的前面,而且它的长度可以为0;   .根:单个长度的字符串;   .编码:一个数字,按照固定长度(编码长度)从编码流中取出,编译表的映射值;   .图案:一个字符串,按不定长度从数据流中读出,映射到编译表条目。      2 基本原理   LZW压缩的原理:提取原始图象数据中的不同图案,基于这些图案创建一个编译表,然后用编译表中的图案索引来替代原始光栅数据中的相应图案,减少原始数据大小。看起来和调色板图象的实现原理差不多,但是应该注意到的是,我们这里的编译表不是事先创建好的,而是根据原始图象数据动态创建的,解码时还要从已编码的数据中还原出原来的编译表(GIF文件中是不携带编译表信息的)。   一个具体的例子,不是完全实现LZW算法,只是从最直观的角度看lzw算法的思想。 对原始数据ABCCAABCDDAACCDB进行LZW压缩。   原始数据中,只包括4个字符(Chara cter),A,B,C,D,四个字符可以用一个2bit的数表示,0-A,1-B,2-C,3-D,从最直观的角度看,原始字符串存在重复字符:ABCCAABCDDAACCDB,用4代表AB,5代表CC,上面的字符串可以替代表示为:45A4CDDAA5DB,这样是不是就比原数据短了一些呢!从这个原理可以看出LZW算法的适用范围是原始数据串最好是有大量的子串多次重复出现,重复的越多,压缩效果越好。   2.1 LZW编码算法   步骤1:将词典初始化为包含所有可能的单字符,当前前缀P初始化为空。   步骤2:当前字符C:=字符流中的下一个字符。   步骤3:判断P+C是否在词典中(1)如果是,则用C扩展P,即让P:=P+C,返回到步骤2。(2)如果否,则输出与当前前缀P相对应的码字W;将P+C添加到词典中;令P:=C,并返回到步骤2。   步骤4:判断字符流中是否还有字符,如果“是”,就返回步骤2,如果否,把代表当前前缀P的码字输出到码字流。   词典初始化完成后,在接下去要固定创建的两项是一个清除码(clear code)和一个结束码(end code),在词典将满时,压缩程序要输出一个清除码,同时把词典和前缀码和当前串都再次初始化,再按压缩过程继续压缩数据。清除码的作用是告诉解压缩程序再次初始化词典。结束码告诉解压缩程序图象已经结束,解压缩过程已经完成。   2.2 LZW解码算法   数据的解码,其实就是数据编码的逆向过程,要从已经编译的数据(编码流)中找出编译表,然后对照编译表还原数据。   * 词典中包含所有的前缀根(即每个字符组成词典)   * 译码时先记住先前码字(pW)   * 从码字流中读出当前的码字(cW)   * 输出当前的码字(cW)对应的单词,string(cW)   * string(pW)与string(cW)的第一个字符合在一起,放入词典中。      3 LZW编码过程的一个简单示例分析及c++语言的模拟实现   3.1 简单示例分析   原输入数据为:

文档评论(0)

聚文惠 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档