你好,我正在尝试实现 Canonical huffman 编码,但我不明白 wiki 和 google 指南,
我需要更抽象地解释...
我试过这个:
1. 获取常规哈夫曼编码长度的代码列表。像这样:
A - code: 110, length: 3.
B - code: 111, length: 3.
C - code: 10, length 2.
D - code: 01, length 2.
E - code: 00, length 2.
- 我按符号和长度对表进行排序,如下所示:
C - code: 10, length 2.
D - code: 01, length 2.
E - code: 00, length 2.
A - code: 110, length: 3.
B - code: 111, length: 3.
现在我不知道如何继续......
tnx很多
扔掉从霍夫曼算法得到的代码。你不需要那些。只要保持长度即可。
现在根据长度和符号分配代码。按长度排序,从最短到最长,并在每个长度内,按升序对符号进行排序。 (具体如何做到这一点并不重要,只要每个符号都严格小于或大于任何其他符号,并且编码器和解码器就如何做到这一点达成一致即可。)
所以我们进行排序:
C - 2
D - 2
E - 2
A - 3
B - 3
2 在 3 之前,在 2 内,C、D、E 依次排列,在 3 内,A、B 依次排列。
Now我们在每个长度内按整数顺序分配代码,每次增加一个长度时在末尾添加一个零位:
C - 2 - 00
D - 2 - 01
E - 2 - 10
A - 3 - 110 <- after incrementing to 11, a zero was added to make 110
B - 3 - 111
这是一个规范的代码。
如果您愿意并且仍保持规范,您可以采用其他方式,例如只要编码器和解码器就该方法达成一致,就从 11 开始倒数。重点是只需将每个符号的长度从编码器传输到解码器,以便不必传输占用更多空间的代码本身。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)