我计划使用Huffman编码来压缩文本,但是要用长度不同的符号(字符串)。例如(使用下划线作为空格):
huffman-code | symbol
------------------------------------
00 | _
01 | E
100 | THE
101 | A
1100 | UP
1101 | DOWN
11100 | .
11101 |
1111...
(etc...)
我该如何构建频率表?显然存在一些重叠问题,序列
_TH
出现的次数几乎与THE
相同,但在表格中是没有用的(_
和THE
都有短的哈夫曼编码)。这样的算法是否存在?它有一个特殊的名称吗?生成频率表的技巧是什么?我需要对输入进行标记化吗?我在文献/网络上没有找到任何信息。(所有这些也让我想到了基数树。)
我考虑使用迭代过程:
1. 为长度为1到N的所有符号生成哈夫曼树 2. 从树中删除所有N>1且低于某个计数阈值的符号 3. 重新生成第二个哈夫曼树,但这次使用先前的树对输入进行标记化(可能使用基数树进行查找) 4. 重复执行1直到我们收敛(或者重复几次)
但我无法解决这个问题:如何避免这种重叠问题(
_TH
vs THE
)。