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

Словарное сжатие

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

История

Идея использования словаря для сжатия восходит к ранним работам по теории информации. В 1977 году израильские учёные Якоб Зив и Абрахам Лемпел опубликовали алгоритм LZ77, который заложил основу для целого семейства словарных методов. Вместо построения явного словаря LZ77 использует скользящее окно — буфер, содержащий уже обработанные данные. Алгоритм ищет в этом окне самую длинную совпадающую подстроку и кодирует её парой (смещение от текущей позиции, длина совпадения). Если совпадение не найдено, символ кодируется как литерал (непосредственное значение).

В 1978 году те же авторы представили LZ78, который строит словарь явно, добавляя в него новые фразы по мере обработки. Каждая фраза кодируется ссылкой на индекс предыдущей фразы плюс новый символ. Этот подход стал основой для многих последующих реализаций.

Основные вехи развития:

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

Словарное сжатие основано на выявлении и устранении избыточности — повторяющихся паттернов в данных. Процесс сжатия включает три этапа:

  1. Анализ входного потока: алгоритм последовательно читает данные, разбивая их на фразы (слова, фрагменты). Для каждой новой фразы проверяется, встречалась ли она ранее.
  2. Поиск совпадений: если фраза уже есть в словаре (или в скользящем окне для LZ77), она заменяется ссылкой — указателем на предыдущее вхождение. Ссылка обычно состоит из двух чисел: идентификатора (индекса или смещения) и длины совпадения.
  3. Кодирование: ссылки и литералы (уникальные фрагменты) упаковываются в сжатый поток. Для повышения эффективности часто применяется дополнительное энтропийное кодирование — например, кодирование Хаффмана, арифметическое кодирование или кодирование длин серий.

Пример

Рассмотрим строку: "abracadabra".

Результат: литералы a, b, r, ссылка (3,1), литералы c, a, d, ссылка (4,1), ссылка (8,3). В реальных алгоритмах формат кодирования может отличаться.

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

Словарные методы делятся на два основных класса:

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

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

Применение

Словарное сжатие используется в широком спектре областей:

Преимущества и недостатки

Преимущества

Недостатки

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

Источники

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

На главную BFOmetr →