霍夫曼树为大文件

时间:2017-01-24 11:49:55

标签: c++ tree huffman-code

我一直在网上搜索,但无法找到我需要的东西。

我必须使用Huffman编码压缩大文件。我的想法是阅读文件的第一个1-2MB

(避免先读取整个文件来构建树,然后再次读取它来编码它,避免O(2n)),

并构建霍夫曼树。如果缺少256字母字节中的任何一个,我自己添加它,以防它出现在文件的后面(而不是在前1-2 MB中)。 但是试图用这个来测试结果:

int * totalFr = new int[256];
unsigned char * symArr= new  unsigned char[256];

for (int i = 0; i < 256; i++)
{
    totalFr[i] = i;
    symArr[i] = unsigned char(i);
}

int size = sizeof(symArr) / sizeof(symArr[0]);
buildHuffmanTree(totalFr,symArr, size );
delete[] totalFr;
delete[] arrei;

其中buildHuffmanTree是一个构建霍夫曼树的函数,让我意识到我能得到的最好的字符代码是7位,例如0000001

这就是我的问题所在 - 为一个完整的256字母字母构建霍夫曼树是否值得?或者更好的是将自适应霍夫曼编码用于像1-2MB

这样的块

1 个答案:

答案 0 :(得分:2)

除非数据在存在哪些字节方面存在极端偏差,否则你不能指望霍夫曼编码。我刚试过维基百科的100 MB英文文本。它将文件降低到原始大小的63%,因此平均可能只有8位到5位。这也是一次以大约16 KB的块进行霍夫曼,以便代码适应每个块。

正常的zlib压缩也会查找匹配的字符串,将其降低到原始大小的35%。更高级的压缩器,比如xz花费更多的时间和内存看起来更难和更远匹配字符串以及比霍夫曼编码好一点,将其降低到原始大小的26%。