【问题标题】:How to find the Compression ratio of a file using Huffman coding如何使用霍夫曼编码找到文件的压缩率
【发布时间】:2014-04-07 11:19:17
【问题描述】:

我使用Huffman encoding 压缩了binary file。现在我正在尝试查找compression efficiency

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

symbol :0 freq : 173
symbol :1 freq : 50
symbol :2 freq : 48
symbol :3 freq : 45 

文件大小为 (173+50+48+45)*8=2528 (如果我计算大小的方法正确?如果我错了请纠正我。(调试时我得到 2536)(还有8个我不知道为什么?)

压缩后我得到encoding这样的

symbol : 0 Code : 1
symbol : 1 Code : 00
symbol : 2 Code : 011
symbol : 3 Code : 010

谁能告诉我如何使用这些信息来获得这个二进制文件的霍夫曼压缩效率? (我尝试在谷歌上搜索,但没有二进制文件的样本,它们有一些浮动类型的频率,我无法理解如何将它们与我的二进制文件相关联)。非常感谢。算法 (c/c++/c#) 也值得赞赏。

【问题讨论】:

标签: c# data-structures compression huffman-code


【解决方案1】:

给定你的符号表:

symbol : 0 Code : 1
symbol : 1 Code : 00
symbol : 2 Code : 011
symbol : 3 Code : 010

你的字节数:

symbol :0 freq : 173
symbol :1 freq : 50
symbol :2 freq : 48
symbol :3 freq : 45 

然后将每个符号的出现次数乘以该符号的位数。例如,符号 0 需要 1 位进行编码,因此位数为 173。您有:

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

该计数以 为单位。除以 8 得到字节数,然后向上取整。这将告诉您编码数据的字节数。

您还必须存储 Huffman 表,在这种情况下您可以使用 8 个字节来存储。实际上,9 个字节,因为您必须存储大小。存储 Huffman 树的一般情况稍微复杂一些。

【讨论】:

  • 对不起,我无法理解这句话“你还必须存储霍夫曼表”?现在什么是霍夫曼表以及如何存储它?
  • 好吧,为了能够解码您的文件,您需要将霍夫曼表与实际数据一起存储。您还需要有一个结构来指示它的结束位置。
  • @Tarik 我不必解码文件,只需编码然后压缩比这两个必须打印。我还需要霍夫曼表吗?实际上霍夫曼表由什么组成?是否包含符号+编码?
  • @user234839:霍夫曼表是符号及其编码的列表。如果有人想解压缩文件,这些是必需的。您确实了解此作业的任何内容吗?
  • @JimMischel 我已经完成了,但不知道他们的名字。见这里prntscr.com/37su18 右侧的表称为“霍夫曼表”(包含编码),左侧的表称为数据(包含数据)。我对吗 ?如果我错了,请纠正。非常感谢
【解决方案2】:

获得 Huffman 表后,您可以通过将每个符号的位编码长度乘以该符号的频率来计算压缩图像的大小(以位为单位)。

除此之外,您还需要添加霍夫曼树本身的大小,这当然需要解压缩。

所以对于你来说,压缩长度将是

173 * 1 + 50 * 2 + 48 * 3 + 45 * 3 = 173 + 100 + 144 + 135 = 552 位 ~= 70 字节。

表格的大小取决于您如何表示它。

【讨论】:

  • 感谢回复,你的意思是 1*173 +2*50+3*48+3*45 吗?得到的结果是位还是字节? (文件大小为 2528 字节)。
  • 现在计算效率,我们需要做70/2528吗?
  • 抱歉还有一件事我无法理解这句话“存储霍夫曼表”?现在什么是霍夫曼表以及如何存储它?
  • 您需要将您的编码传达给解压缩器 - 否则它将不知道如何解释这些位。
【解决方案3】:

压缩率 = ((1 * 173) + (2 * 50) + (3 * 48) + (3 * 45)) / (173+50+48+45) = 1.746 位 熵率 = Plog2P 之和 = 1.439 位

【讨论】:

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