#c #compression #snappy
#сжатие #lzw #lz4
Вопрос:
Я читал, что алгоритм lz4 очень быстрый и имеет довольно хорошее сжатие. Но в моем тестовом приложении сжатый текст больше исходного текста. В чем проблема?
srand(time(NULL));
std::string text;
for (int i = 0; i < 65535; i)
text.push_back((char)(0 rand() % 256));
cout << "Text size: " << text.size() << endl;
char *compressedData = new char[text.size() * 2];
int compressedSize = LZ4_compress(text.c_str(), text.size(), compressedData);
cout << "Compressed size: " << compressedSize << endl;
Я также пробовал LZ4_compress, но результат тот же. Но если я создаю строку с одинаковыми символами или, скажем, с двумя разными символами, то сжатие присутствует.
Комментарии:
1. Чего вы ожидаете от сжатия случайных данных, не имеющих шаблонов (ваш вопрос на самом деле является ответом)?
2. Размер текста: 65535 Сжатый размер: 65793
3. шум (== случайные данные) не сжимается. Это основное свойство случайного источника. Чтобы ваш тест был действительным, вам лучше загрузить в свой буфер немного реального текста.
Ответ №1:
Взгляните на описание алгоритма LZ4. Он ссылается на общие подстроки в сжатом тексте. Он использует уже выведенный текст в качестве словаря.
Случайный текст или любой другой материал без повторяющихся последовательностей любой длины не будет хорошо сжиматься при его использовании. Для этого открытого текста алгоритм сжатия битов, вероятно, будет работать лучше.