LZW压缩算法编解码示例

来源:互联网 发布:俄罗斯经济数据网站 编辑:程序博客网 时间:2024/06/15 21:56
LZW压缩算法是Lempel-Ziv-Welch 3个人共同发明的,简称 LZW 的压缩算法,可以用任何一种语言来实现它.
LZW是GIF图片文件的压缩算法,而且zip压缩的思想也是基于LZW实现的,所以LZW对文本文件具有很好的压缩性能。

LZW压缩算法的基本原理:提取原始文本文件数据中的不同字符,基于这些字符创建一个编码表,然后用编码表中的字符的索引来替代原始文本文件数据中的相应字符,减少原始数据大小。看起来和调色板图象的实现原理差不多,但是应该注意到的是,我们这里的编码表不是事先创建好的,而是根据原始文件数据动态创建的,解码时还要从已编码的数据中还原出原来的编码表.

编码表中每一项的大小一般为12位,用来代表一个字符串。这样编码表有2**12=4096项,编码值是0~4095。通常情况下0~255是固定的,用来代表单个字符0~255。而值256通常用来表示开始新的编码表,因为如果编码表的4096项都用完了,而待压缩文件还没有处理完,那么就需要生成新的编码表继续压缩;257表示压缩结束,用来写到压缩文件尾。从258开始,每个值都代表一个字符串(至少2个字符)。

--------********************----------
LZW算法流程:

1)初始化:将所有的单字符串放入串表
2)
读第一个输入字符给前缀串ω
3)Step:
读下一个输入字符K;
if
没有这样的K(输入已穷尽)
  码字(ω)输出;结束。

If ωK已存在于串表中:
  ωK:=ωrepeat Step
else ωK
不在于串表中:
  码字(ω)输出;
  ωK加进串表;
  K:= ω;repeat Step.
4) 判断码字流中是否还有码字要译
  (1) 如果“是”,就返回到步骤2;
  (2) 如果“否”
  ① 把代表当前前缀P的码字输出到码字流;
  ② 结束。

--------********************----------

示例:ababcbababaaaaaaa

编码过程:

串表

a

b

c

ab

ba

abc

cb

bab

baba

aa

aaa

aaaa

 

LZW

 

 

 

a

b

ab

c

ba

bab

a

aa

aaa

a

解码过程:

串表

a

b

c

ab

ba

abc

cb

bab

baba

aa

aaa

aaaa

结果

 

 

a

b

ab

c

ba

bab

a

aa

aaa

a


0 0
原创粉丝点击