【问题标题】:Writing the huffman tree to file after compression压缩后将霍夫曼树写入文件
【发布时间】:2011-12-27 12:58:26
【问题描述】:

在插入所有实际压缩文件数据后,我正在尝试将 Huffman 树写入压缩文件。但是,我刚刚意识到一个问题,假设我决定一旦我所有的实际数据都写入文件,我将放入 2 个换行符,然后写入树。 这意味着,当我读回内容时,这两个换行符(或任何字符)是我的分隔符。问题是,实际数据完全有可能一个接一个地有 2 个换行符,在这种情况下,我的分隔符检查将失败。 我在这里举了两个换行符的例子,但是对于任何字符串都是如此,我可以通过将更长的字符串作为分隔符来颠覆这个问题,但这会产生两个不受欢迎的效果: 1. 压缩数据中偶然出现长字符串的可能性仍然很小。 2. 不必要地膨胀需要压缩的文件。

有人对如何将压缩数据与树数据分开有任何建议吗?

【问题讨论】:

    标签: c++ huffman-code


    【解决方案1】:

    首先,以字节为单位写入树的大小。然后,编写树本身,然后是内容本身。

    读取时,先读取大小,然后读取树(现在您知道要读取多少个字符),然后读取内容。

    大小可以写成字符串,以换行结束——这样,你就知道第一个数字和换行属于树的大小。

    【讨论】:

    • 这就是我最初的想法,但问题是树可能很大!所以我必须写一个 Integer ,那里有 4 个字节!如果我把它写成一个字符串,那么我对输入的每个整数使用一个字节。对于试图通过一次保存 2 或 3 位来压缩内容的程序来说效率不高。
    • 你期望一棵树有多大?几千字节?
    • @angryInsomniac 比这更糟糕 - 在适当的条件下,size(tree)+size(compressed_data) 可能比 size(original_data) 更大。显然只有当你的字母表很小并且数据很大(不是均匀分布的)时才有意义。如果您对最少的通信位感兴趣(考虑到字典),那么有一个大型的理论计算机科学(开放)研究领域,称为通信复杂性:)
    • @user1071136 那是我所关心的,但是 C++ 休息室里的好人让我相信,对于更大的树,4 字节的开销真的没什么大不了的。对较小文件的压缩仍然很糟糕(阅读,在某些情况下它们实际上会膨胀)
    【解决方案2】:

    为什么不在前 8 个字节(每个 4 个字节)上写入 size 和 len,然后再写入数据? 然后是这样的:

    uint32_t compressed_size;
    uint32_t data_len;
    char * data;
    
    file.read((char*)compressed_size, 4);
    file.read((char*)data_len, 4);
    data = new char[data_len];
    zip.read(data, data_len);
    

    应该可以。 您可以压缩数据以获得更好的压缩效果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多