如何使用霍夫曼编码找到文件的压缩比

时间:2014-04-07 11:19:17

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

我使用binary file压缩了Huffman encoding。现在我想找到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#)也是如此。

3 个答案:

答案 0 :(得分:3)

给出你的符号表:

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个字节因为你必须存储大小。存储霍夫曼树的一般情况更为复杂。

答案 1 :(得分:2)

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

最重要的是,你需要添加Huffman树本身的大小,这当然需要解压缩。

因此,对于您的示例,压缩长度将为

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

表的大小取决于您的表示方式。

答案 2 :(得分:0)

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