Algorithm “哈夫曼”;“终结者”;位串 动机

Algorithm “哈夫曼”;“终结者”;位串 动机,algorithm,huffman-code,bitstring,Algorithm,Huffman Code,Bitstring,想象一个哈夫曼压缩文件被部分下载,就像在P2P软件中一样,因此我们首先为整个文件分配磁盘空间,然后开始下载随机文件块。其中一个哈夫曼代码(但我们不知道是哪一个)是结束代码,所以如果这个代码被解码,我们就停止。假设该文件由几个huffman压缩流组成,我们可以在下载完成之前尝试解压缩其中的一些流 磁盘空间的预分配方式现在很重要:假设我们有一个huffman流的开始,但它不完整,所以我们运行到预分配的磁盘空间中。通常,这个空间都是0,所以我们将继续使用哈夫曼码解码符号。如果这不是我们的最终代码,我们

想象一个哈夫曼压缩文件被部分下载,就像在P2P软件中一样,因此我们首先为整个文件分配磁盘空间,然后开始下载随机文件块。其中一个哈夫曼代码(但我们不知道是哪一个)是结束代码,所以如果这个代码被解码,我们就停止。假设该文件由几个huffman压缩流组成,我们可以在下载完成之前尝试解压缩其中的一些流

磁盘空间的预分配方式现在很重要:假设我们有一个huffman流的开始,但它不完整,所以我们运行到预分配的磁盘空间中。通常,这个空间都是0,所以我们将继续使用哈夫曼码解码符号。如果这不是我们的最终代码,我们就不会注意到“无效”数据和f.e.如果有2GB的预分配空间,我们正在做很多无用的解码

因此,我们希望预先分配空间,使解码尽快停止

问题 我正在寻找充当“哈夫曼终止符”的最短位字符串,这意味着如果我们解码这个字符串,我们将对每个哈夫曼代码至少解码一次,因此我们肯定会收到一个结束代码。这适用于长度
1..n
位的哈夫曼码的每个组合

注:我知道上述假设场景有一些简单的解决方案(使用
00..
作为结束代码,使用P2P段数据检测尚未下载的块),但这只是一个示例场景,展示了“Huffman terminator”位字符串的理论用法,我对解决此场景不感兴趣,但寻找算法/方法/想法来生成/查找充当“哈夫曼终结者”的位字符串

例子 让我们看看
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
):

这是一个很好的开始,它已经对前三个哈夫曼代码进行了解码,但是如果我们用
[00,01,10,11]
进行解码,我们将缺少符号
B
(哈夫曼代码
01
)。让我们把它附加到我们的位字符串中:

00101101

对于长度为8位的
n=2
,这是一个有效的“哈夫曼终止符”。如果我们用这个字节预先分配磁盘空间,我们一定会终止所有不超过2位的哈夫曼代码。我们甚至知道对于
n=2
不会有更短的终止符字符串,因为它是组合
[00,01,10,11]
对每个符号解码一次的最小长度

我还为
n=3
0001011001110100111001110000101111111110
(43位)找到了一个“哈夫曼终结者”,但我不确定它是否正确,也不知道它是否是最短的

我在找什么
  • 为给定的
    n
    查找或生成哈夫曼终止符的算法/想法。我的尝试与示例类似:生成一个开始字符串并根据需要追加位,以满足所有不同的哈夫曼代码组合。但我相信有更好的方法

  • 特定的哈夫曼终止符,
    n=8
    n=16
    ,尽管生成这些终止符的计算成本可能很高,而且可能会很长

  • 有关此问题(或类似问题)的论文/链接(如果有)

奖金
找到“哈夫曼终止符”的额外积分,如果我们从位位置开始,它也会工作。
1..n
,因此,如果数据之前被解码,它甚至会终止,并且我们不会在第一位到达并开始一个新的哈夫曼码。

在这种情况下,您可能不应该使用哈夫曼


或者更好地跟踪(未)下载的段。

如果我理解正确,那么任何高达n位的哈夫曼代码的通用终止符都需要至少n*2^n位,因为可能有2^n个源符号(包括未知终止符号)以相同的概率出现,因此,每个符号都需要一个n位代码。这还告诉您,任何这样的最小长度通用终止符都将是这2^n个n位块的排列


例如,对于n=16,任何通用终止符都不能短于1048576位或128Kb。(当然可能需要更长的时间。)

只记录第一个未下载部分的位置不是更简单吗?为了避免两次下载块,你应该已经在你的p2p下载程序中拥有了你需要的所有信息。在“问题”中添加了一个注释。是的,我知道在“动机”中有一些简单的解决方案,但我不想/不需要解决这个问题,但我想专注于这种位字符串。@这种行为在这个网站上是不受欢迎的。你是否希望你不知道什么是哈夫曼符号是“EOF”符号?为什么不在代码中添加一个额外的符号来表示EOF,并用该符号填充预分配的块?@Nick:文件中可能有几个带有不同EOF符号的哈夫曼流。另外,使用已知EOF进行预分配是示例场景的另一个简单解决方案,我在这里不寻找它。这是一个完全正确的答案,但我想处理这类位字符串,尽管它们非常理论化,在实际应用中不会有太多用处。也许你应该询问at或类似的问题。所以说“你的问题不在那里”是很流行的。谢谢,我将尝试一下cstheory:谢谢,这确实给出了最短的长度。此外,最小长度
Combination   Decoded symbols
[0, 1]        AABABB
[00,01,1]     ACBC
[0,10,11]     AABC
[00,01,10,11] ACD