Открыть сервис

Deflate

Deflate — это алгоритм сжатия данных без потерь, основанный на комбинации алгоритма LZ77 (Lempel-Ziv 1977) и кодирования Хаффмана. Разработан Филом Кацем (Phil Katz) в 1990 году для архиватора PKZIP и впоследствии ставший одним из наиболее распространённых методов сжатия в вычислительной технике. Deflate используется в форматах файлов ZIP, gzip, PNG, HTTP (сжатие данных веб-серверами) и многих других.

История

Алгоритм Deflate был создан Филом Кацем, основателем компании PKWare, как ответ на ограничения существовавших на тот момент методов сжатия. В 1980-х годах доминирующим архиватором был ARC, использующий алгоритм сжатия, основанный на LZW (Lempel-Ziv-Welch). Кац стремился создать более эффективный и быстрый алгоритм, который не нарушал бы патентов на LZW, принадлежавших корпорации Unisys.

В 1989 году Кац выпустил архиватор PKZIP 0.9, в котором впервые применил Deflate. Алгоритм был описан в спецификации формата ZIP (APPNOTE.TXT), что позволило другим разработчикам реализовывать его независимо. Благодаря открытости спецификации и высокой степени сжатия, Deflate быстро вытеснил ARC и стал стандартом де-факто для сжатия данных на платформе IBM PC.

В 1996 году алгоритм был стандартизирован как RFC 1951 (DEFLATE Compressed Data Format Specification). Позднее был разработан улучшенный вариант — Deflate64 (Enhanced Deflate), используемый в некоторых реализациях ZIP, однако он не получил столь широкого распространения, как оригинальный Deflate.

Принцип работы

Deflate объединяет два этапа сжатия: сначала данные обрабатываются алгоритмом LZ77, который заменяет повторяющиеся последовательности ссылками на предыдущие вхождения, а затем полученный поток символов и ссылок кодируется с помощью кодов Хаффмана.

Этап LZ77

На этом этапе алгоритм скользящим окном просматривает входные данные. Для каждой позиции он ищет самую длинную последовательность байтов, которая уже встречалась ранее в пределах окна (обычно размером от 32 КБ до 64 КБ). Если такая последовательность найдена, она заменяется парой (длина, расстояние), где длина — количество совпадающих байтов (от 3 до 258), а расстояние — отступ назад от текущей позиции (от 1 до 32768). Если совпадение не найдено, байт кодируется как литерал (исходное значение).

Этап кодирования Хаффмана

После обработки LZ77 поток данных состоит из двух типов элементов: литералов (байты от 0 до 255) и пар (длина, расстояние). Для кодирования этих элементов используется два дерева Хаффмана:

Коды Хаффмана строятся динамически для каждого блока данных на основе частоты встречаемости элементов. Deflate поддерживает три режима кодирования:

Формат данных

Сжатые данные Deflate организованы в виде последовательности блоков. Каждый блок начинается с 3-битного заголовка:

Для динамического Хаффмана после заголовка следует описание деревьев кодирования, которое включает коды длин для литералов/длин и расстояний, сжатые с помощью кодирования длин серий (run-length encoding). Затем идут сами сжатые данные, закодированные кодами Хаффмана.

Характеристики

Deflate обеспечивает сжатие без потерь, то есть исходные данные могут быть полностью восстановлены. Основные характеристики:

Применение

Deflate используется в огромном количестве программных продуктов и форматов:

Форматы файлов

Библиотеки

Сравнение с другими алгоритмами

Deflate уступает по степени сжатия более современным алгоритмам, таким как LZMA (используется в 7-Zip) или BZIP2, но превосходит их по скорости распаковки и простоте реализации. Для текстовых данных Deflate часто обеспечивает достаточную степень сжатия при низких вычислительных затратах. Алгоритмы семейства LZ4 и Snappy, ориентированные на максимальную скорость, сжимают хуже Deflate, но работают быстрее.

Интересные факты

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →