如何从霍夫曼树生成霍夫曼码

时间:2012-01-31 15:11:16

标签: c++ huffman-code

我正在用C ++制作jpeg编码器。我成功创建了霍夫曼树,但是如何从树生成霍夫曼代码呢?我尝试过的一种方法是将0分配给左分支,1分配给右分支,就像在图片中一样,但是这种方法存在一个问题,因为一个元素将被编码为全部(如图中的sibol E)用11)编码,但jpeg标准不允许所有的霍夫曼代码。

enter image description here

3 个答案:

答案 0 :(得分:1)

如果您不能使用全1的字符串,那么您不一定能获得最佳代码(在某些约束条件下是最佳的,我的意思)。

如果在字符串中追加“0”全部为“1”,那么它将不再是“1”。您仍然会有前缀代码,而不是最佳代码。这样就足够了,但我不知道这是不是jpeg编码器应该做的。我原本以为会有一个标准的解决方案。

答案 1 :(得分:1)

JPEG正在使用基于统计信息的固定树。所以你永远不会得到最优的代码。必须使用固定树,因为它是以有效方式分发霍夫曼树的唯一方法(否则你必须将树保留在文件中,这使文件更大)。我假设树在标准文档中描述。

答案 2 :(得分:0)

我发现这是生成jpeg霍夫曼代码的完全错误的方法。霍夫曼表是通过两个步骤的统计集合生成的,这些步骤在JPEG标准的附录K中给出。此外,同一文件的附件C中没有提供详细信息。