我一直在研究LZW压缩,有一件事让我无法满足,因为在LZW中构建字典时,其最大限制设置为4096个条目。这是为什么 ?。此外,如果字典变满,则重置字典,但是如果在重置字典之前字典中存在要读取的下几个字符,该怎么办呢?这是一个限制吗?或者我的理解不正确?
答案 0 :(得分:2)
字典大小限制为输出符号大小。 12位可以编码4096个不同的值。这是讲义和简单/作业实现的常见选择。
但是,可以使用比源位多的任何符号位:16位符号将允许65k词典条目。位数越多,当前字典中可以存在的条目就越多,这可以增加“最大”压缩率。相反,随着每个输出符号变大,它可能会降低压缩率,尤其是对于较小的输入(生成词典的时间不足)和更随机的数据(降低了重新使用词典中的符号的能力)而言。实际上,19-20位似乎是有用的限制 2 ,而16位符号自然会与字节对齐。
也有可能基于已映射符号的当前数量 1 -的log2来具有自适应符号大小,但是随着数据大小的增加,该优点会消失,因为字典会快速填充。它在很大程度上也被霍夫曼编码所取代。
当字典被“重置”时,它实际上与压缩多个数据块并附加压缩的输出相同:字典是分开的。但是,可以根据数据何时填充字典来动态“拆分”数据,而不是每输入X个字节。由于符号大小是固定的,因此在做出决定之前确保字典已满会更加有效。
重设字典的主要目的是避免在输入的一部分中将符号“固定”到数据特征中,这对于以后的数据可能不正确。压缩程序可以使用单个非重置词典,在字典满后立即重置,在字典满并遇到压缩下降时重置字典,等等:目标是在域/内实现最高压缩参数。
AlessioLangiu在"On parsing optimality for dictionary-based text compression—the Zip case"中简要讨论了许多LZ77 / LZ78 / LZW变体(以及它们利用的优化);这些摘录包含许多多汁的细节,需要进一步的研究。
R. Nigel Horspool的 1 "Improving LZW'详细介绍了自适应符号大小。奈杰尔(Nigel)的"The Effect of Non-Greedy Parsing
in Ziv-Lempel Compression Methods"论文还总结了compress
对字典重置的处理。
2 "The Relative Efficiency of Data Compression by LZW and LZSS"包括一个符号大小与压缩效率的示例图。该图高度依赖于数据。