霍夫曼树中的唯一标识符节点

Unique Identifiers Nodes in a Huffman Tree

我正在构建一个 Python 程序来 compress/decompress 使用霍夫曼树的文本文件。以前,我会将频率 table 与压缩文件一起存储在 .json 文件中。当我读入压缩数据和.json时,我会从频率table重建解压树。我认为这是一个很好的 eloquent 解决方案。

但是,我 运行 遇到了一个奇怪的问题,即中等长度的文件会解压成看似随机字符的字符串。我发现当两个字符出现相同次数时会出现问题。当我重建我的树时,任何具有匹配频率的字符都有机会被交换。对于大多数文件,尤其是大文件和小文件,这不是问题。大多数字母出现的次数比其他字母略多或略少。但是对于一些中等大小的文件,很大一部分字符与另一个字符出现的次数相同,导致乱码。

我的节点是否有一个唯一的标识符,我可以使用它来轻松地重建我的树?或者我应该以完全不同的方式接近树?

  1. 在霍夫曼算法中,您需要以一种确定性的方式选择最低的两个频率,两边都相同。如果出现平局,则需要使用符号来打破平局。否则,您无法保证在面对相同频率时两侧的排序会选择相同的符号。

  2. 您不需要发送频率。您需要发送的只是符号的位长度。长度可以比​​频率更紧凑地编码。您可以仅根据长度构建 canonical code,使用符号明确地对代码进行排序。