动机
想象一个哈夫曼压缩文件被部分下载,就像在 P2P 软件中一样,所以我们首先为整个文件分配磁盘空间,然后开始下载随机文件块。其中一个霍夫曼码(但我们不知道是哪一个)是一个结束码,所以如果这个码被解码,我们就停止。假设该文件由几个霍夫曼压缩流组成,我们可以尝试在下载完成之前解压缩其中的一些。
磁盘空间的预分配方式现在很重要:假设我们有一个霍夫曼流的开始,但它不完整,所以我们遇到了预分配的磁盘空间。通常,这个空间都是 0,所以我们会继续用 huffman code 解码符号00..
。如果这不是我们的最终代码,我们不会注意到“无效”数据,如果有 2 GB 的预分配空间,我们会进行很多无用的解码。
所以我们想预先分配空间以使解码尽快停止。
问题
我正在寻找充当“霍夫曼终止符”的最短位串,这意味着如果我们解码这个字符串,我们将至少解码每个霍夫曼代码一次,所以我们肯定会收到一个结束代码。这应该适用于长度1..n
位的霍夫曼码的每种组合。
注意:我知道上面的假设场景有简单的解决方案(00..
用作结束代码,使用 P2P 段数据来检测尚未下载的块),但这只是一个示例场景,展示了“霍夫曼终结器”的理论使用位串,我对解决这种情况不感兴趣,而是寻找算法/方法/想法来生成/查找充当“霍夫曼终结者”的位串。
例子
让我们看看n = 2
: [0, 1]
, [00, 01, 1]
, [0, 10, 11]
,可能的 Huffman 代码组合[00, 01, 10, 11]
。现在让我们从一个包含所有可能长度的位序列1..n
(0
, 1
, 00
, 01
, 10
, 11
)的位串开始:
001011
使用不同的霍夫曼代码组合解码给出(霍夫曼代码分配给符号A..D
):
Combination Decoded symbols
[0, 1] AABABB
[00,01,1] ACBC
[0,10,11] AABC
[00,01,10,11] ACD
这是一个好的开始,它已经解码了前三个的每个霍夫曼代码,但是如果我们用 解码它[00, 01, 10, 11]
,我们就会丢失符号B
(霍夫曼代码01
)。因此,让我们将其附加到我们的位串中:
00101101
这是一个有效的“霍夫曼终止符” n=2
,长度为 8 位。如果我们用这个字节预先分配我们的磁盘空间,我们肯定会终止所有不超过 2 位的霍夫曼代码。我们甚至知道不会有更短的终止符字符串,n=2
因为它是组合[00, 01, 10, 11]
解码每个符号一次的最小长度。
n=3
我还找到了, (43 位)的“霍夫曼终结符” 0001011001110100111010011100010101111101110
,但我不能 100% 确定它是否正确,也不知道它是否是最短的。
我在寻找什么
为给定的.找到或生成霍夫曼终止符的算法/想法
n
。我的尝试将类似于示例:生成一个起始字符串并根据需要附加位以满足所有不同的霍夫曼代码组合。但我确信有更好的方法。特定的 Huffman 终止符,
n=8
和n=16
,虽然生成它们的计算成本可能很高,而且它们可能会很长。有关此问题(或类似问题)的论文/链接(如果有)。
奖金
寻找“霍夫曼终止符”的奖励积分如果我们从位开始也可以工作1..n
,因此如果数据之前解码并且我们不会到达并在第一位开始新的霍夫曼代码,它甚至会终止。