请问:LZW压缩后如何还原

leetow2003 2012-07-19 10:11:48
请看:
我把BABAABAAA压缩后是这样的:
<66><65><256><257><65><260>
其中<256>=BA,<257>=AB,<258>=BAA,<259>=ABA,<260>=AA,
这些字典按照LZW原理推出来的,
现在我想把<66><65><256><257><65><260>还原出来,
可是我只能推出这些:
<256>=BA,<257>=AB,<258>=BAA,<259>=ABA
所以没有办法还原,请问
LZW压缩后如何还原?它的字典是如何建立的?
...全文
121 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
因为压缩时,压到第二个<65>,会同时向字典里扔入一个新的key,这个新的key和<65>对应的有共同前缀。并且长度比<65>对应的key长度多1.

解压时,解压出的编码是<66>=B,<65>=A,<256>=BA,<257>=AB,<258>=BAA,<259>=ABA

然后解压的序列是<66><65><256><257><65><260>

解压到第二个<65>时,解压出来的序列是BABAABA,我们按理说应该向字典里插入一个新key,但是由于后面的内容是未知的,所以这个key必需在下一步才能知道。如果下一个编码已经在字典里,很好办,但是<260>是一个新key。

根据压缩的算法,我们知道这个新key一定是和<65>拥有相同的公共前缀,并且长度加1,所以这个key应该是Ax,x的值未知。对比一下:
<66><65><256><257><65>对应的是
BABAABA
<66><65><256><257><65><260>对应的是
BABAABAAx

注意标红的部分,应该是错位相等的(假设红色部分为一个String 变量mix),那么应该有
mix.substring( 0, mix.length - 1 ) == mix.substring( 1, mix.length )
mix.substring( 0, mix.length - 1 )表示压缩时我们新生成的key,放入字典的内容
mix.substring( 1, mix.length )表示压缩时使用字典里的编码对应的内容

所以不难求出x==A,从而知道<260>=AA

同理,假设我们解压中,解压到一个key是AABBCCDDEFFF,然后解压下一个却无法在字典中查到,立即可以知道下一个key应该是AABBCCDDEFFFx,并且由于使用了这个key,所以这个key的内容就是AABBCCDDEFFFA。

我似乎还是解释的很不清楚。



leetow2003 2012-07-19
  • 打赏
  • 举报
回复
260的前缀和65的前缀必然一样,并且260的长度比65的长度大1,65对应的key是A,从而不难推出260对应的key是AA
===========================
这个实在是搞不明白,能说得清楚些吗?
  • 打赏
  • 举报
回复
压缩比较容易,注意压缩时,每次都是找到一个在字典中存在的key,然后将一个新key放入字典中,这个新key的长度是原来的key的长度加1,并且他们的前缀是完全一样的。记住这一点。

解压缩时,每次都是先还原一部分,然后再向字典里放一个新key,也就是有些人所谓的早一步还原。比较难理解的就是楼主遇到的260这一块。因为这个时候字典里最大的key对应的编码是259。

但是你可以对比一下压缩步骤,就知道260对应的key必然是在压缩到第二个65时产生的,所以260的前缀和65的前缀必然一样,并且260的长度比65的长度大1,65对应的key是A,从而不难推出260对应的key是AA。

楼主可以再仔细想想。

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧