Особые замечания о кодировании и представлении чисел

Двоичное представление чисел: каждое появление цифры 9 надо заменить цифрой 1 (наибольшей двоичной цифрой). Может показаться, что приведенные выше примеры не производят никакого сжатия, и во всех трех рассмотренных примерах строки «SWISS-MISS», кодируются слишком длинными последовательностями. Похоже, что длина окончательного кода сжатия зависит от вероятностей символов. Длинные числа вероятностей породят длинные цифры при кодировании, а короткие цифры породят более разумные значения переменных Low и High. Это поведение требует дополнительных разъяснений.

Для того, чтобы выяснить степень компрессии, достигаемую с помощью арифметического сжатия, необходимо рассмотреть два факта: (1) на практике все операции совершаются над двоичными числами, поэтому следует переводить все результаты в двоичную форму перед тем, как оценивать эффективность компрессии; (2) поскольку последним кодируемым символом является eof, окончательный код может быть любым числом между Low и High. Это позволяет выбрать более короткое число для окончательного сжатого кода.

Кодируем строку «SWISS_MISS» некоторым числом в интервале от Low=0.71753375 до High=0.717535, чьи двоичные значения будут приблизительно равны 0.10110111101100000100101010111 и 0.1011011110110000010111111011. Тогда декодер может выбрать строку «10110111101100000100» в качестве окончательного сжатого кода. Строка из 10 символов сжата в строку из 20 битов. Хорошее ли это сжатие?

В двоичном представлении значения переменных Low и High равны 0.111111101001111110010111111001 и 0.1111111010011111100111101. Можно выбрать любое число из этого промежутка, и мы выбираем «1111111010011111100». Этот код имеет длину 19 (он и теоретически должен быть 21-битным, но числа имеют ограниченную точность).
Пример: Даны три символа oi , а2 и eof с вероятностями Pi = 0.4, Р2 = 0.5 и Peof = 0.1. Кодируем строку «a2a2a2eof». Размер конечного кода будет равен теоретическому минимуму. Шаги кодирования просты.

Начинаем с интервала [0,1). Первый символ сокращает интервал до [0.4,0.9), второй - до [0.6,0.85), третий - до [0.7,0.825), а четвертый eof - до [0.8125,0.8250). Приблизительные двоичные значения концов равны 0.1101000000 и 0.1101001100, поэтому в качестве кода выбирается 7-битовое число «1101000».

Следующее рассуждение показывает, почему арифметическое кодирование может быть весьма эффективным методом сжатия. Обозначим через S последовательность кодируемых символов, а через Ь - число бит, требуемых для кодирования s. Если длина s растет, то ее вероятность P(s) уменьшается, а число Ь растет. Вот почему арифметическое кодирование может, в принципе, сжимать строку до ее теоретического предела.

-----------------------------