对于三元霍夫曼问题,我们可以为“ 4 ”个字符制作树(或编码方案)吗? 假设我有以下频率的4个字符: freq(a)= 5 freq(b)= 3 freq(c)= 2 freq(d)= 2
我将如何以0,1,2的形式对其进行编码,以使任何代码字都不是另一个代码字的前缀?
答案 0 :(得分:0)
对于经典霍夫曼,您只需一次合并两个最低频率的节点以构建一棵树,当将1分配给左(或右)边缘并将0分配给其他边缘并且将某个节点的dfs路径是节点代码时。 / p>
即
所以在这种情况下,编码为:
a-1
b-01
c-001
d-000
在三元霍夫曼上,您一次只加入3个最低频率的节点(如果没有足够的节点用于最后一步,则加入较少的节点)
即
所以在这种情况下,编码为:
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 有关更多详细信息。