"Злиб сжимает его примерно в 4 раза." означает, что файл размером 100 КБ теперь занимает минус 300 КБ; это довольно впечатляет по любому определению :-). Я предполагаю, что вы имеете в виду, что он сокращает его на 75%, то есть до 1/4 его первоначального размера.
Одна из возможностей оптимизированного сжатия заключается в следующем (предполагается, что 32-разрядное целое число и самое большее 3 бита изменяется от элемента к элементу).
- Вывести первое целое число (32 бита).
- Вывести количество битовых изменений (n = 0-3, 2 бита).
- Вывести n битовых спецификаторов (0-31, 5 бит каждый).
Наихудший случай для этого сжатия - 3-битные изменения в каждом целом числе (2 + 5 + 5 + 5 бит), которые будут стремиться к 17/32 от исходного размера (сжатие 46,875%).
Я говорю «стремится к», поскольку первое целое число всегда составляет 32 бита, но для любого массива приличного размера это первое целое число будет пренебрежимо малым.
Наилучшим случаем является файл с одинаковыми целыми числами (без битовых изменений для каждого целого числа, только 2 нулевых бита) - он будет стремиться к 2/32 исходного размера (сжатие 93,75%).
Если вы усредняете 2 бита на каждое целое число (как вы говорите, это ваш общий случай), вы получите 2 + 5 + 5 бит на целое число, что приведет к сжатию 12/32 или 62,5%.
Ваша точка безубыточности (если zlib дает 75% сжатия) равна 8 битам на целое число, что будет
- однобитовые изменения (2 + 5 = 7 бит): 80% переходов.
- двухбитные изменения (2 + 5 + 5 = 12 бит): 20% переходов.
Это означает, что ваше среднее значение должно составлять 1,2-битные изменения на целое число, чтобы это стоило.
Одна вещь, которую я бы посоветовал посмотреть, это 7zip - у нее очень либеральная лицензия, и вы можете связать ее со своим кодом (я думаю, что источник также доступен).
Я заметил (для моих вещей в любом случае), он работает на намного лучше, чем WinZip на платформе Windows, поэтому он также может превзойти zlib.