大文件的霍夫曼树
Huffman tree for big files
>我一直在互联网上搜索,但找不到我需要的东西。
我必须使用霍夫曼编码压缩大文件。我的想法是读取文件的第一个 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%。
相关文章:
- 为什么指标有时效果很好,有时效果不佳?写下霍夫曼代码
- 如何存储霍夫曼转换后的二进制代码?
- 霍夫曼压缩机/解压缩器
- 霍夫曼编码 c++
- 霍夫曼解码功能反复反复压缩一个字符
- 霍夫曼解码压缩文件
- 实现霍夫曼树
- 没有指针的递归结构?(霍夫曼)
- 大文件的霍夫曼树
- 哪种方法更适合霍夫曼编码 我想读取字符及其频率
- 霍夫曼编码创建树C++
- 霍夫曼以位存储代码
- 带有查找表的霍夫曼代码
- 使用 std::unique_ptr 的霍夫曼树代码不起作用
- 霍夫曼解码中的递归函数不退出
- 霍夫曼代码,树的初始输入有问题
- 如何有效地解压缩霍夫曼编码的文件
- 霍夫曼压缩读取文件不会复制二进制文件c++中的所有字节
- 在霍夫曼压缩后将代码表存储在压缩文件中,并从此表构建用于解压缩的树
- 如何使用霍夫曼代码压缩文件