对于三元霍夫曼问题,我们可以为“ 4”个字符制作树(或编码方案)吗?

时间:2019-03-20 19:34:48

标签: algorithm tree huffman-code

对于三元霍夫曼问题,我们可以为“ 4 ”个字符制作树(或编码方案)吗? 假设我有以下频率的4个字符: freq(a)= 5 freq(b)= 3 freq(c)= 2 freq(d)= 2

我将如何以0,1,2的形式对其进行编码,以使任何代码字都不是另一个代码字的前缀?

2 个答案:

答案 0 :(得分:0)

对于经典霍夫曼,您只需一次合并两个最低频率的节点以构建一棵树,当将1分配给左(或右)边缘并将0分配给其他边缘并且将某个节点的dfs路径是节点代码时。 / p>

enter image description here

所以在这种情况下,编码为:

  

a-1
  b-01
  c-001
  d-000

在三元霍夫曼上,您一次只加入3个最低频率的节点(如果没有足够的节点用于最后一步,则加入较少的节点)

enter image description here

所以在这种情况下,编码为:

  

a-2
  b-12
  c-11
  d-10

答案 1 :(得分:0)

用于生成最佳三元霍夫曼码的标准算法(如rici所指)首先要确保存在奇数个符号-如有必要,通过添加一个伪符号(频率为0)。

在这种情况下,我们从偶数个符号开始,因此我们需要添加我称为Z的虚拟符号: freq(a)= 5 freq(b)= 3 freq(c)= 2 freq(d)= 2 freq(Z)= 0。

然后,如Photon所述,我们将频率最低的3个节点重复组合为1个组合符号。每次我们用1个节点替换3个节点时,我们将节点总数减少2,因此,每一步的节点总数保持为奇数。在最后一步(如果我们添加了正确数量的虚拟符号),我们将把3个最终节点合并为一个根节点。

         abcdZ:12
         /  |  \
       2/  1|  0\
    cdZ:4  b:3  a:5
    / | \
  2/ 1| 0\
Z:0  d:2  c:2

因此,在这种情况下,一种最佳(霍夫曼)三元编码为:

a: 0
b: 1
c: 20
d: 21
Z: 22 (should never occur).

请参阅 https://en.wikipedia.org/wiki/Huffman_coding#n-ary_Huffman_coding 有关更多详细信息。