【问题标题】:How to find compression efficiency using Huffman encoding?如何使用霍夫曼编码找到压缩效率?
【发布时间】:2014-04-07 11:16:13
【问题描述】:

我使用 Huffman 编码压缩了一个二进制文件。现在我正在尝试寻找压缩效率。

在我的二进制文件中,我有符号(0 和 1 的一部分)和频率(符号的重复)。 假设我有:

  • 符号:0 频率:173
  • 符号:1 频率:50
  • 符号:2 频率:48
  • 符号:3 频率:45

目前每个符号都以 UInt64 编码,因此如果我计算大小的方式正确,文件大小将为 (173+50+48+45)*8=2528 字节。如果我错了,请纠正我。在调试时我得到 2536,还有 8 个我不知道为什么?

压缩后我得到这样的编码

  • 符号:0 代码:1
  • 符号:1 代码:00
  • 符号:2 代码:011
  • 符号:3 代码:010

谁能告诉我如何使用这些信息对这个二进制文件进行霍夫曼压缩?我尝试在 Google 上搜索,但没有二进制文件的样本,它们有一些浮动类型的频率,我无法理解如何将它们与我的二进制文件相关联。

【问题讨论】:

标签: c# compression huffman-code


【解决方案1】:

您需要简单地计算最终得到的总位数:

173 * 1 + 50 * 2 + 48 * 3 + 45 * 3

这涉及到 552 位。转换为整个字节给我们 69 个字节。所以这是压缩到 69/2528 或原始的 3% 左右,假设解压缩器可以知道字典等等。还假设您的输入符号(0 到 3)是 64 位值,出于某种原因。

【讨论】:

  • 能否请您给我一个小算法,了解如何从编码中计算这些“1”、“2”和“3”?
  • @unwind 您错误地将位与字节进行比较,将 69 字节与 2528 位进行比较。将 552 位与 2528 位进行比较,我们得到了大约 22% 的压缩率。如果还必须存储字典,他可能最好只使用 2 位编码。
  • @user234839 他正在计算符号频率乘以代码长度。符号 2(011)有 3 位,符号 3 也有,S1 有两位,S1 只有一位。
  • @Mathias 2528 不是位它的字节(二进制文件很大)它是 2828 字节。我现在有点困惑,但我确定大小是以字节为单位的,因为当我调试它时,我存储文件的变量是 byte[] fileContents 类型。它在调试时给出 2528
  • @user234839 那么最简单的数据压缩就是将其转换为 uint8,将其“压缩”到 12.5%。如果您将 4 个符号填充到一个字节中,它将被“压缩”到 3.125%,并且您的字典最多为 32 个字节长。 Huffman 编码压缩到 2.73%,因此与简单的代码簿方法相比,您可以节省 12%,但无需解压缩即可轻松访问。当然,如果你有更多(或有时更少)符号,霍夫曼仍然是要走的路。
【解决方案2】:

根据提供的频率,树是错误的。它必须是0 10 110 111 它总是以所有正位结束。不同于 Huffman 树的解决方案可能有效,但不能提供最佳压缩。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    相关资源
    最近更新 更多