Algorithm 如何解码哈夫曼树?

Algorithm 如何解码哈夫曼树?,algorithm,tree,decode,huffman-code,Algorithm,Tree,Decode,Huffman Code,有比根据输入数字0或1向左或向右更好的方法吗 有一些关于哈夫曼树的高效解码算法的论文。就我个人而言,出于学术原因,我只使用了其中一种,但那是很久以前的事了。这篇论文的标题是“ 该算法在O(logn)time中给出结果。为了使用该算法,您必须用树的所有符号(叶子)构造一个表,并且必须为每个符号指定一个权重: w(i) = 2 ^ (h - l) 其中h是哈夫曼树的高度,l是符号的级别,以及计数: count(i) = count(i-1) + w(i) 根的计数,count(0),等于其权重

有比根据输入数字0或1向左或向右更好的方法吗

有一些关于哈夫曼树的高效解码算法的论文。就我个人而言,出于学术原因,我只使用了其中一种,但那是很久以前的事了。这篇论文的标题是“

该算法在
O(logn)
time中给出结果。为了使用该算法,您必须用树的所有符号(叶子)构造一个表,并且必须为每个符号指定一个权重:

w(i) = 2 ^ (h - l)
其中h是哈夫曼树的高度,l是符号的级别,以及计数:

count(i) = count(i-1) + w(i)
根的计数,
count(0)
,等于其权重

当你有了所有这些,算法中有3个简单的步骤,这在本文中有描述


我不知道这是否是你想要的。

当然,你可以使用k-树而不是2-树来获得O(ln_k(n))加速。这并不多


如果最大密钥大小很小(比如<8位)或者内存很大,则可以使用直接查找表&get O(1)。

是的,有,并且可以使用查找表

请注意,您将使用相当多的内存来存储这些表,并且您必须将该表与数据一起发送(可能会完全抵消压缩的影响),或者在解压缩之前构造该表(这将抵消您从中获得的一些(如果不是全部的话)加速)

这是桌子的工作原理

假设,对于压缩数据的样本部分,符号的位序列如下所示:

1 -> A
01 -> B
00 -> C
您现在要做的是生成一个表,该表由一个字节索引(因为您需要读取最小1字节来解码第一个符号),其中包含如下项:

key      symbol       bit-shift
1xxxxxxx    A             7
01xxxxxx    B             6
00xxxxxx    C             6
x表示您需要使用该数据存储包含这些x的所有可能组合的条目。对于第一行,这意味着您将构造一个表,其中具有高位集的每个字节键都将映射到a/7

根据上述规则,该表将包含所有256个键值的条目,其中一半映射到A/7,25%映射到B/6和C/6

当然,如果符号的最长位序列是9-16位,则需要一个由16位整数键控的表,依此类推

现在,当你解码时,你会这样做:

read first and second byte as key, append them together

loop:
   look up the first 8 bits of the current key in the table
   emit symbol found in table
   shift the key bitwise to the left the number of bits specified in the table
   if less than 8 bits left in the key, get next byte and append to key
在结束时,只需填充0字节,就像所有哈夫曼解压一样,在开始之前,您需要知道要发出多少符号