我对JPEG Huffman表以及使用Huffman表从树中构造符号/二进制字符串有疑问。假设在3-Bit代码长度的霍夫曼表中,代码数大于6,那么我们如何在树中添加所有这些代码?如果我是正确的,那么只能在树的3位级别/深度处添加6个代码。那么,如果剩余的代码不适合该级别,我们如何添加呢?我们只是忽略它们吗?



code length | Total Codes | Codes
3-Bit       |    10       | 25 43 34 53 92 A2 B2 63 73 C2


在上面的示例中,如果按照为代码构造符号/二进制字符串的顺序进行操作,那么直到A2为止,我们都可以在树中的3位级别添加代码,但是B2、63、73,C2等呢?不可能在树的3位级别上添加它们吗?那么我们如何处理他们?

最佳答案

好吧,很明显,可以用3位表示的“事物”的绝对最高数量是8-(000、001、010、011、100、101、110、111)。

在霍夫曼编码中,位表示特里数据结构中的“左”或“右”,为了能够“继续”,您必须对“这继续另一个级别”使用一些代码,这就是为什么不是所有8个值都可以以3位编码。如果您有更多的值要编码,则需要使用更多的位(对于某些值-这是霍夫曼编码的全部要点,即某些组合比原始组合短,其他组合甚至更长,有时甚至更长,但这是因为它是基于在最常见的情况下,这很好,因为它们很少见...)

在典型的《算法》一书中,如何构造和解码霍夫曼树大约需要四到五页,如果您还没有找到其中的一本,您可能想找到一本,无论是一本真正的纸质书还是一本电子书。有很多-我不推荐一个,因为我所有的都大约15岁以上。

我还要补充一点,我认为您的问题缺少一些内容。显然,3位不可能代表10个值。而且,您不能在全部不同的10个值上构建[有意义的]霍夫曼树-除非想法是将这些值分割为{2,5}, {4,3}, {3,4}, {5,3}, {9,2}, {A,2}, {B,2}, {6,3}, {7,3}, {C,2}对-这样就产生了很多重复的值-这些频率的出现频率是:
2:5
3:5
4:2
5:2
6:1
7:1
9:1
A:1
B:1
C:1

但这实在太多了,无法代表任何有意义的东西...

还是反过来,我们应该使用那些位的值进行解码?在这种情况下,我们需要使用原始数据构建的树来对其进行解码...

关于c++ - JPEG霍夫曼表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35928641/

10-09 13:10