如何解码霍夫曼树?

时间:2010-01-31 05:13:00

标签: algorithm tree decode huffman-code

有没有比根据输入数字0或1左右移动更好的方法?

3 个答案:

答案 0 :(得分:2)

有一些关于霍夫曼树有效解码算法的论文。就个人而言,出于学术原因,我只使用其中一个,但这是很久以前的事了。该论文的标题是“A Memory Efficient and Fast Huffman Decoding Algorithm" by Hong-Chung Chen, Yue-Li Wang and Yu-Feng Lan

算法在O(log n)时间内给出结果。要使用此算法,您必须构建一个包含树的所有符号(叶子)的表,并且对于每个符号,您必须指定权重:

w(i) = 2 ^ (h - l)

其中h是霍夫曼树的高度,l是符号的级别,还有一个计数:

count(i) = count(i-1) + w(i)

root的计数count(0)等于其权重。

当你拥有所有这些时,算法中有3个简单的步骤,在论文中有描述。

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

答案 1 :(得分: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字节,并且与所有霍夫曼解压缩一样,您需要知道在开始之前要发出多少符号。

答案 2 :(得分:0)

当然,您可以使用k树并获得O(ln_k(n))加速,而不是2棵树。它并不多。

如果最大键大小(例如<8位)或者你有大量内存,你可以使用直接查找表&amp;得到O(1)。