gzip的不同压缩级别有何不同?

4
我正在努力理解gzip的不同压缩级别(1-9)在实现编码方面的区别。
我查看了zlib C源代码,似乎与搜索最长匹配字符串的详尽程度有关,但是寻找更具体的信息。
例如,这些级别是否在哈夫曼编码的分配上有任何差异?
2个回答

2
级别只是指deflate寻找匹配字符串的难度不同,正如您所观察到的那样。哈夫曼编码是在选定的一定数量的符号(字面量和长度/距离对)上完成的,生成一个“块”,其中该数字由内存级别而不是压缩级别定义。生成的哈夫曼编码将必然不同,因为要编码的符号不同。
内存级别的选择也对压缩有一定影响,因为更多符号可以将代码描述的成本分摊到更多符号上,但过多的符号可能会阻止Huffman编码对符号统计学中的局部变化进行自适应。默认内存级别为8(每个块16,383个符号),因为测试表明这比级别9(每个块32,767个符号)更好地压缩。但是,这可能因情况而异。

谢谢!如果重复的字符串倾向于出现在更远(但在同一块中)位置,是否正确认为存储更大距离将需要更多内存?例如,在文件中具有相同程度的(总体)重复的情况下,平均出现距离为50字节的重复字符串将产生比平均出现距离为500字节的重复字符串稍好的压缩比例?或者分配给距离的内存是固定的吗? - glupyan
1
对于更远的距离,需要更多的位数。50的距离将占用4个位加上一个哈夫曼编码(至少1个位),而500的距离将占用7个位加上一个哈夫曼编码。哈夫曼编码的大小取决于这些距离与其他距离相比出现的频率。 - Mark Adler

0

据我记得,是的,这主要取决于你将要分配的缓冲区的大小。缓冲区越大,压缩效果就会越好。如果你能够分配一个大小大约为“输入文件大小×1.2”的缓冲区,在大多数情况下,你将获得使用Huffman算法最佳的压缩效果。

原因在于,当你有如此大的缓冲区时,Huffman表将包含所有字节,并以最佳结果展现出来。当算法用尽缓冲区空间时,它需要重置其表(流中添加了一个代码来实现),这意味着你需要从头开始构建一个新的编码表,这样就会丢失掉重新设计新表所需的字节...

尽管存在一些情况下重置可能是有益的(例如文件前半部分有许多字节设置为值X,而后半部分有更多字节设置为值Y),但这种情况很少发生。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接