【问题标题】:Byte frequency table for Huffman coding霍夫曼编码的字节频率表
【发布时间】:2010-08-18 18:10:41
【问题描述】:

我正在编写一个需要处理任意二进制文件的霍夫曼压缩器和解压缩器(在 C++ 中)。我需要一些数据结构的建议。现在,我的压缩过程如下:

  • 以二进制形式将文件的字节读取到 char* 缓冲区中
  • 使用 std::map 计算文件中每个字节模式的频率。 (这就是我想找麻烦的地方。)
  • 根据频率直方图构建二叉树。每个内部节点都有其子节点的频率总和,每个叶节点都有一个 char* 来表示实际字节。

这是我目前所处的位置。

我的问题是,如果我只使用从 char* 到 int 的映射,我到底在测量什么。如果我是正确的,这实际上不是我需要的。我认为我真正在做的是使用 char* 跟踪实际的 4 字节指针值。

所以,我打算对直方图使用映射,对存储在叶节点的数据使用 char。我的逻辑在这里合理吗?我的推理告诉我是的,但由于这是我第一次处理二进制数据,我想小心那些只会以奇怪方式出现的陷阱。

谢谢。

【问题讨论】:

    标签: c++ binary-data huffman-code


    【解决方案1】:

    你不需要地图;只有 256 个可能的值。只需 int freq[256] = {0} 并为输入中的每个字节添加 freq[data[idx]]++

    如果您真的想要地图,请使用map<unsigned char, int>;您对使用来自char* 的地图的怀疑是正确的。

    【讨论】:

    • 这实际上很有意义。我完全赞成避免调试 STL 容器错误。
    • 除此之外,地图实际上还有相当多的开销。每个条目都是一个单独的堆分配,每次查找都涉及 lg(N) 指针取消引用。如果您要存储大量具有宽间距或复杂键的项目,这非常好,但是当您可以摆脱它时,最好坚持使用数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多