我一直在搜索互联网,但找不到我需要的东西。
我必须使用霍夫曼编码来压缩大文件。我的想法是读取文件的前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之类的块使用自适应霍夫曼编码更好
最佳答案
除非数据对存在的字节有很大的偏见,否则不能仅凭霍夫曼编码就可以期待很多。我只是尝试了Wikipedia的100 MB英文文本文件。它使文件减小到其原始大小的63%,因此平均可能从8位减小到5位。同样,霍夫曼(Huffman)一次以大约16 KB的块进行,因此代码适用于每个块。
常规zlib压缩(还会查找匹配的字符串)会将其压缩到原始大小的35%。更高级的压缩器(例如xz)花费更多的时间和内存来查找字符串越来越费劲,并且比霍夫曼编码要好一些,从而将压缩率降低到原始大小的26%。
关于c++ - 大文件的霍夫曼树,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41827511/