迭代规范霍夫曼的所有可能的代码长度分布

问题描述 投票:0回答:1

考虑到 Deflate 施加的约束(如 zlib 中使用的),我想迭代所有可能的代码长度分布,以找到可能打破我的假设的极端情况。

Deflate 为霍夫曼码分配位值,其中最低值的位模式代表短代码,最高值的位模式代表长代码。最大代码长度为 15 位。代码分配中不允许有不连续性。符号的最大数量约为 300 个。

我的问题是我需要迭代所有可能的代码长度分布以检查我的假设是否得到满足。

如果我只是迭代每个长度的不同计数,那么绝大多数情况将毫无意义。您不能拥有 100 个长度为 2 的代码,因为它们无法容纳在编码空间中,并且您不能拥有所有长度为 15 的代码,因为它们无法填充编码空间。

因此,必须有一种更快的方法来逐步遍历 N 个代码的相关霍夫曼长度,仅访问正确填充编码空间的组合。

我猜想类似于递归地对长度进行分区来确定可以放置在分区两侧的符号的最小和最大数量......但我还没有设法推理出来。我怪这流感我快好了。

我实际上要检查的是,我认为 zlib 约束意味着符号要达到 15 位,它必须有很多前导 1。如果我反转它,那么我可以使用浮点将前导零(以前是 1)压缩为计数(指数)而不是一长串位。例如,长度为 n 的代码必须至少包含多少个前导 1?

zlib huffman-code deflate
1个回答
0
投票
zlib 发行版中的

enough.c 正是这样做的。在这种情况下,要遍历所有可能的代码长度集,以确定 inflate 解码所需的最大表大小。

© www.soinside.com 2019 - 2024. All rights reserved.