LZW - 压缩率

时间:2014-05-02 01:48:04

标签: java algorithm compression lzw

好吧,我必须使用LZW算法,我所理解的算法和代码制作一个PPM图像压缩器,并为字符串实现了一个版本(在Java中,用于测试)。

最大的问题在于压缩,因为如果我有:

输入: ABCDABCDABCDABCD

输出: 65 66 67 68 256 258 260 259 257 68

至于我的输入我有16个字符,如果我只是将输出保存为文本文件,没有压缩,因为有34个字符。所以我以为我会保存为二进制文件,然后在我的文件的一个字节中刻录每个字段,但是存在字段> = 256的问题。我还想到了将一些字段设置为发生时的想法值大于255,类似的东西。 :

(在这种情况下,我会删除字段中的255字段和0)

65 66 67 68 256 258 ,将是:

65 66 67 68 255 1 0 255 3 0

然后每个等于255的字段表示连续字节的出现,而sum将是要添加的元素;字节0表示总和的结束。

问题是,即使如此,我的输出也会大于输入和压缩没有意义。然后我会问你是否有办法解决这个问题。

1 个答案:

答案 0 :(得分:2)

LZW具有可预测的下一个数据块大小。因此,您的编码器应该保存保存当前代码所需的位数。你的解码器应该计算下一个代码的位数并读取该位数。

所以你的解码器看起来像

while (read next block){
   read next block bits size
   decode character block
   update dictionary
   next block bits size = dictionary next code bit size
}

压缩算法永远不会在通用情况下工作。 LZW适用于高度重复的数据。对于非重复数据,压缩数据大小将始终大于初始数据大小。