LZW压缩算法是由LZ78压缩算法改进而来,具有压缩速度快和动态还原码表的特点。然而,LZW压缩算法有着压缩比小,码表容易快速膨胀,压缩比容易随着码表的膨胀而减小的问题。我对于改进LZW压缩算法有一个想法:
码字动态分配:
仔细研究过LZW压缩算法的朋友们都知道,LZW压缩算法输出的单个码字就是前缀的码表索引值,而且索引值必然需要8位以上来储存(原生码表中有压缩价值的元素的索引值都大于256),使得资源浪费极其严重。我将加入码表的元素(pc的值)放为第一项(使用的是列表对象),同时将刚刚输出的P的元素项的索引值定为第二项。这样就可提升压缩效果(对比实验中,改进后的LZW压缩算法压缩效果提升了0~20%,理论可以无限提升)。这样既保护了动态还原码表的特点,又提升了效果。
改进后的代码(python):
def codeing(string):
list = [chr(i)for i in range(256)]
p = ""
out = []
for c in string:
pc = p + c
if pc in list:
p = pc
else:
out.append(list.index(p))
list.insert(0,pc)
del list[list.index(p)]
list.insert(1,p)
p = c
if p != '':
out.append(list.index(p))
sw = len(str(out))/len(string)*100,"%"
outb = str(out)
return outb