我正在构建一个Python程序来使用Huffman树压缩/解压缩文本文件。以前,我会将频率表与.json文件一起存储在压缩文件旁边。当我读入压缩数据和.json时,我会从频率表重建解压缩树。我认为这是一个非常有说服力的解决方案。
然而,我遇到了一个奇怪的问题,中等长度的文件,他们会解压缩成看似随机的字符串。我发现问题发生在两个字符出现次数相同的情况下。当我重建我的树时,任何具有匹配频率的字符都有可能被交换。对于大多数文件,特别是大型和小型文件,这不是问题。大多数字母比其他字母略多或略少。但对于某些中等大小的文件,大部分字符的出现次数与另一个字符的次数相同,导致乱码。
我的节点是否有唯一的标识符,我可以使用它来轻松重建我的树?或者我应该以完全不同的方式接近树的写作?
答案 0 :(得分:1)
在霍夫曼算法中,您需要以确定的方式选择最低的两个频率,两侧的频率相同。如果存在平局,则需要使用该符号来打破平局。如果没有这个,你无法保证双方的排序在面对相同的频率时会选择相同的符号。
您无需发送频率。您需要发送的只是符号的位长度。长度可以比频率更紧凑地编码。您可以从长度构建canonical code,使用符号明确地对代码进行排序。