【发布时间】:2011-06-23 18:15:51
【问题描述】:
动机
想象一个被部分下载的霍夫曼压缩文件,就像在 P2P 软件中一样,所以我们首先为整个文件分配磁盘空间,然后开始下载随机文件块。其中一个霍夫曼码(但我们不知道是哪一个)是一个结束码,所以如果这个码被解码,我们就停止。假设该文件由几个霍夫曼压缩流组成,我们可以尝试在下载完成之前解压缩其中的一些。
磁盘空间的预分配方式现在很重要:假设我们有一个霍夫曼流的开始,但它并不完整,所以我们遇到了预分配的磁盘空间。通常,这个空间都是 0,所以我们会继续用霍夫曼代码00.. 解码符号。如果这不是我们的最终代码,我们不会注意到“无效”数据和 f.e.如果有 2 GB 的预分配空间,我们就做了很多无用的解码。
所以我们想预先分配空间以使解码尽快停止。
问题
我正在寻找充当“霍夫曼终止符”的最短位串,这意味着如果我们解码这个字符串,我们将至少解码每个霍夫曼代码一次,所以我们肯定会收到一个结束代码。这应该适用于长度为1..n 位的霍夫曼代码的每种组合。
注意:我知道上面的假设场景有简单的解决方案(使用00..作为结束代码,使用P2P段数据来检测尚未下载的块),但这只是一个示例场景,展示了理论用途对于“霍夫曼终结器”位串,我对解决这种情况不感兴趣,而是寻找算法/方法/想法来生成/查找充当“霍夫曼终结器”的位串。
示例
让我们看看n = 2 可能的霍夫曼编码组合:[0, 1]、[00, 01, 1]、[0, 10, 11]、[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、0001011001110100111010011100010101111101110(43 位)找到了一个“霍夫曼终结符”,但我不能 100% 确定它是否正确,也不知道它是否是最短的。
我在寻找什么
为给定的
n查找或生成霍夫曼终止符的算法/想法。我的尝试将类似于示例:生成一个起始字符串并根据需要附加位以满足所有不同的霍夫曼代码组合。但我相信还有更好的方法。特定的 Huffman 终止符,
n=8和n=16,尽管生成它们的计算成本可能很高,而且它们可能会很长。有关此问题(或类似问题)的论文/链接(如果有)。
奖金
如果我们从位位置1..n 开始,查找“霍夫曼终止符”也可以加分,因此如果数据之前已解码并且我们不会到达并在第一位开始新的霍夫曼代码,它甚至会终止。
【问题讨论】:
-
只跟踪第一个未下载部分的位置不是更简单吗?为避免两次下载块,您应该已经在 p2p 下载器中拥有所需的所有信息。
-
在“问题”中添加了注释。是的,我知道“动机”中的场景有简单的解决方案,但我不想/不需要解决这个问题,但想专注于这种位串。
-
@syntax 这种行为在本网站上是不受欢迎的。
-
您是否期望您不知道“EOF”符号是什么霍夫曼符号?为什么不直接在代码中添加一个额外的符号来表示 EOF,并用该符号填充预分配的块?
-
@Nick:可能有 f.e.是文件中具有不同 EOF 符号的几个霍夫曼流。此外,使用已知 EOF 进行预分配是示例场景的另一个简单解决方案,我不在这里寻找。
标签: algorithm huffman-code bitstring