【发布时间】:2017-01-24 11:49:54
【问题描述】:
我一直在互联网上搜索,但找不到我需要的东西。
我必须使用 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 是一个函数,它构建 Huffman 树,让我意识到我能得到的最佳字符代码是 7 位,例如 0000001。
这就是我的问题的来源 - 为完整的 256 个单词字母表构建 Huffman Tree 是否值得?还是对像 1-2MB 这样的块使用自适应霍夫曼编码更好
【问题讨论】:
-
delete[] 不是 C。要么您的标签错误,要么您将遇到编译问题
-
我在 C++ 上做。我将其标记为
C,因为我认为它很相似,人们宁愿告诉我使用std::vector,然后实际回答我有关算法问题的问题。我现在将其取消标记:) -
完全取决于文件数据。如果文件其余部分中的数据与开头“足够接近”,那么您的想法有效。如果没有,那么您必须为每个部分制作不同的表格。在几个文件上尝试两种方式。
标签: c++ tree huffman-code