- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
LZW压缩算法介绍
LZW压缩算法介绍
(2009-09-16 22:08:24)
LZW是啥意思?懒子王!一听这名就知道这算法不是一般的懒子,要不怎么也称王呢。
懒子王压缩算法是一种新颖的压缩方法,由Lemple-Ziv-Welch 三人共同创造,用他们的名字命名。它采用了一种先进的字典压缩,将每个第一次出现的串放在一个字典中,用一个数字来表示串,压缩文件只存储数字,不存贮串,从而使图象文件的压缩效率得到较大的提高。懒子的是,压缩完了之后这个字典就可以给扔了,解压时会重建起这个字典。
在懒子王算法中,有这么几个概念:
1.字符:不一定是指ASCII字符,就是一个8位二进制数,0--255,unsigned char或是uint8或是BYTE型能表示的。
2.串:一个字符的序列,没有C语言中用'\0'封尾的那种要求。
3.字典:里面存放串,每一个串对应的编码都与字典中的位置形成一一对应。
4.根:字典产生时就带有的东西,比如带有的字符叫根字符,可以分别是0--255,根字符和空前缀组成根串,根串的编码称为根编码。
一个串被表示成(前缀,后缀)格式,前缀可以是一个字符,也可以是一个串的编码,为统一形式,一个字符用对应的根编码表示,所以,前缀是一个编码。后缀就是一个字符,没有别的形式。
还有一点,在字典中有两个特殊的条目,一个是CLEAR,一个是END,比如字典的根编码是0--255,则CLEAR = 256,END = 257。
现在我们来以一个具体的例子说明这个算法是怎么个懒子法的,假设这个字典的根字符是A,B,C,D,4个,加上CLEAR和END一共6个,占用000--101,现在编码长度是3位。输入流里面的字符序列是
ABABABABBBABABAA
第一步,取第一个字符,是A,A已经在我们的字典中了(根字符),也就是说,我们已经(认识)它了,就把它的编码作前缀,成(A,)。
下一步,取第二个字符,现在的取到的串为(A,B)。以前没见过,不认识,好,现在把(A,B)编码为6,下次再碰到就认识了。把A放入到输出流中,让后缀B作前缀(实际是根字符B的编码,为了方便才写B)。
第三步,读下一个字符,是A,现在串是(B,A),还是不认识,用一个新编码来表示它,令7=(B,A)。把前缀B放入到输出流,后缀A变前缀。
第四步,取下一个字符,是B,现在串是(A,B),嘿,这次认识了,不就是老6嘛,好了,让6作前缀去。
第五步,取下一个,是A,现在串是(6,A),又不认识了,令8=(6,A)。等等,有情况!刚才新建的字典条目6,7已经把3位的编码给占满了,这可咋整呀?懒子王是一定有办法解决的,现在懒子王算法的第二点懒子之处就体现出来了,变长编码。刚才编码用3位表示,现在不行了,就用4位表示,现在能表示8了,其它照常,输出前缀6,后缀A变前缀。
就这样,输入流中的数据变成了AB68……放到输出流中,怎么样,变短了吧,嘿嘿。
现在问题又来了,字典里3位不够了用4位来表示可以,因为咱这字典里有地方嘛,可是要是咱建个12位的字典,已经有4096个条目,存满了,再来新串咋整呀,别忘了咱最开始说懒子王的时候说它是怎么懒子的了?字典用完就扔了,解压时能重建,对吧,想想啊,一个字典已经建满了,解压的时候也可以把这个字典重建到满,对吧,如果现在这个输入流结束了,再来个输入流,会出现什么情况呢?压缩时新建个字典,解压时再重建这个字典,对吧,那解决方案就来了,旧字典字典不要了,当作上一个输入流结束下一个输入流开始,从只有根串的字典开始再建一个,怎么样,懒子吧,但这招它就是好使。
总结一下,懒子王压缩算法的基本流程大致如下:
1.从输入流中读入一个字符,作为当前串的后缀。
2.如果当前串在字典中,就用当前串的编码作前缀,转到第1步。
3.如果当前串不在字典中,就把当前串放到字典中,并把前缀放到输出流,后缀变前缀,转到第1步。
4.当输入流读完了后,串中应该还剩一个前缀,把它放到输出流,结束。
解压算法实际就是查字典的过程,也是对串进行处理,以上面的例子为例,输入流是AB68……
第一步,读第一个编码,是A,在字典中,就作为后缀,现在串是(,A),串也在字典中,不作其它处理,把编码A作为前缀,并放入输出流(实际上是把前缀对应的最原始串放入输出流)。
第二步,读下一个编码,是B,也在字典中,作为后缀,现在串是(A,B),不在字典中,就把它加入到字典中,令6=(A,B),把当前编码B作前缀,并放入输出流。
第三步,读下一个编码,是6,在字典中,作为后缀……?看看开头的定义,后缀是一个字符,可不能是编码呀,把6展开,6=AB,我们把6的第一个字符,即A,作为后缀,现在串是(B,A),不在字典中,令7=(B,A),把当
您可能关注的文档
- 4岩石爆破作用原理pptConvertor.doc
- 4云南省高等学校教学团队建设项目.doc
- 4月10日重要经济事项.doc
- 4毕托管测速实验.doc
- 4树脂砂球铁件表层球化不良的防止.doc
- 51单片机c语言电子万年历完整程序.docx
- 51单片机的编程器制作.doc
- 5800公路边坡(开挖点或坡脚点)精准放样.docx
- 555几个简单电路.doc
- 5800编程语言.doc
- 四川省成都市武侯区2023-2024学年九年级上学期期末 道德与法治试题(含解析).pdf
- 重庆市永川区2023-2024学年九年级上学期期末 道德与法治试题(含解析).pdf
- 重庆市永川区2023-2024学年七年级上学期期末历史试题(word版含解析).pdf
- 新疆乌鲁木齐经济技术开发区(头屯河区)2023-2024学年九年级上学期期末 道德与法治试题(含解析).pdf
- 山东省临沂市沂水县2023-2024学年九年级上学期期末 道德与法治试题(含解析).pdf
- 山东省日照市新营中学2023-2024学年九年级上学期期末 道德与法治试题(含解析).pdf
- 山东省枣庄市滕州市2023-2024学年九年级上学期期末 道德与法治试题(含解析).pdf
- 山东省淄博市淄川实验中学2022-2023学年(五四制)六年级上学期期末 道德与法治试题(含解析).pdf
- 山西省阳泉市平定县2023-2024学年九年级上学期期末综合 道德与法治试卷(含答案).pdf
- 陕西省宝鸡市陇县2023-2024学年九年级上学期期末 道德与法治试题(含解析).pdf
文档评论(0)