大文件的霍夫曼树

Huffman tree for big files

本文关键字:霍夫曼 文件      更新时间:2023-10-16

>我一直在互联网上搜索,但找不到我需要的东西。

我必须使用霍夫曼编码压缩大文件。我的想法是读取文件的第一个 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 这样的块使用自适应霍夫曼编码更好

你不能指望霍夫曼编码有很多,除非数据在存在哪些字节方面非常偏颇。我刚刚尝试了来自维基百科的 100 MB 英文文本文件。它将文件减小到其原始大小的 63%,因此平均可能将 8 位降低到 5 位。此外,这是一次在大约 16 KB 的块中执行霍夫曼,以便代码适应每个块。

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