Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информационная энтропия и неравномерное кодирование. Учебное пособие.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
872 Кб
Скачать

§ 2.5. АРИФМЕТИЧЕСКОЕ КОДИРОВАНИЕ

Авторами алгоритма арифметического кодирования, пожалуй, следует считать Уиттена, Нила и Клири, так как именно с момента появления их статьи [6] возникло понимание важной роли этого алгоритма решения для задачи практического сжатия данных. Отметим, что арифметическое кодирование фактически является почти тривиальным обобщением кода Шеннона на случай кодирования последовательностей символов.

Рассмотрим источник символов с алфавитом X ={1,2, , N} и вероятностями символов p1, p2 , , pN . Пусть q1,q2 , ,qN – соответствующие кумулятивные вероятности символов источника. Нашей целью является кодирование последовательностей символов длины n:

x =(x1, x2 , , xn ) X n .

Далее для упрощения записей обозначим xij , через означающее подпоследовательность в x, начинающуюся с i-го символа и заканчивающуюся j-ым символом:

x j =(x , x

, , x

j

), i

j .

(2.5.1)

i

i i+1

 

 

 

 

Решение нашей задачи кодирования состоит в нахождении соответ-

ствия между последовательностями из X n и кодовыми словами различной длины: x c(x). При больших n, однако, мощность алфавита может быть очень большой, поэтому нецелесообразно «хранить» всю кодовую таблицу для кодера или декодера, так как поиск соответствующего кодового слова в ней будет осуществляться достаточно медленно. Вместо этого хотелось бы разработать такой код, который вычисляется «на лету». Дру-

гими словами, при появлении конкретной последовательности x X n кодер должен вычислять ее код c(x), после чего данный код передается декодеру, который, в свою очередь, осуществляет обратное преобразование (декодирование). Таким образом, кодеру и декодеру известны только правила кодирования, а не сами кодовые слова.

75

На первый взгляд задача не выглядит сложной. Например, мы можем применить к символам расширенного алфавита X n любой известный нам посимвольный алгоритм кодирования, скажем, алгоритм Хаффмана. Последний, однако, предполагает построение всего кода, так как соответствующее дерево Хаффмана должно быть сконструировано сразу целиком. С другой стороны, код Шеннона требует исходную упорядоченность символов алфавита по убыванию их вероятностей. На практике это предполагает применение процедуры сортировки на множестве, состоящем из

N n объектов. Ясно, что при больших n это приведет к недопустимо большим затратам вычислительных ресурсов. Например, для N = 32 (алфавит

русского языка) и n =10 (слова длины 10) придется

отсортировать

N n =3210 =1125899906842624 объектов! Таким образом,

единственным

возможным претендентом остается код Гильберта – Мура.

 

Напомним, что согласно алгоритму Гильберта – Мура кодовое слово c(x) для последовательности x =(x1, x2 , , xn ) представляет собой двоичное слово, содержащее первые l(x) разрядов после запятой в двоичной записи числа σ(x) = q(x) + p(x) / 2. Здесь p(x) – вероятность появления последовательности x на выходе источника, q(x) – соответствующая кумулятивная вероятность, а целое положительное число l(x) определяется согласно формуле

l(x) =

log

2

p(x) +1.

(2.5.2)

 

 

 

 

Для простоты рассмотрим постоянный источник (см. § 1.3). Тогда вычисление вероятности p(x) не представляет никакого труда: она просто равна произведению вероятностей всех символов, входящих в последовательность x :

n

p(x) = ∏ p(xi ) = p(x1) p(x2 ) p(xn ).

i=1

76

Но как нам вычислять кумулятивную вероятность q(x)? В случае n =1 эта величина равняется сумме вероятностей всех символов алфавита, имеющих меньшие номера, чем данный символ, для которого мы вычисляем кумулятивную вероятность. В общем же случае «символами» являются последовательности вида x =(x1, x2 , , xn ) X n , но на множестве X n априори не задано никакое упорядочивание. С другой стороны, ничто нам не мешает это упорядочивание задать. Наиболее традиционный способ сделать это – использовать так называемое лексикографическое упорядочивание. Напомним, как оно вводится.

Пусть имеется

две последовательности из X n :

x =(x , x , , x

n

)

 

 

1

2

 

и y =( y1, y2 , , yn ).

Обозначим через k наименьший индекс,

такой что

xk yk . Тогда будем говорить, что последовательность х меньше, чем последовательность y (пишем x y ), если xk < yk .

Пример 2.5.1. Пусть X ={a,b,c,d}. Очевидно, что имеют место следующие отношения:

ba b ca , aabc b aacc , abcd b abdc .

После того как мы зафиксировали упорядочивание на множестве X n , можно ввести понятие кумулятивной вероятности для произвольной последовательности x =(x1, x2 , , xn ) с помощью формулы

q(x) = ∑ p(y).

(2.5.3)

y x

 

В этой формуле суммирование осуществляется по всем последовательностям y , которые меньше последовательности х. На практике, однако, вычисление кумулятивных вероятностей в соответствии с правилом (2.5.3) не очень удобно, так как придется в среднем суммировать 2n1 слагаемых.

77

Выведем рекуррентную формулу для q(x), более удобную в практических вычислениях. Используя введенную выше нотацию (2.5.1), для кумулятивной вероятности q(x) получаем выражение

q(x1n ) = ∑ p(x1n ).

yn xn

1

1

Так как p(y1n ) = p(y1n1) p( yn ), отсюда получаем

q(x1n ) =

∑ ∑ p(y1n1)p( yn ) + ∑ ∑ p(y1n1)p( yn )

 

yn1 xn1

yn

 

 

 

yn1

=xn1 yn <xn

 

1

1

 

 

 

 

 

 

1

1

 

или

 

 

 

 

 

 

 

 

 

 

q(x1n ) =

 

 

 

p(y1n1)p( yn ) + p(x1n1) p( yn ).

 

 

yn1 xn1

 

 

yn

yn <xn

 

 

1

 

 

1

 

 

 

 

 

 

Сумма вероятностей

p( yn )

по всем возможным символам yn

равна

единице: yn p( yn ) =1. Отсюда будем иметь:

 

q(x1n ) = ∑

p(y1n1) + p(x1n1) p( yn ).

 

 

 

yn1 xn1

 

yn <xn

 

 

 

 

1

 

1

 

 

 

 

В силу того, что y

 

<x

n

p( yn ) = q(xn ) – кумулятивная вероятность

 

 

n

 

 

 

 

 

 

символа xn , окончательно получаем

 

 

 

 

q(x1n ) = q(x1n1) + p(x1n1)q(xn ) .

(2.5.4)

Формула (2.5.4) позволяет вычислить кумулятивную вероятность последовательности x1n =(x1, , xn1, xn ) через известную кумулятивную вероятность последовательности x1n1 =(x1, , xn1) , полученной из x1n

78

отбрасыванием последнего символа. Дополняя (2.5.4) формулой для вычисления обычной вероятности последовательности x1n ,

p(x1n ) = p(x1n1) p(xn ),

(2.5.5)

мы получаем удобную рекуррентную процедуру вычисления вероятностей p(x) и q(x) для произвольной последовательности x X n .

Пример решения задачи

Задача. Для постоянного источника с алфавитом X ={a,b,c} построить арифметический код последовательности x = bcaa , если вероятности символов источника равны p(a) =0.1, p(b) =0.6 и p(c) = 0.3.

Решение. Для начала вычислим кумулятивные вероятности отдельных символов заданного источника:

q(a) = 0.0, q(b) =0.1, q(c) = 0.1+0.6 = 0.7.

Затем наша задача – вычислить вероятности q(bcaa) и p(bcaa) . Для их вычисления применяем формулы (2.5.4) и (2.5.5):

q(bcaa) = q(bca) + p(bca) q(a) = q(bca) + p(bca) 0 = q(bca) , p(bcaa) = p(bca) p(a) =0.1p(bca).

Таким образом, вероятности q(bcaa) и p(bcaa) могут быть вычислены, если нам будут известны вероятности q(bca) и p(bca) для слова bca, полученного из исходного отбрасыванием последнего символа a. Для вычисления последних снова используем формулы (2.5.4) и (2.5.5):

q(bca) = q(bc) + p(bc) q(a) = q(bc) + p(bc) 0 = q(bc) , p(bca) = p(bc) p(a) =0.1p(bc).

79

Отсюда видно, что q(bca) и p(bca) могут быть вычислены, если будут найдены вероятности q(bc) и p(bc) . Для их нахождения третий раз применим формулы (2.5.4) и (2.5.5):

q(bc) = q(b) + p(b) q(с) =0.1+0.6 0.7 =0.52, p(bc) = p(b) p(c) =0.6 0.3 =0.18.

Как видно, для вероятностей q(bc) и p(bc) мы уже получаем численные значения (то есть достигнута максимальная «глубина» рекурсии). Далее подставляем найденные числовые значения в формулы для q(bca) и p(bca):

q(bca) = q(bc) =0.52,

p(bca) =0.1p(bc) =0.1 0.18 =0.018 .

Наконец, находим искомые исходные вероятности:

q(bcaa) = q(bca) =0.52,

p(bcaa) =0.1p(bca) =0.1 0.018 =0.0018.

Мы нашли кумулятивную и обычную вероятности последовательно-

сти x = bcaa .

Чтобы завершить решение задачи, построим арифметической код рассматриваемого слова в соответствии с алгоритмом Гильберта – Мура. Для этого сначала необходимо оценить длину арифметического кода по фор-

муле (2.5.2):

l(bcaa) = −log2 p(bcaa) +1 = 9.11779 +1 =11.

Далее вычисляем вспомогательную величину σ(bcaa):

σ(bcaa) = q(bcaa) + 12 p(bcaa) = 0.52 +0.0009 = 0.5209 .

80

Переводя полученное действительное число в двоичную форму (прил. Б) и оставляя после запятой 11 разрядов, находим арифметический код слова bcaa:

c(bcaa) =10000101010 .

Ответ. Арифметический код слова x = bcaa имеет вид 10000101010 .

Задачи для самостоятельного решения

1. Для постоянного источника с алфавитом X ={a,b,c,d,e, f } построить арифметический код слова x =bfcea , если вероятности символов ис-

точника равны p(a) = p(c) = p(e) =0.1, p(b) = 0.3, p(d ) = p( f ) =0.2.

2. Для последовательности x = 01001 на выходе двоичного постоянного источника построить арифметический код, если вероятность единицы равна 0.4. Сравнить длину этого кода с собственной информацией последовательности x . Закодировать последовательность x с помощью посимвольного кодирования по алгоритму Шеннона и сравнить длину построенного кода с длиной арифметического кода.

Контрольные вопросы

1.Поясните, почему в основе арифметического кодирования лежит кодирование Гильберта– Мура, а некодирование Хаффмана или Шеннона?

2.Выведите рекуррентные формулы для вычисления обычной и кумулятивной вероятностей последовательностей постоянного источника.

3.Какие изменения нужно внести в алгоритм арифметического кодирования, чтобы применить его к простому марковскому источнику?

81

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]