Голомбовское кодирование: как работает элегантный алгоритм сжатия данных
Golomb Coding: когда математика помогает сжать данные
Всё чаще разработчики сталкиваются с задачей сжатия данных, где обычные алгоритмы вроде gzip или LZ4 работают неоптимально. Особенно если данные имеют чёткую математическую структуру. Здесь на помощь приходит Golomb coding — метод сжатия без потерь, предложенный Соломоном Голомбом ещё в 60-х годах прошлого века.
Его главная особенность — узкая специализация. Алгоритм эффективен только для данных с геометрическим распределением, где маленькие значения встречаются намного чаще больших.
Где встречается геометрическое распределение
Такие данные окружают нас повсюду. Количество попыток повторной отправки пакета в сети, разница между соседними кадрами в видео, частота ошибок разной критичности в логах — во всех этих случаях маленькие числа доминируют. Golomb coding использует это преимущество, назначая короткие коды частым значениям и длинные — редким.
Принцип работы
В основе лежит параметр M. Каждое число разбивается на частное и остаток. Частное кодируется унарным кодом, остаток — бинарным. Получается компактное представление, которое хорошо работает именно при геометрическом распределении.
На практике это означает: если в ваших данных преобладают небольшие значения, Golomb coding даст лучшее сжатие, чем универсальные алгоритмы, и при этом потребует меньше ресурсов процессора.
Rice coding: упрощённая версия
Роберт Райс предложил ограничить параметр M степенями двойки. Это позволило заменить деление и взятие остатка на простые побитовые операции — сдвиги и маски. В результате Rice coding работает быстрее Golomb coding, сохраняя сопоставимое качество сжатия.
Где используют эти алгоритмы
Несмотря на возраст, методы до сих пор применяются в реальных системах:
- Видеокодеки H.264 и H.265 используют Exp-Golomb coding для заголовков
- Алгоритмы сжатия голоса применяют Rice coding
- Инструменты биоинформатики сжимают последовательности ДНК
- IoT-устройства минимизируют объём передаваемых данных
- Встраиваемые системы экономят процессорное время
Преимущества для разработчика
Главное достоинство — предсказуемость. Достаточно правильно выбрать параметр M, и сжатие будет работать стабильно. Кодирование и декодирование выполняются за константное время, не требуют больших таблиц и дают одинаковый результат при каждом запуске.
Когда метод не подходит
Если значения распределены равномерно или по нормальному закону, Golomb coding может даже увеличить размер данных. В таких случаях лучше использовать адаптивные алгоритмы или LZMA.
Итог
Golomb и Rice coding — пример того, как понимание структуры данных позволяет создавать простые и эффективные решения. В мире, где доминируют сложные ML-модели, эти алгоритмы 60-х годов всё ещё находят применение там, где данные имеют нужное распределение.