
Технологии программирования
Алгоритмы сжатия информации
Д. Мастрюков
Часть 2.
Арифметическое кодирование
Введение
Кодирование Хаффмена, рассмотренное в предыдущей статье, при сжатии информации кодирует каждый символ сжимаемого сообщения целым количеством битов. Если частота встречаемости некоторого символа в сообщении очень велика, например 90 из 100, то было бы в принципе возможно поставить в соответствие этому символу код длиной 0,15 бита. Однако схема кодирования Хаффмена может в лучшем случае закодировать такой символ в 1 бит, что в 6 раз менее эффективно.
Альтернатива кодированию ________Хаффмена________
Таблица
1
Вероятности
появления символов в сообщении
Символ
|
Вероятность
|
Пробел
|
1/10
|
А
|
1/10
|
В
|
1/10
|
Е
|
1/10
|
G
|
1/10
|
I
|
1/10
|
L
|
2/10
|
S
|
1/10
|
Т
|
1/10
|
Рассмотрим работу арифметического компрессора на примере сообщения “BILL GATES”.
Поставим в соответствие каждому символу сообщения вероятность его появления в сообщении (табл. 1).
Затем присвоим каждому символу интервал вероятности в
промежутке от 0 до 1. Длина интервала для символа равна вероятности его появления в сообщении. Положение интервала вероятности каждого символа не имеет значения. Важно только то, чтобы и кодер, и декодер располагали символы по одинаковым правилам. Интервалы вероятности для символов нашего сообщения приведены в табл. 2.
Таблица 2 Интервалы вероятностей для символов сообщения
Символ
|
Вероятность
|
Интервал
|
Пробел
|
1/10
|
[0.00, 0.10[ |
А
|
1/10
|
[0.10, 0.20[ |
В
|
1/10
|
[0.20, 0.30[ |
Е
|
1/10
|
[0.30, 0.40[ |
G
|
1/10
|
[0.40, 0.50[ |
I
|
1/10
|
[0.50, 0.60[ |
L
|
2/10
|
[0.60, 0.80[ |
S
|
1/10
|
[0.80, 0.90[ |
T
|
1/10
|
[0.90, 1.00[ |
В общем виде алгоритм арифметического кодирования может быть описан следующим образом:
НижняяГраница = 0.0; ВерхняяГраница= 1.0;
Пока ((ОчереднойСимвол =
ДайОчереднойСимвол()) != КОНЕЦ)
Интервал = ВерхняяГраница - НижняяГраница;
ВерхняяГраница = НижняяГраница + Интервал * ВерхняяГраницаИнтервалаДля
(ОчереднойСимвол);
НижняяГраница = НижняяГраница + Интервал * НижняяГраницаИнтервалаДля
(ОчереднойСимвол); Конец Пока
Выдать (НижняяГраница)
Для нашего примера этот алгоритм будет работать следующим образом (табл. 3).