声明:以下方法由本人与whycadi提出,由本人整理发表,未经作者允许禁止使用或实现。
LZW压缩算法是由LZ78压缩算法改进而来,具有压缩速度快和动态还原码表的特点。然而,LZW压缩算法有着压缩率低,码表易快速膨胀,重复字符利用率低的问题。我对于改进LZW压缩算法有几个想法:
1,动态分配码字(针对字典管理)
仔细研究过LZW压缩算法的朋友们都知道,LZW压缩算法输出的码字就是码表索引值,而索引值必然需要8位以上来储存(码表中有压缩价值的元素的索引值都大于256),使得资源浪费极其严重。我们可以在解压和压缩时都将字典作为一个列表使用,一旦某个元素被输出,就将该元素插入到列表首项。在解压时,只需按相同方法对列表进行管理,即可正确还原数据。
示例:
143,123,1,0,453,2,2……
143被使用后索引值变为了0;
123被使用后索引值变为0,143的索引值变成1;
1再次被使用后索引值变为0,123索引值变为1;
0第三次被使用后索引值变为0,其他元素的索引值不变;
453被使用后索引值变为0,0变为1,1变为2;
2再次被使用后索引值变为0,0变为1,1变为2;
2第四次被使用,2变为0,0变为1,1变为2;
……
2,特殊标识码(针对输出优化)
我们只需仔细观察原版LZW压缩算法输出的列表,就会发现输出的元素都是整数类型,且一个码字可能会被输出多次。我们其实也可以利用到这个特点,对算法进行改进。在LZ系列压缩算法里,我们可以尝试参照一下LZ77算法的输出。
在输出码字前,判断该码字是否已经输出过一次:
(是):输出一个字符串类型的特殊标识码,这个特殊标识码是码字在输出列表里的索引值
(否):直接输出一个整数类型的码字。
示例一下,以免你们看不懂&#x