我正在考虑使用霍夫曼代码来压缩文本,但使用可变长度的符号(字符串)。例如(使用下划线作为空格):
huffman-code | symbol
------------------------------------
00 | _
01 | E
100 | THE
101 | A
1100 | UP
1101 | DOWN
11100 | .
11101 |
1111...
(etc...)
如何构建频率表?显然存在一些重叠的问题,序列_TH
会出现的频率接近THE
,但在表中是无用的(两者_
都有THE
短的霍夫曼代码)。
这样的算法存在吗?它有一个特殊的名字吗?生成频率表的技巧是什么?我需要标记输入吗?我没有在文学/网络中找到任何东西。(这一切都让我想起了基数树)。
我正在考虑使用迭代过程:
- 为长度为 1 到 N 的所有符号生成霍夫曼树
- 从树中删除所有 N>1 且低于某个计数阈值的符号
- 重新生成第二个霍夫曼树,但这次用前一个对输入进行标记(可能使用基数树进行查找)
- 重复 1 直到我们收敛(或几次)
但我不知道如何防止重叠(_TH
vs THE
)的问题。