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

Алгоритм Deflate

Алгоритм Deflate — это алгоритм сжатия данных без потерь, основанный на комбинации алгоритма LZ77 и кодирования Хаффмана. Он был разработан Филом Кацем в 1993 году для программы PKZIP и впоследствии стал широко распространённым стандартом сжатия, используемым в форматах ZIP, gzip, PNG, HTTP (сжатие содержимого) и многих других. Deflate обеспечивает высокую степень сжатия при относительно низких требованиях к памяти и вычислительным ресурсам, что делает его эффективным для общего назначения.

История

Алгоритм Deflate был создан Филом Кацем в рамках работы над архиватором PKZIP 2.0. До этого основным стандартом сжатия в PKZIP был алгоритм Implode, который также использовал LZ77, но с более простым энтропийным кодированием. Кац разработал Deflate как более совершенный метод, способный конкурировать с алгоритмами LZW и LHA, которые доминировали на рынке в начале 1990-х годов.

В 1996 году спецификация Deflate была опубликована в виде RFC 1951 (DEFLATE Compressed Data Format Specification version 1.3). Это сделало алгоритм открытым и свободным для использования, что способствовало его быстрому распространению. В отличие от LZW, который был запатентован компанией Unisys, Deflate не имел патентных ограничений, что стало ключевым фактором его популярности в открытых форматах, таких как PNG и gzip.

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

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

Этап 1: LZ77 (скользящее окно)

Алгоритм LZ77 заменяет повторяющиеся последовательности байтов ссылками на предыдущие вхождения. Для этого используется «скользящее окно» — буфер фиксированного размера (обычно 32 КБ), в котором хранятся последние обработанные данные.

Максимальная длина совпадения составляет 258 байтов, а максимальное расстояние — 32 768 байтов (2^15). Эти ограничения заданы спецификацией RFC 1951.

Этап 2: Кодирование Хаффмана

После этапа LZ77 данные представляют собой последовательность символов двух типов: литералы (0–255) и коды длины (257–285), а также специальный символ конца блока (256). Коды длины всегда сопровождаются дополнительными битами, уточняющими точную длину совпадения, и кодами расстояния (0–29), которые также имеют дополнительные биты.

Для сжатия этой последовательности используется кодирование Хаффмана — метод построения префиксных кодов переменной длины на основе частоты встречаемости символов. Более частые символы получают более короткие коды.

Deflate поддерживает два режима:

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

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

Для несжатых блоков (BTYPE=00) данные выравниваются по границе байта и содержат длину блока (16 бит) и её побитовое дополнение для проверки целостности.

Для сжатых блоков данные кодируются в виде последовательности кодов Хаффмана, за которыми следуют дополнительные биты (для длин и расстояний), и заканчиваются кодом конца блока (256).

Применение

Форматы архивов

Графические форматы

Сетевые протоколы

Прочие применения

Реализации

Наиболее известной и широко используемой реализацией Deflate является библиотека zlib, написанная Жаном-Лу Гайи и Марком Адлером. Она предоставляет функции для сжатия и распаковки данных в форматах Deflate, gzip и zlib. zlib является эталонной реализацией и используется в большинстве операционных систем, веб-браузеров и серверного ПО.

Другие реализации включают:

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

АлгоритмТип сжатияСкорость сжатияСтепень сжатияПамять
DeflateБез потерьСредняяХорошая32 КБ
LZMAБез потерьМедленнаяОтличнаяДо 4 ГБ
bzip2Без потерьМедленнаяОчень хорошаяДо 9 МБ
LZWБез потерьВысокаяСредняя4–12 КБ

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

Ограничения и недостатки

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

Источники

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

На главную BFOmetr →