algorithm - 无需构建树即可预测霍夫曼压缩率

标签 algorithm compression huffman-code

我有一个二进制文件,我知道其中每个符号出现的次数。如果我要使用霍夫曼算法压缩它,我需要预测压缩文件的长度。我只对假设的输出长度感兴趣,而不是对单个符号的代码感兴趣,因此构建霍夫曼树似乎是多余的。
作为一个例子,我需要得到类似
“包含4个a、5个b和10个c的38位二进制字符串可以压缩到28位。”,除了文件和字母表大小都很大更大。

基本问题是:是否可以在不构建树的情况下完成?

看看贪心算法:http://www.siggraph.org/education/materials/HyperGraph/video/mpeg/mpegfaq/huffman_tutorial.html
看起来树可以在 n*log(n) 时间内构建,其中 n 是文件中不同符号的数量。这渐进地不错,但需要为树节点分配内存,并且做了很多工作,在我的例子中这些工作都被浪费了。

最佳答案

压缩文件中每个符号的平均位数的下限只不过是所有符号的熵H = -sum(p(x)*log(p(x)))输入中的 x。 P(x) = freq(x)/(文件大小)。使用此压缩长度(下限)= 文件大小*H。这是文件压缩大小的下限。但不幸的是,在大多数情况下无法实现最佳熵,因为位是整数而不是分数,因此在实际情况下需要构造哈夫曼树以获得正确的压缩大小。但最佳压缩大小可用于获得可能的压缩量上限,并决定是否使用霍夫曼。

关于algorithm - 无需构建树即可预测霍夫曼压缩率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24172313/

相关文章:

python - python中的zlib解压

swift - DEFLATE(解压缩)算法的 native Swift 实现

algorithm - 哈夫曼码的全二叉树有什么优势?

algorithm - 船上运动优化

algorithm - 严格二叉树中的叶子数

compression - rpmbuild更改压缩格式

c++ - 如何在不使用开关的情况下对字符串进行频率分析

algorithm - 将元素放入多个容量袋中的最佳解决方案

algorithm - 在一组单词中找到匹配的短语

java - 霍夫曼树编码