Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Арифмитическое кодирование.rtf
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
121.43 Кб
Скачать

Технологии программирования

Алгоритмы сжатия информации

Д. Мастрюков

Часть 2.

Арифметическое кодирование

Введение

Кодирование Хаффмена, рассмотренное в пре­дыдущей статье, при сжатии информации коди­рует каждый символ сжимаемого сообщения це­лым количеством битов. Если частота встречае­мости некоторого символа в сообщении очень ве­лика, например 90 из 100, то было бы в принципе возможно поставить в соответствие этому симво­лу код длиной 0,15 бита. Однако схема кодирова­ния Хаффмена может в лучшем случае закоди­ровать такой символ в 1 бит, что в 6 раз менее эффективно.

Альтернатива кодированию ________Хаффмена________

Таблица 1

Вероятности появления символов в сообщении

В 70-е годы у алгоритма Хаффмена появился достойный конкурент — арифметическое кодиро­вание. Этот метод основан на идее преобразования входного потока в одно число с плавающей запя­той. Естественно, что чем длиннее сообщение, тем длиннее получающееся в результате кодирования число. Итак, на выходе арифметического компрес­сора получается число, меньшее 1 и большее либо равное 0. Из этого числа можно однозначно восста­новить последовательность символов, из которых оно было построено.

Символ

Вероятность

Пробел

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).