我使用哈夫曼算法实现了文件压缩,但我遇到的问题是为了使压缩文件能够解压缩,使用的编码树或者编码本身也应该被写入文件中。问题是:我该如何做呢?在压缩文件开头写入编码树的最佳方法是什么?
我使用哈夫曼算法实现了文件压缩,但我遇到的问题是为了使压缩文件能够解压缩,使用的编码树或者编码本身也应该被写入文件中。问题是:我该如何做呢?在压缩文件开头写入编码树的最佳方法是什么?
不要将代码树写入文件,而是写下每个字符出现的频率,这样解压程序就可以生成相同的树。
最朴素的解决方案是按照前序遍历解析压缩树,并将256个值写入文件头。
由于哈夫曼树中的每个节点都是具有两个子节点的分支或叶子,因此可以使用单个位来明确表示每个节点。对于叶子节点,紧随其后跟随该节点的8位。
例如,对于这棵树:
/\
/\ A
B /\
C D
你可以存储001[B]01[C]1[D]1[A]
(事实证明,这正是之前发布的huffman.c示例中发生的情况,但不是上面描述的方式)。
最好发送字符频率并在接收端构建树形结构。对于固定的字母表,这些数据的大小是恒定的。我猜这必须是可序列化的,并放入文件中。根据实现方式来发送树形结构,对于我尝试过的方法,基于数组的方法导致了更多未使用的内存,因为大多数时候该树形结构可能不是平衡的。如果该树形结构是平衡的,则数组表示将生成最佳选项。