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

Словарные методы сжатия

Словарные методы сжатия — это класс алгоритмов сжатия данных без потерь, основанных на замене повторяющихся последовательностей символов (фраз, слов) ссылками на их предыдущие вхождения в словарь. В отличие от статистических методов (например, кодирования Хаффмана), которые оперируют вероятностями появления отдельных символов, словарные методы строят динамический или статический словарь фраз и кодируют данные, заменяя фразы более короткими кодами (индексами или смещениями). Основной принцип заключается в том, что если некоторая строка уже встречалась в потоке данных, то её повторное появление можно закодировать как ссылку на предыдущее вхождение, что позволяет эффективно сжимать текстовые, программные и другие данные с высокой степенью избыточности.

История

Идея словарного сжатия восходит к работам Клода Шеннона (1948 год), который предложил использовать «словарь» для кодирования сообщений. Однако практические алгоритмы начали развиваться в 1970-х годах. В 1977 году израильские учёные Якоб Зив и Абрахам Лемпель опубликовали алгоритм LZ77, который стал основой для большинства современных словарных методов. В 1978 году они представили модификацию — LZ78, где словарь строился не из скользящего окна, а из явно задаваемых фраз. В 1984 году Терри Уэлч разработал алгоритм LZW (Lempel-Ziv-Welch), который стал широко использоваться в форматах GIF и Unix-утилитах compress. В 1990-х годах алгоритмы LZ77 и LZ78 легли в основу стандартов сжатия данных (PKZIP, gzip, PNG, Deflate). В 2000-х годах появились более совершенные реализации, такие как LZMA (Lempel-Ziv-Markov chain algorithm) в архиваторе 7-Zip и Brotli, используемый в веб-сжатии.

Основные принципы

Словарные методы сжатия делятся на два основных подхода: алгоритмы на основе скользящего окна (LZ77) и алгоритмы на основе явного словаря фраз (LZ78). В обоих случаях сжатие достигается за счёт замены повторяющихся последовательностей символов на ссылки, которые короче самих последовательностей.

Алгоритмы на основе скользящего окна (LZ77)

В алгоритме LZ77 сжатие выполняется с помощью двух буферов: «словаря» (скользящее окно, содержащее уже обработанные данные) и «буфера предварительного просмотра» (look-ahead buffer), содержащего ещё не закодированные символы. Алгоритм ищет самую длинную подстроку в буфере предварительного просмотра, которая совпадает с подстрокой в словаре. Если такая подстрока найдена, она кодируется как триплет (смещение, длина, следующий символ), где:

  • смещение — расстояние от текущей позиции до начала найденной подстроки в словаре;
  • длина — количество совпадающих символов;
  • следующий символ — первый символ после совпадения, который не удалось найти в словаре.

Если совпадение не найдено, символ кодируется как литерал (сам символ) с флагом, указывающим на отсутствие ссылки. После кодирования словарь сдвигается вперёд на один или несколько символов.

Алгоритмы на основе явного словаря (LZ78)

В алгоритме LZ78 словарь строится динамически из фраз, которые встречаются в данных. Каждая новая фраза добавляется в словарь и получает уникальный индекс. Кодирование происходит путём отправки пары (индекс, следующий символ), где индекс ссылается на предыдущую фразу в словаре, а следующий символ — это новый символ, который расширяет фразу. Например, если в словаре уже есть фраза «ab» с индексом 5, а следующая фраза — «abc», то кодируется как (5, «c»). В отличие от LZ77, словарь не ограничен скользящим окном и может расти неограниченно, что может привести к переполнению памяти.

Классификация

Словарные методы сжатия можно классифицировать по нескольким признакам:

По способу построения словаря

  • Статические словари — словарь фиксирован и известен как кодировщику, так и декодировщику заранее (например, словарь для сжатия английского текста). Используются редко из-за низкой адаптивности.
  • Динамические (адаптивные) словари — словарь строится в процессе сжатия на основе уже обработанных данных. Это основной тип, используемый в LZ77, LZ78, LZW.
  • Полуадаптивные словари — словарь строится на основе анализа всего входного потока перед сжатием, а затем передаётся вместе с данными.

По типу ссылок

  • Ссылки на позицию в окне (LZ77) — указывают смещение и длину совпадения в скользящем окне.
  • Ссылки на индекс в словаре (LZ78, LZW) — указывают номер фразы в словаре.

По алгоритму кодирования

  • Чисто словарные — используют только замену фраз на ссылки (базовые LZ77, LZ78).
  • Гибридные — комбинируют словарный метод с энтропийным кодированием (например, Deflate использует LZ77 + кодирование Хаффмана; LZMA использует LZ77 + марковское моделирование).

Применение

Словарные методы сжатия широко применяются в различных областях информационных технологий:

Архивация данных

  • PKZIP (формат ZIP) — использует алгоритм Deflate (LZ77 + кодирование Хаффмана).
  • gzip — использует Deflate для сжатия потоков данных.
  • 7-Zip — использует LZMA (LZ77 с улучшенным поиском совпадений и марковским моделированием).
  • RAR — использует собственный словарный алгоритм (PPMd и LZSS).

Форматы изображений

  • GIF — использует алгоритм LZW (LZ78 с фиксированным размером словаря).
  • PNG — использует Deflate для сжатия растровых данных после фильтрации.
  • TIFF — поддерживает сжатие LZW.

Веб-сжатие

  • HTTP-сжатие — алгоритмы gzip, deflate, Brotli (Brotli использует LZ77 с предопределённым словарём для HTML, CSS, JavaScript).
  • WebP — использует алгоритм сжатия на основе LZ77 для изображений.

Сжатие текста и программного кода

  • Unix-утилиты compress — используют LZW.
  • Сжатие исполняемых файлов — UPX использует LZ77 для упаковки PE, ELF и Mach-O файлов.

Примеры алгоритмов

LZ77

  • Принцип: скользящее окно размером 4–32 КБ, поиск совпадений.
  • Кодирование: триплет (смещение, длина, следующий символ).
  • Декодирование: простое восстановление по ссылкам.
  • Достоинства: высокая скорость декодирования, низкая сложность.
  • Недостатки: ограниченный размер окна, неэффективность при длинных повторениях.

LZ78

  • Принцип: динамический словарь фраз, растущий неограниченно.
  • Кодирование: пара (индекс, следующий символ).
  • Декодирование: требуется восстановление словаря.
  • Достоинства: не зависит от размера окна.
  • Недостатки: риск переполнения памяти, сложность управления словарём.

LZW

  • Модификация LZ78: словарь инициализируется всеми возможными символами (например, 256 байт), а новые фразы добавляются только при их появлении.
  • Применение: GIF, compress.
  • Особенность: не требует передачи начального словаря — он восстанавливается на стороне декодировщика.

Deflate

  • Гибридный алгоритм: сначала LZ77 (с окном 32 КБ), затем кодирование Хаффмана для сжатия ссылок и литералов.
  • Используется: ZIP, gzip, PNG, HTTP deflate.
  • Степень сжатия: средняя, скорость высокая.

LZMA (Lempel-Ziv-Markov chain algorithm)

  • Улучшение LZ77: использует цепь Маркова для предсказания следующего символа, большие окна (до 4 ГБ), битовое кодирование.
  • Применение: 7-Zip, XZ Utils.
  • Степень сжатия: высокая, скорость сжатия низкая, декодирование быстрое.

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

  • Алгоритм LZW был запатентован компанией Unisys, что привело к юридическим спорам и ограничениям на использование формата GIF в 1990-х годах. В 2003 году срок действия патента истёк.
  • Алгоритм Deflate, разработанный Филом Кацем для PKZIP, стал стандартом де-факто для сжатия данных в интернете.
  • В алгоритме Brotli, используемом в Google Chrome, предопределённый словарь содержит более 13 000 часто встречающихся фраз из HTML, CSS и JavaScript, что повышает сжатие для веб-трафика.
  • Словарные методы сжатия являются основой для многих современных архиваторов, обеспечивая сжатие текстовых файлов в 2–5 раз, а программных файлов — в 1,5–3 раза.

Критика и ограничения

  • Ограниченная эффективность на случайных данных: словарные методы плохо сжимают данные, в которых нет повторяющихся последовательностей (например, зашифрованные или сжатые файлы).
  • Проблема с памятью: в алгоритмах LZ78 и LZW словарь может расти неограниченно, что требует управления памятью (например, сброс словаря при достижении лимита).
  • Зависимость от размера окна: в LZ77 слишком маленькое окно снижает степень сжатия, слишком большое — увеличивает время поиска совпадений.
  • Необходимость баланса: гибридные алгоритмы (Deflate, LZMA) требуют настройки параметров для достижения оптимального сжатия.

Источники

  • Зив Я., Лемпель А. «A Universal Algorithm for Sequential Data Compression» (1977).
  • Зив Я., Лемпель А. «Compression of Individual Sequences via Variable-Rate Coding» (1978).
  • Уэлч Т. «A Technique for High-Performance Data Compression» (1984).
  • Саломон Д. «Сжатие данных, изображений и звука» (2004).
  • Сейди Д. «Алгоритмы сжатия данных» (2007).

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

На главную BFOmetr →