gpt4 book ai didi

algorithm - 霍夫曼“终结者”比特串

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:36:18 27 4
gpt4 key购买 nike

动机
想象一下一个哈夫曼压缩文件被部分下载,就像在p2p软件中一样,所以我们首先为整个文件分配磁盘空间,然后开始随机下载文件块。其中一个哈夫曼密码(但我们不知道是哪一个)是一个结束密码,所以如果这个密码被解码,我们就停止。假设文件由几个huffman压缩流组成,我们可以在下载完成之前尝试解压缩其中的一些流。
磁盘空间预分配的方式现在很重要:假设我们有一个huffman流的开始,但是它还没有完成,所以我们遇到了预分配的磁盘空间通常,这个空间都是0,所以我们会继续用huffman码来解码符号。如果这不是我们的最终代码,我们不会注意到“无效”数据和f.e.如果有2GB的预分配空间,我们做了很多无用的解码。
所以我们想预先分配空间,使解码尽快停止。
问题
我正在寻找充当“哈夫曼终结者”的最短比特串,这意味着如果我们解码这个字符串,我们将至少解码一次每个哈夫曼码,所以我们肯定会收到一个结束码。这应该适用于长度00..位的哈夫曼码的每个组合。
注意:我知道对于上面的假设场景有一些简单的解决方案(使用1..n作为结束代码,使用p2p段数据来检测尚未下载的块),但这只是一个示例场景来展示“huffman terminator”位串的理论用法,我对解决这个场景不感兴趣,但我想寻找算法/方法/想法生成/查找充当“哈夫曼终止符”的位字符串。
例子
让我们看看00..n = 2[0, 1][00, 01, 1][0, 10, 11][00, 01, 10, 11]可能的哈夫曼代码组合现在让我们从包含每个可能的长度为1..n0100011011001011A..D)的位序列开始:
[00, 01, 10, 11]
用不同的哈夫曼码组合解码给出(哈夫曼码被分配给符号B):

Combination   Decoded symbols
[0, 1] AABABB
[00,01,1] ACBC
[0,10,11] AABC
[00,01,10,11] ACD

这是一个很好的开始,它已经为前三个解码了每个哈夫曼代码,但是如果我们用 01解码,我们就缺少符号 00101101(哈夫曼代码 n=2)所以我们把这个附加到我们的位字符串中:
n=2
对于长度为8位的 [00, 01, 10, 11],这是一个有效的“huffman终结符”。如果我们用这个字节预先分配磁盘空间,我们一定会终止所有不超过2位的哈夫曼代码。我们甚至知道 n=3不会有更短的终止字符串,因为这是组合 0001011001110100111010011100010101111101110解码每个符号一次的最小长度。
我还为 nn=8(43位)找到了一个“哈夫曼终结者”,但我不确定它是否正确,也不知道它是否最短。
我在找什么
为给定的 n=16找到或生成哈夫曼终止符的算法/思想我的尝试类似于这个例子:生成一个起始字符串,并根据需要追加位,以满足所有不同的哈夫曼代码组合。但我相信有更好的方法。
特定的哈夫曼终结者, 1..n ,尽管生成它们可能需要很高的计算成本,而且可能需要很长的时间。
关于这个问题的论文/链接(或者类似的)。
奖金
找到“哈夫曼终止符”的额外积分,如果我们从位位置 开始,它也会起作用,因此,如果之前解码过数据,我们不会到达并在第一位开始新的哈夫曼代码,它甚至会终止。

最佳答案

如果我理解正确,那么任何用于高达N位的哈夫曼码的通用终止符都至少需要N*2^N位,因为可能存在2^N个源符号(包括未知终止符号)以相同的概率出现的情况,因此每个符号都需要N位码。这也告诉您,任何这样的最小长度通用终止符都将是这2^n个n位块的置换。
因此,例如,对于n=16,任何通用终止符都不能短于1048576位或128kb。(当然可能需要更长的时间。)

关于algorithm - 霍夫曼“终结者”比特串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4938930/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com