通过字符和整数对二进制树进行序列化以解码文件

时间:2013-12-29 22:57:45

标签: file serialization binary-tree huffman-code

我创建了一个使用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个字节!

谢谢!

2 个答案:

答案 0 :(得分:1)

为什么要保存频率?它们不需要解码。您所需要的只是树中角色的位置。

您也不需要发送树,但那是more advanced topic

答案 1 :(得分:0)

这是最好的解决方案,我真的很喜欢它,但我想在没有Canonical Huffman Code的情况下解决问题。

我终于使用了这个新解决方案:

我不需要所有的频率,只需要叶子节点的一个,所以我保存一个字符(1个字节)(例如'X')如果它不是叶节点,否则我保存:+字符+频率。我需要保存所有节点,因为我必须在解码过程中重建三个节点。

这解决了':'和'#'的问题,并且使用的内存更少。

以上示例变为:

    X X : F 2 # # : C 2 # # : A 3 # #

它工作得很好,但我确信有一个更好的解决方案来序列化二叉树!