如何使用霍夫曼编码找到文件的压缩率 - c#

我已经使用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

有人可以告诉我如何使用这些信息来获得此二进制文件的霍夫曼压缩效率吗? (我尝试在Google上进行搜索,但没有二进制文件的示例,它们具有某种频率的float类型,我无法理解如何将它们与我的二进制文件相关联)。非常感谢。也可以使用算法(c / c ++ / c#)来做到这一点。

参考方案

给定您的符号表:

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得到字节数,然后舍入。这将告诉您编码数据的字节数。

您还必须存储霍夫曼表,在这种情况下,您可以以8个字节为单位。实际上是9个字节,因为您必须存储大小。存储霍夫曼树的一般情况有些复杂。

VS Code UI语言不会传播到python扩展命令面板 - python

我已将官方Microsoft python扩展(v2019.2.5558)添加到我的VS Code安装(v1.32.1)中。 VS Code使用默认的UI语言en(在locale.json中设置)运行。我从未安装任何其他语言包。由于VS Code的UI语言设置为en,因此我希望此设置会传播到命令面板。但是,您似乎无法在这里看到这种情况:有些命令以英语显示(如…

VS Code Python单元测试“未运行测试” - python

我正在使用unittest在VS Code中设置python单元测试,并遇到一些问题。我可以通过从状态栏中选择“运行测试”并在资源管理器中右键单击我的测试文件来运行测试。当我执行这些操作时,在Python测试日志窗口中会看到单元测试输出(例如,“ test_name ... ok”和“ Ran 1 test in 0.002s”),但是我收到一条VS代码通知…

LeetCode题解计算机为什么是基于二进制的?

可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制

LeetCode题解统计城市的所有灯泡

这个是我刚毕业的时候,一个真实的面试题,这是一个开放题。题目描述:想办法,将一个城市的所有灯泡数量统计出来。题解:费米估算法1、如果某个城市常驻人口有1000万2、假设每5人居住在一套房里,每套房有灯泡5只,那么住宅灯泡共有1000万只3、假设公众场所每10人共享一只灯泡,那么共有100万只4、主要的这两者相加就得出了1100万只当然实际上这是估算的,具体应…

LeetCode题解黑白圆盘

一个圆盘被涂上了黑白二色,两种颜色各占一个半圆。圆盘以一个未知的速度、按一个未知的方向旋转。你有一种特殊的相机可以让你即时观察到圆上的一个点的颜色。你需要多少个相机才能确定圆盘旋转的方向?题解:可以用一个相机即可