DEFLATE 霍夫曼树的大小​​限制

Size constraints on DEFLATE Huffman trees

通读 RFC 1951,似乎有效的动态霍夫曼树不一定是完整的二叉树 - 例如,由位长度 (2, 2, 2) 指定的树有一个带有单个子节点的节点:

    ____
   /    \
  0      1
 / \    /
0   1  0

当尝试在一次分配中为整个树分配足够的内存时,这会导致问题,因为任意二叉树中的节点数不一定有任何上限。

DEFLATE 标准中的约束是否暗示了动态霍夫曼树大小的上限?

RFC 1951 将“霍夫曼代码”定义为在构建最佳前缀代码时产生的代码。因此,有效压缩流中使用的霍夫曼码必须是完整的,才能达到最优。您的示例不是,未使用的代码 11。 1-2-2 代码将是完整的,没有未使用的代码。

RFC 1951 中此规则有一个例外,即单独的距离代码被编码为 one-bit,而不是零位:

If only one distance code is used, it is encoded using one bit, not zero bits; in this case there is a single code length of one, with one unused code.

zlib 的 inflate 拒绝任何带有无效 Huffman 代码的 deflate 流。

还有一个微妙之处,就是deflate中的霍夫曼编码是length-limited到15位,在代码的编码中强制执行。这不会改变代码需要完整的事实。

一个完整的前缀码,其内部节点数为n-1,其中n为编码的符号数。

由于length-limit的微妙之处,即使是non-optimal前缀代码,节点数量也有限制。最坏的情况是将最大数量的比特分配给所有符号。然后只需构建树并计算节点数。你最终得到的是符号的平面代码树,它的基础连接到根,一行单分支节点连接到根。所以实际上,由于规范代码的构造方式,节点数不会比最佳前缀代码多多少。

例如,如果所有 30 个距离代码的长度均为 15,则规范树如下所示:

最佳前缀码有 40 个内部节点,而不是 29 个内部节点。