为什么 DEFLATE 格式中的 literal/length 字母表有 286 个符号长?

Why is the literal/length alphabet in the DEFLATE format 286 symbols long?

根据 DEFLATE 规范 (RFC 1951),文字和长度字母组合在一起,以便使用一棵霍夫曼树进行解码。字面量和长度字母表都是 256 个大符号,但组合的 literal/length 字母表是 286 个符号长,其中一个符号是块结束字符。

在组合字母表中可能的 256 个长度符号中只有 29 个,在长度符号之后的压缩数据中包含额外的位,以便在解码时读取长度的完整值。这些额外的位未被压缩,被读取为文字机器整数。

为什么不在组合字母表中包含所有 256 个长度值,以获得大小为 512 的 literal/length 字母表(包含块结束字符时为 513)?这不是可以更好地压缩长度吗?

是的,这样可以更好地压缩长度。但不是很多。我对几个大文件进行了尝试,发现压缩后的文件大小减少了大约 0.25%。

我不能代表 Phil Katz 回答“为什么”这个问题。 (Phil 早就死了。)我只能猜测他决定将用于距离代码的相同方法应用于长度代码,以减少需要进行霍夫曼编码的符号数量。他必须对距离代码执行此操作,以便在代码长度限制为 15 位的情况下进行压缩(这在当时的 16 位处理器上很重要)。他可能还想限制 literal/length 代码的符号数量,以减少霍夫曼编码它们所花费的时间,以及 space 用于编码和解码表的时间。