Асимметричные числовые системы: как превзойти Хаффмана в сжатии

Асимметричные числовые системы: как превзойти Хаффмана в сжатии

Май 01, 2026 compression data-encoding information-theory algorithms entropy-coding zstandard performance-optimization web-infrastructure

За пределами Huffman: Как Asymmetric Numeral Systems дают идеальную компрессию

В веб-сервисах с миллионами запросов каждый байт на счету. Затраты на CDN, хранение в базах и скорость API зависят от качества сжатия. Большинство разработчиков просто берут gzip или brotli. Но есть ли способ достичь пределов теории информации?

Проблема теории информации

В данных символы не равны. Некоторые встречаются чаще других. Теорема Шеннона говорит: цена символа — это его информационная энтропия.

Пример:

  • Символ с вероятностью 50% стоит 1 бит.
  • 25% — 2 бита.
  • 37,5% — около 1,415 бита.

Huffman здесь подводит. Он дает коды целой длины. Нельзя выделить 1,415 бита — округляешь до 2. Эффективность падает.

Arithmetic Coding меняет правила

Забудьте о битовых кодях. Arithmetic coding кодирует всю последовательность как операции над одним числом. Это обратимая трансформация, которая пакует данные плотнее.

rANS (range Asymmetric Numeral Systems) — изящная реализация. Её используют в современных библиотеках сжатия и стриминге.

Как работает rANS

Всё просто: держим состояние x — одно целое число. Для каждого символа применяем формулу. Она обратима: декодер восстановит символ и предыдущее состояние.

Формула:

x′ = ⌊x/f_s⌋ × M + c_s + (x mod f_s)
  • f_s — частота символа s.
  • c_s — кумулятивная частота (сумма до него).
  • M — общая частота всех символов.

Пример с символами A, B, C. Частоты: A=4, B=3, C=1. M=8.

| Символ | Частота | Кумулятив | |--------|---------|-----------| | A | 4 | 0 | | B | 3 | 4 | | C | 1 | 7 |

Кодируем "ABC", старт x=13.

A (f=4, c=0):

x′ = ⌊13/4⌋ × 8 + 0 + (13 mod 4) = 3×8 + 0 + 1 = 25

B (f=3, c=4):

x′ = ⌊25/3⌋ × 8 + 4 + (25 mod 3) = 8×8 + 4 + 1 = 69

Финальное 69 хранит всю последовательность. Декодер развернёт обратно без потерь.

Почему это важно для систем

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

Лучшее сжатие: Близко к пределу Шеннона. На практике — 5-15% выигрыш над Huffman.

Стриминг: Работает с потоком. Не ждёшь весь файл.

Эффективность CPU: Простые целочисленные операции. Идеально для современных процессоров.

Реальное применение: В Zstandard от Facebook, форматах изображений Apple. Становится стандартом для критичных систем.

Проблема обратимости и её решение

Как понять, что кодирование кончилось? Держим состояние в допустимом диапазоне. Если растёт — выводим биты. При декодировании читаем биты по мере нужды.

Эта самосинхронизация — ключ к популярности rANS.

Что это значит для разработчиков

На хостинге NameOcean сжатие критично. Оптимизируйте API-ответы, бэкапы баз, хранилище в Vibe Hosting с ИИ. rANS сэкономит ресурсы и деньги.

Готовые библиотеки везде: zstandard в Python, JS-варианты. Код протестирован — внедряйте.

Взгляд шире

rANS показывает: прорывы рождаются из умной реализации идей. Arithmetic coding ждала эффективной математики без нагрузки на CPU.

Шеннон задал предел в 1948-м. rANS приближает к нему практично. Оптимизации — это теория плюс инженерия.

В следующий раз, когда сжатие ускорится или место сэкономится, спасибо Asymmetric Numeral Systems за работу в фоне.

Read in other languages:

BG EL CS UZ TR SV FI RO PT PL NB NL HU IT FR ES DE DA ZH-HANS EN