我创建了一个使用Huffman Coding压缩和解压缩txt文件的C ++程序。
当我压缩txt文件时,我还将Huffman树保存在二进制(压缩)文件中,这是一个由字符和频率组成的树。只有叶节点有字符。
我使用了this序列化,但我也对字符进行了序列化。如果我读':'我必须从文件中读取一个字符(字符)及其频率(int),否则我只需要读取频率。
例如此文件:
7 4 : F 2 # # : C 2 # # : A 3 # #
包含下面的二叉树:
(7)
/ \
(4) (A,3)
/ \
(F,2) (C,2)
它运行良好但是二进制扩展引起了一个问题:
字符':'和'#'可能是频率的第一个字节,它是一个整数!这种情况很少见,但在发生时会在文件读取过程中导致错误。
我该如何解决? 我也想根据它的大小保存频率!经常浪费4个字节!
谢谢!
答案 0 :(得分:1)
为什么要保存频率?它们不需要解码。您所需要的只是树中角色的位置。
您也不需要发送树,但那是more advanced topic。
答案 1 :(得分:0)
这是最好的解决方案,我真的很喜欢它,但我想在没有Canonical Huffman Code的情况下解决问题。
我终于使用了这个新解决方案:
我不需要所有的频率,只需要叶子节点的一个,所以我保存一个字符(1个字节)(例如'X')如果它不是叶节点,否则我保存:+字符+频率。我需要保存所有节点,因为我必须在解码过程中重建三个节点。
这解决了':'和'#'的问题,并且使用的内存更少。
以上示例变为:
X X : F 2 # # : C 2 # # : A 3 # #
它工作得很好,但我确信有一个更好的解决方案来序列化二叉树!