Асимметричные числовые системы: как превзойти Хаффмана в сжатии
За пределами 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 за работу в фоне.