
10.5. Арифметическое кодирование
В ходе арифметического кодирования текст представляется вещественными числами в интервале от 0 до 1. По мере кодирования текста, отображающий его интервал уменьшается, а количество битов для его представления возрастает. Очередные символы текста сокращают величину интервала исходя из значений их вероятностей, определяемых моделью (фиксированной или адаптивной). Более вероятные символы делают это в меньшей степени, чем менее вероятные, и, следовательно, добавляют меньше битов к результату.
Перед началом работы соответствующий тексту интервал есть [0; 1). При обработке очередного символа его ширина сужается за счет выделения этому символу части интервала. К примеру, применим к тексту "пять!" алфавита о п т ь я ! (буквы для "опять!" в алфавитном порядке) модель с постоянными вероятностями (т.н. фиксированная модель), заданными в табл. 1.
Таблица 10.1. Пример постоянной модели для алфавита a,e,i,o,u,! .
Символ |
Вероятность |
Интервал |
о |
0.3 |
[ 0.0;0.3 ) |
п |
0.2 |
[ 0.3;0.5 ) |
т |
0.2 |
[ 0.5;0.7 ) |
ь |
0.1 |
[ 0.7;0.8 ) |
я |
0.1 |
[ 0.8;0.9 ) |
! |
0.1 |
[ 0.9;1.0 ) |
И кодировщику, и декодировщику известно, что в самом начале интервал есть [0; 1). После просмотра первого символа "п", кодировщик сужает интервал до [0.3; 0.5), который модель выделяет этому символу. Второй символ "я" сузит этот новый интервал до девятой его десятой части, поскольку для "я" выделен фиксированный интервал [0.8; 0.9). В результате получим рабочий интервал [0.46; 0.48), т.к. предыдущий интервал имел ширину в 0.2 единицы и одна десятая от него есть 0.02. Следующему символу "т" соответствует фиксированный интервал [0.5; 0.7), что применительно к рабочему интервалу [0.46; 0.48) суживает его до интервала [0.47, 0.474). Продолжая в том же духе, имеем: Таблица 10.2
-
В начале
[ 0.0;1.0 )
После просмотра:
"п"
[ 0.3;0.5 )
"я"
[ 0.46; 0.48 )
"т"
[ 0.47; 0.474 )
"ь"
[ 0.4728; 0.4732 )
"!"
[ 0.47316; 0.4732 )
Предположим, что все, что декодировщик знает о тексте, это конечный интервал [0.47316; 0.4732 ). Он сразу же понимает, что первый закодированный символ есть "п", т.к. итоговый интервал целиком лежит в интервале, выделенном моделью этому символу согласно табл. 1. Повторим действия кодировщика: сначала [0.0; 1.0), после просмотра "п" [0.3; 0.5), далее ясно, что второй символ – это "я", поскольку он приведет к интервалу [0.46; 0.48 ), который полностью вмещает итоговый интервал [0.47316; 0.4732 ); продолжая работать таким же образом, декодировщик извлечет весь текст.
Декодировщику нет необходимости знать значения обеих границ итогового интервала, полученного от кодировщика. Даже единственного значения, лежащего внутри него, например 0.47319, уже достаточно. Однако, чтобы завершить процесс, декодировщику нужно вовремя распознать конец текста. Кроме того, одно и то же число 0.0 можно представить и как "о", и как "оо", "ооо" и т.д. Для устранения неясности мы должны обозначить завершение каждого текста специальным символом END, известным и кодировщику, и декодировщику. Для алфавита из табл. 1 для этой цели, и только для нее, будет использоваться символ "!". Когда декодировщик встречает этот символ, он прекращает свой процесс.
Для фиксированной модели, задаваемой моделью табл. 1, энтропия 5-символьного текста "пять!" будет:
— log 0.2 — log 0.1 — log 0.2 — log 0.1 — log 0.1 = — log 0.00004 ~ 4.39794.
(Здесь применяем логарифм по основанию 10, т.к. вышерассмотренное кодирование выполнялось для десятичных чисел). Это объясняет, почему требуется 5 десятичных цифр для кодирования этого текста. По сути, ширина итогового интервала есть 0.4732 – 0.47316 = 0.00004, а энтропия – отрицательный десятичный логарифм этого числа. Конечно, обычно мы работаем с двоичной арифметикой, передаем двоичные числа и измеряем энтропию в битах.
Пяти десятичных цифр кажется слишком много для кодирования текста из 4-х букв! Однако, ясно, что разные модели дают разную энтропию. Лучшая модель, построенная на анализе отдельных символов текста "пять!", есть следующее множество частот символов: "п"(0.2), "я"(0.2), "т"(0.2), "ь"(0.2), "!"(0.2) . Она дает энтропию, равную 4 в десятичной системе счисления, т.е. кодирует исходный текст числом из 4-х цифр. Однако, более сложные модели дают в общем случае гораздо лучший результат.