在https://www.rfc-editor.org/rfc/rfc1951
Note that in the "deflate" format, the Huffman codes for the
various alphabets must not exceed certain maximum code lengths.
Run Code Online (Sandbox Code Playgroud)
最大代码长度定义为 15。
当霍夫曼码长度超过15时会发生什么?
来自https://cs.stackexchange.com/questions/75542/maximum-size-of-huffman-codes-for-an-alphabet-containing-256-letters 256 个符号字母表的最大可能代码大小是 256 位。考虑以下情况:最频繁的符号的频率为 1/2,下一个最频繁的符号的频率为 1/4,然后是 1/8
因此,在文字/长度字母表中,最大霍夫曼代码长度为 285-1=284,但在 zlib 中,最大代码长度为 15。
我们不确定为什么 Phil Katz 选择 15,但它可能有助于在 16 位处理器中快速实现。
不,zlib 不会失败。这种事经常发生。zlib 实现应用正常的霍夫曼算法,之后如果最长的代码长于 15 位,它会继续修改代码以强制它们全部为 15 位或更少。
256 个符号字母表的最大可能霍夫曼码大小是 255 位,而不是 256。最后两个符号具有相同的长度,即 255。
但您不会遇到输入会产生那么长的代码的情况。您需要大约 3x10 53 个符号的最小输入大小才能获得 255 位长的代码。我想你的记忆力不够。
无论如何,zlib 通常将 deflate 块限制为 16384 个符号。对于该数字,最大霍夫曼代码长度为 19。这来自类似斐波那契 (Lucas) 的概率序列,而不是 2 的幂。(留给读者作为练习。)