Арифметическое кодирование
Арифметическое кодирование — это метод сжатия данных без потерь, который представляет последовательность символов в виде одного числа (дроби) из интервала [0, 1). В отличие от методов кодирования с фиксированной длиной кода (например, кода Хаффмана), арифметическое кодирование может кодировать сообщение дробным числом битов, что позволяет достигать энтропии источника (теоретического предела сжатия) с высокой точностью.
Принцип работы
Алгоритм арифметического кодирования основан на последовательном сужении исходного интервала [0, 1) в соответствии с вероятностями появления символов во входном потоке. Каждому символу алфавита ставится в соответствие подынтервал, длина которого пропорциональна его вероятности. При обработке каждого символа текущий интервал заменяется на подынтервал, соответствующий этому символу. После обработки всей последовательности результирующий интервал однозначно определяет закодированное сообщение. В качестве кода обычно выбирается любое число из этого интервала, чаще всего — его нижняя граница, записанная в двоичной системе счисления.
Пример кодирования
Пусть алфавит состоит из двух символов: A (вероятность 0,75) и B (вероятность 0,25). Исходный интервал — [0, 1). Символу A соответствует подынтервал [0, 0,75), символу B — [0,75, 1).
Для кодирования последовательности «AAB»:
- Символ A: интервал сужается до [0, 0,75).
- Символ A: интервал сужается до [0, 0,5625) (0,75 * 0,75 = 0,5625).
- Символ B: интервал сужается до [0, 421875, 0,5625) (левая граница: 0,5625 0,75 = 0,421875; правая граница: 0,5625 1 = 0,5625).
Любое число из этого интервала, например 0,5, является кодом сообщения «AAB». Для декодирования необходимо знать вероятности символов и последовательно определять, в какой подынтервал попадает число.
Преимущества и недостатки
Преимущества
- Высокая степень сжатия: Арифметическое кодирование может сжимать данные до энтропии источника, что делает его более эффективным, чем код Хаффмана, особенно для источников с неравномерным распределением вероятностей или с высокой корреляцией символов.
- Адаптивность: Алгоритм легко адаптируется к изменяющейся статистике данных (адаптивное арифметическое кодирование), что позволяет сжимать данные без предварительного прохода по файлу для сбора частот.
- Работа с дробными битами: В отличие от кода Хаффмана, который требует целого числа битов на символ, арифметическое кодирование может представлять символ дробным числом битов, что особенно важно для сжатия с высокой точностью.
Недостатки
- Вычислительная сложность: Арифметическое кодирование требует операций с плавающей точкой высокой точности (или целочисленной арифметики с большими числами), что делает его медленнее, чем методы с фиксированной длиной кода, такие как код Хаффмана.
- Чувствительность к ошибкам: Ошибка в одном бите закодированного числа может привести к полной потере данных при декодировании, так как алгоритм основан на точном определении интервала.
- Патентные ограничения: В конце XX — начале XXI века многие реализации арифметического кодирования были защищены патентами, что ограничивало их использование в свободном программном обеспечении. Однако большинство ключевых патентов к настоящему времени истекли.
Применение
Арифметическое кодирование широко используется в различных областях, где требуется высокая степень сжатия данных без потерь:
- Сжатие изображений: Входит в состав стандартов JPEG (в режиме сжатия без потерь) и JPEG 2000.
- Сжатие видео: Используется в кодеках H.264/AVC, H.265/HEVC, AV1 и VP9 для кодирования битового потока (энтропийное кодирование).
- Сжатие аудио: Применяется в некоторых аудиокодеках, например, в MPEG-4 ALS (Audio Lossless Coding).
- Сжатие текста: Используется в архиваторах, таких как PAQ, которые достигают рекордных показателей сжатия на тестовых наборах данных.
- Сжатие данных в научных и инженерных приложениях: Применяется для сжатия результатов численных симуляций, телеметрических данных и других потоков с высокой избыточностью.
Разновидности
Адаптивное арифметическое кодирование
В адаптивной версии вероятности символов не фиксируются заранее, а обновляются по мере обработки данных. Это позволяет сжимать данные без предварительного анализа, что важно для потокового сжатия и сжатия файлов с неизвестной статистикой.
Целочисленное арифметическое кодирование
Для устранения проблем с точностью и производительностью, связанных с арифметикой с плавающей точкой, была разработана целочисленная версия алгоритма. В ней интервал представляется в виде целых чисел (например, в диапазоне от 0 до 2^32 - 1), а сужение интервала выполняется с помощью целочисленного умножения и деления. Эта версия используется в большинстве практических реализаций.
Арифметическое кодирование с контекстным моделированием
Для достижения максимальной степени сжатия арифметическое кодирование часто комбинируется с контекстным моделированием, где вероятности символов зависят от предыдущих символов (контекста). Примером является алгоритм PAQ, который использует сложные контекстные модели для предсказания вероятностей.
Сравнение с кодом Хаффмана
| Характеристика | Арифметическое кодирование | Код Хаффмана |
|---|---|---|
| Длина кода | Дробная (может быть менее 1 бита на символ) | Целая (не менее 1 бита на символ) |
| Эффективность | Может достигать энтропии | Отстает от энтропии на 1 бит на символ в худшем случае |
| Скорость | Медленнее (требует умножения/деления) | Быстрее (только табличный поиск) |
| Сложность реализации | Выше (требуется управление точностью) | Ниже |
| Адаптивность | Легко адаптируется | Требует перестроения дерева |
Историческая справка
Идея арифметического кодирования была впервые предложена Питером Элиасом в 1960-х годах, но не была опубликована. Независимо от него, в 1976 году Дж. Риссанен опубликовал первую практическую реализацию алгоритма. В 1987 году Иэн Уиттен, Радфорд Нил и Джон Клири разработали эффективную целочисленную версию, которая стала основой для многих последующих реализаций. В 1990-х годах арифметическое кодирование было включено в стандарты сжатия изображений и видео, что способствовало его широкому распространению.
Интересные факты
- Арифметическое кодирование может сжимать данные настолько эффективно, что для кодирования одного символа может потребоваться менее одного бита. Например, если символ встречается с вероятностью 90%, его код может занимать около 0,15 бита.
- Алгоритм арифметического кодирования лежит в основе многих рекордных результатов на тестовых наборах данных для сжатия без потерь (например, Calgary Corpus, Canterbury Corpus).
- В отличие от кода Хаффмана, который является асимптотически оптимальным, арифметическое кодирование является оптимальным в точном смысле, то есть его длина кода может быть сколь угодно близка к энтропии.
Источники
- Witten, I. H., Neal, R. M., & Cleary, J. G. (1987). Arithmetic coding for data compression. Communications of the ACM, 30(6), 520-540.
- Rissanen, J. (1976). Generalized Kraft inequality and arithmetic coding. IBM Journal of Research and Development, 20(3), 198-203.
- Salomon, D. (2007). Data Compression: The Complete Reference (4th ed.). Springer.
- Sayood, K. (2017). Introduction to Data Compression (5th ed.). Morgan Kaufmann.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →