Deflate:顶级 HCLEN 的代码长度 > 7 位?

Deflate: code lengths of > 7 bits for top-level HCLEN?

RFC 1951 指定块中的第一级编码包含 HCLEN 3 位值,它编码下一级霍夫曼代码的长度。由于这些是 3 位值,因此下一级的代码不能超过 7 位(111 二进制)。 然而,似乎有一些极端情况(至少使用“经典”算法来构建霍夫曼代码,使用优先级队列)显然会生成 8 位代码,当然不能对其进行编码。

我想到的一个例子如下(这代表了 RLE 编码产生的 19 个可能的符号,0-15 加上 16、17 和 18):

symbol | frequency
-------+----------
0      | 15
1      | 14
2      | 6
3      | 2
4      | 18
5      | 5 
6      | 12
7      | 26
8      | 3
9      | 20
10     | 79
11     | 94
12     | 17
13     | 7
14     | 8
15     | 4
16     | 16
17     | 1 
18     | 13

根据各种在线计算器(例如https://people.ok.ubc.ca/ylucet/DS/Huffman.html),也手工建树,上面table中的一些符号(即3和17)产生8位长的霍夫曼码.生成的树对我来说看起来不错,有 19 个叶节点和 18 个内部节点。 那么,有没有一种特殊的方法来计算用于 DEFLATE 的霍夫曼码?

是的。 deflate 使用长度限制的霍夫曼代码。您需要 modified Huffman algorithm that limits the length, or an algorithm that shortens a Huffman code that has exceeded the length. (zlib does the latter.)

除了代码长度代码限制为 7 位外,literal/length 和距离代码也限制为 15 位。将霍夫曼算法应用于压缩过程中遇到的频率集时,超过这些限制的情况并不少见。

尽管您的示例不是该代码的有效或可能的频率集。这是一个产生 9 位霍夫曼代码的有效示例,然后需要将其压缩为 7 位:

3 0 0 5 5 1 9 31 58 73 59 28 9 1 2 0 6 0 0