具有相同权重树的霍夫曼编码中的合并顺序

时间:2015-04-12 17:08:36

标签: algorithm encoding tree compression huffman-code

我正在努力解决在霍夫曼编码中合并具有相同“重量”的树木的顺序。我查看了很多来源,但所有这些似乎只涵盖了“简单案例”,其中不超过两个具有相同权重的元素或根本不覆盖整个主题。



假设我有以下要编码的字符串:ABCDEE(基于this website的样式)
所以我有:

    FREQUENCY       VALUE
    ---------       -----
         1            A
         1            B
         1            C
         1            D
         2            E

我现在用两个最小的元素开始构建树:
问题1)我是否必须使用A & B或我如何决定应该使用哪些值?我知道他们必须是最小的,但除此之外?例如。 A & D
这在最后很重要(让我说以下内容:

  2:[A&B]       2:[B&C]
    /  \          /  \
  1:A   1:B     1:B   1:C

以及下表:

    FREQUENCY       VALUE
    ---------       -----
         2          [A&B]
         2          [C&D]
         2            E

问题2)再次......我应该以哪种顺序合并树木?例如。 [A&B]&E[A&B]&[C&D]
因为,如果我首先合并[A&B]&E,那么树将如下所示:

      4:[A&B&E]
        /   \
    2:[A&B]   2:E
    /   \
  1:A   1:B

问题3) 以及如何决定2:E是左侧还是右侧?)< / p>

加入[C&D]后,最终的树看起来像这样:

     6:[A&B&C&D&E]
       /       \
 2:[C&D]    4:[A&B&E]
   /  \        /   \
 1:C   1:D  2:[A&B] 2:E
             /   \
           1:A   1:B

但如果我开始加入[A&B]&[C&D]

     4:[A&B&C&D]
      /        \
 2:[A&B]      2:[C&D]
   /   \       /   \
  1:A   1:B  1:C  1:D

然后加入E,最终的树看起来像这样:

     6:[A&B&C&D&E]
       /       \
    E:2      4:[A&B&C&D]
             /        \
        2:[A&B]      2:[C&D]
          /   \       /   \
         1:A   1:B  1:C  1:D

因此,第一个变体E将是11,而第二个变体0。或者作为另一个示例C将是00110 ...

我认为我必须有一个基本规则,因为霍夫曼编码必须具有确定性(正确解码),不是吗?

2 个答案:

答案 0 :(得分:2)

当您选择两个最低权重时,无关紧要您选择哪一对。对于所有选择,霍夫曼算法将返回一组代码,这些代码最小化了对提供的集合进行编码的总位数。

因此,除非对选择有其他约束,否则霍夫曼算法确定性。尽管该算法可以提供不同的结果,但这不会阻止编码器/解码器组合具有确定性。所需要的只是得到的霍夫曼码与编码数据一起正确传输,以便解码器可以解码它。非确定性显示的唯一一点是符号的频率集不是霍夫曼码的充分描述符。

如另一个答案所述,通过要求code be canonical来减少大量可能的代码。这减少了传输霍夫曼代码所需的位数,因为您不再需要区分所有可能的结果代码。对于规范代码,您不必描述霍夫曼树或代码的特定位值。这完全可以从简单地编码每个符号所需的比特数得出。因此,霍夫曼代码(或实际上任何前缀代码)的足够描述符是每个符号的位数。

重要的是要注意,即使您将结果约束为规范代码,霍夫曼算法仍然仍然导致同一组频率的不同代码长度集,具体取决于选择两个最低权重子树时所做的选择。这是一个例子:

考虑符号和频率A:2,B:2,C:1,D:1。你必须将C和D组合起来得到2的权重。现在你有三个权重为2,所以有三个选择结合。 A和B,A和CD,或B和CD。第一种选择与最后两种选择根本不同。如果组合A和B,得到的代码长度(位数)为:A = 2,B = 2,C = 2,D = 2.如果另一方面将B和CD组合在一起,则最终得到A = 1,B = 2,C = 3,D = 3.同一组频率的两个不同的规范代码!

然后你可能会问,哪一个是&#34;对&#34;?答案是他们俩都是。原因是如果将频率乘以长度,则可以获得相同的总位数来对代码进行编码。 2x2 + 2x2 + 1x2 + 1x2 = 2x1 + 2x2 + 1x3 + 1x3 = 12.

如果即使您将代码限制为规范,也不会感到惊讶,您可以从Huffman算法中获得多个答案。

答案 1 :(得分:1)

合并顺序真的不重要。该算法的重要之处在于每次选择最小的子树。因为贪婪地这样做,最后,你总是会以最短的方式在那棵树上找到频率最高的字母。