繁体   English   中英

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

[英]Merge Order in Huffman Coding with same weight trees

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



假设我有以下要编码的字符串: ABCDEE (基于本网站的风格)
所以我有:

    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应该在左侧还是右侧?

加入[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将是00 vs 110 ...

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

如果您有两个最低权重的多个选项,则选择哪一对并不重要 对于所有选择,霍夫曼算法将返回一组代码,这些代码最小化了对提供的集合进行编码的总位数。

因此,除非对选择施加其他约束,否则霍夫曼算法不是确定性的。 即使该算法可以提供不同的结果,这并不阻止确定性的编码器/解码器的组合。 所需要的只是得到的霍夫曼码与编码数据一起正确传输,以便解码器可以解码它。 非确定性所表明的唯一的事情是符号的频率集不是霍夫曼码的充分描述符。

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

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

考虑符号和频率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.对于同一组频率,有两个不同的规范代码!

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM