Algorithm 可变长度符号的哈夫曼编码

Algorithm 可变长度符号的哈夫曼编码,algorithm,compression,huffman-code,radix-tree,Algorithm,Compression,Huffman Code,Radix Tree,我正在考虑使用哈夫曼代码来压缩文本,但是使用长度可变的符号(字符串)。例如(使用下划线作为空格): 如何构建频率表?显然存在一些重叠的问题,序列和的出现频率与和的出现频率一样,但在表中没有任何用处(\u和都有短的哈夫曼代码) 这样的算法存在吗?它有特别的名字吗?生成频率表的技巧是什么?我需要标记输入吗?我在网上没有找到任何东西。(所有这些让我也想到了根树) 我在考虑使用迭代过程: 为长度为1到N的所有符号生成哈夫曼树 从树中删除N>1且低于某个计数阈值的所有符号 重新生成第二个哈夫曼树,但这次使

我正在考虑使用哈夫曼代码来压缩文本,但是使用长度可变的符号(字符串)。例如(使用下划线作为空格):

如何构建频率表?显然存在一些重叠的问题,序列
的出现频率与
的出现频率一样,但在表中没有任何用处(
\u和
都有短的哈夫曼代码)

这样的算法存在吗?它有特别的名字吗?生成频率表的技巧是什么?我需要标记输入吗?我在网上没有找到任何东西。(所有这些让我也想到了根树)

我在考虑使用迭代过程:

  • 为长度为1到N的所有符号生成哈夫曼树
  • 从树中删除N>1且低于某个计数阈值的所有符号
  • 重新生成第二个哈夫曼树,但这次使用前一个树标记输入(可能使用基数树进行查找)
  • 重复到1直到我们收敛(或几次)

  • 但是我不知道如何用这个来防止重叠问题(
    \TH
    vs
    the
    )。

    只要正确标记文本,就不必担心重叠问题。您可以将每个标记定义为单词(最长的连续字符流)、标点符号或空白字符('''.\t',\n')。因此,根据定义,标记/符号不会重叠


    但是直接使用哈夫曼编码并不适合压缩文本,因为它不能利用符号之间的依赖关系。例如,“q”后面可能跟“u”,“qu”后面可能跟一个元音,“thank”后面可能跟“you”等等。您可能希望研究像“LZ”这样的高阶编码器,它可以利用这种冗余,将数据转换为一系列查找地址、拷贝长度和偏差符号。LZ工作原理的示例。然后,您可以对三个流中的每一个流应用哈夫曼编码来进一步压缩数据。算法就是这样工作的

    这不是一个完整的解决方案

    由于您必须同时存储序列和查找表,也许您可以贪婪地选择符号以最小化存储成本

    步骤1:在一次尝试中存储所有长度不超过k的符号,并跟踪它们的计数

    步骤2:对于每个可能的符号,计算节省的空间(或压缩比)

    编码长度(符号)=对数(N)-对数(计数(符号))

    保存的空间(符号)=长度(符号)*计数(符号)-编码(符号)*计数(符号)-(长度(符号)+编码(符号))

    N是所有符号的总频率(我们还不知道,可能是近似值?)

    步骤3:选择最佳符号并减去与之重叠的其他符号的频率

    步骤4:如果整个序列尚未编码,则选择下一个最佳符号(即,转至步骤2)


    注意:这只是一个大纲,既不完整也不高效。如果你正在寻找一个实用的快速解决方案,你应该使用krjampani的解决方案。这个答案纯粹是学术性的。

    不幸的是,这个答案中的两个链接现在都失效了。
    huffman-code | symbol
    ------------------------------------
    00           | _
    01           | E
    100          | THE
    101          | A
    1100         | UP
    1101         | DOWN
    11100        | .
    11101        |
    1111...
    (etc...)