Я искал в Интернете, но не смог найти то, что мне нужно.Дерево Хаффмана для больших файлов
Мне нужно сжать большие файлы, используя кодировку Хаффмана. Моя идея состояла в том, чтобы прочитать первую 1-2 файла
(чтобы избежать первого чтения всего файла, чтобы построить дерево, а затем читать его еще раз, чтобы кодировать его, избегая O (2n)),
и построить дерево Хаффмана. Если какой-либо из 256 байтов алфавита отсутствует, я бы добавил его сам, если он появится позже в файле (а не в первых 1-2 МБ). Но пытаться проверить результат с помощью этого:
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
delete [] не является C. Либо ваш тег является неправильным, либо у вас возникнут проблемы с компиляцией – UKMonkey
Я делаю это на C++. Я отметил его 'C', потому что я думал, что это похоже, и люди предпочли бы мне использовать' std :: vector', а затем отвечая на вопрос об алгоритме. Теперь я не буду этого делать :) –
Зависит полностью от данных файла. Если данные в остальной части файла «достаточно близки» к началу, то ваша идея работает. Если нет, то для каждой секции вы должны сделать другую таблицу. Попробуйте оба варианта в нескольких файлах. – stark