- •ПРЕДИСЛОВИЕ
- •Глава 1. ИНФОРМАЦИОННАЯ ЭНТРОПИЯ
- •§ 1.3. Модели источников дискретных сообщений
- •§ 1.5. Равномерное кодирование
- •Глава 2. МЕТОДЫ КОДИРОВАНИЯ
- •§ 2.1. Неравномерное кодирование: постановка задачи
- •§ 2.3. Кодирование Хаффмана
- •§ 2.5. Арифметическое кодирование
- •СПИСОК ЛИТЕРАТУРЫ
- •ОТВЕТЫ К ЗАДАЧАМ ДЛЯ САМОСТОЯТЕЛЬНОГО РЕШЕНИЯ
- •ЗАКЛЮЧЕНИЕ
Глава 2. МЕТОДЫ КОДИРОВАНИЯ
§ 2.1. НЕРАВНОМЕРНОЕ КОДИРОВАНИЕ: ПОСТАНОВКА ЗАДАЧИ
Равномерное кодирование – не самый эффективный способ представления информации с точки зрения экономии таких вычислительных ресурсов, как объем памяти или пропускная способность канала связи. В особенности, если источник порождает сообщения с различными вероятностями. Действительно, не нужно много лет изучать теорию информации, чтобы догадаться, что сообщения, появляющиеся на выходе источника чаще остальных, предпочтительно кодировать более короткими кодовыми словами, нежели сообщения, появляющиеся весьма редко. Строгая реализация этой идеи находит свое воплощение в так называемых неравномерных кодах, то есть кодах, в которых кодовые слова могут иметь разную длину для различных сообщений.
Начнем с обсуждения задачи неравномерного посимвольного кодирования. Рассмотрим источник дискретных сообщений, порождающий символы из некоторого алфавита X с известным распределением вероятностей p(x). Как и ранее, в качестве кодового алфавита будем использовать двоичный алфавит A ={0,1}.
ОПРЕДЕЛЕНИЕ 2.1.1. Неравномерным посимвольным кодом C ={c}
объема M = C над алфавитом A называется произвольное множество последовательностей различной длины из символов алфавита A.
ОПРЕДЕЛЕНИЕ 2.1.2. Неравномерный посимвольный код называется однозначно декодируемым, если любая последовательность символов из алфавита A единственным образом разбивается на отдельные кодовые слова.
Пример 2.1.1. Для источника X ={a,b,c,d} рассмотрим четыре способа кодирования:
1)С1 ={00,01,10,11};
2)С2 ={0,10,110,111};
47
3)С3 ={0,01,011,111};
4)С4 ={0,1,00,01}.
Первые три являются однозначно декодируемыми, а четвертый – нет. Попробуем понять почему.
Код С1 является равномерным, а следовательно, однозначно декодируемым, так как равенство длин всех кодовых слов позволяет однозначно разбивать любую последовательность из нулей и единиц на кодовые слова. Например, кодовая последовательность c = 011000101110 однозначно восстанавливается до последовательности x = bcacdc :
c = 011000101110 → c = 01|10 | 00 |
|10 |11|10 → x = bcacdc . |
|
|
|
|
b c a |
c |
d c |
Код C2 также однозначно декодируем, хотя и не является равномерным. Чтобы увидеть это, давайте поставим себя на место декодера и представим, как он мог бы декодировать поступающую на его вход двоичную последовательность. Например, им может быть использована следующая стратегия: последовательно считывать каждый двоичный символ, каждый раз проверяя, не совпадает ли полученная последовательность с какимнибудь кодовым словом из множества C2. Замечая, что ни одно кодовое слово не является продолжением другого, мы делаем вывод, что подобное разбиение двоичных последовательностей на отдельные кодовые слова будет однозначным.
В качестве примера закодируем с помощью кода C2 словоx = bcaa и отправим его на вход декодера:
x =bcaa → с(x) =1011000.
Декодер считывает символ 1 и сразу «делает вывод», что перед ним начало кода символов b, c или d. Далее он считывает второй символ 0 и однозначно определяет, что перед ним код символа b, так как никакой
48
другой код не начинается комбинацией 10. После этого он начинает идентификацию следующего символа и т. д. В результате наш декодер однозначно восстановит всю закодированную последовательность:
c =1011000 → c =10 |
|110 | 0 |
| 0 |
→ x = bcaa . |
▲ |
|
|
|
|
|
b |
c a |
a |
|
|
ОПРЕДЕЛЕНИЕ 2.1.3. Неравномерный код называется префиксным, если ни одно его кодовое слово не является началом (префиксом) другого кодового слова.
Код C2 из примера 2.1.1 является префиксным. Ясно, что всякий префиксный код является однозначно декодируемым. Однако обратное утверждение неверно, то есть не всякий однозначно декодируемый неравномерный код является префиксным.
Пример 2.1.1 (продолжение). Примером однозначно декодируемого, но не префиксного кода, является код С3. То, что это код не префиксный, легко установить, например, из того факта, что код 10 (код символа b) является началом (префиксом) кода 100 (кода символа c). Однако мы замечаем, что каждое кодовое слово кода C3 получается из соответствующего кодового слова кода C2 инверсией, то есть переписыванием его в обратном порядке. В этом случае для декодирования можно предложить следующую стратегию: переписать принимаемую двоичную последовательность в обратном порядке и применить к ней алгоритм декодирования для кодаC2. В качестве примера закодируем слово x = bcaa :
x =bcaa → c(x) =0101100.
Тогда алгоритм декодирования будет выглядеть так:
с(x) =0101100 |
→ |
0011010 |
→ |
aacb |
→ |
x =bcaa . |
|
инверсия |
|
декодированиеC2 |
|
инверсия |
|
49
Наконец, код C4 не является однозначно декодируемым и его нельзя использовать при кодировании сообщений, если только не ввести дополнительный символ, который будет играть роль разделителя. Подобное решение, однако, приведет к неоправданному увеличению объема кодовых сообщений, в особенности, с ростом их длины. ▲
На практике удобным способом представления префиксных кодов являются бинарные деревья. В качестве иллюстрации на рис. 2.1.1 приведен вид подобного дерева для кода C2 из примера 2.1.1.
Рис. 2.1.1. Бинарное дерево, соответствующее префиксному коду C2
Поясним принцип построения этого дерева. Самый крайний левый узел дерева является корневым. Из каждого узла выходят не более двух ребер, причем «нижние» ребра символизируют нули, а «верхние» – единицы. Всем узлам дерева, кроме корневого, приписаны двоичные коды, которые представляют собой последовательности нулей и единиц, считываемые по пути следования от корня к данному узлу. При этом концевым вершинам соответствуют кодовые слова префиксного кода C2.
Важно отметить, что каждый префиксный код может быть представлен в виде бинарного дерева и, наоборот, всякое бинарное дерево определяет некий префиксный код.
Обсудим теперь, какие префиксные коды следует считать хорошими. Для этого необходимо ввести понятиесредней длины неравномерного кода.
50
Рассмотрим источник информации с алфавитом X и распределением вероятностей символов p(x), где x X . Допустим, что для данного источника построен неравномерный код C, присваивающий каждому символу источника x некий бинарный код c(x). Обозначим через l(x) = c(x) длину кода c(x). Так как появление символа на выходе источника мы рассматриваем как случайное событие, длина l(x) представляет собой дискретную случайную величину с вероятностным распределением p(x).
ОПРЕДЕЛЕНИЕ 2.1.4. Математическое ожидание случайной величины l(x) называется средней длиной кода C:
|
= ∑ l(x) p(x) . |
(2.1.1) |
l |
||
|
x X |
|
Поскольку основная цель неравномерного кодирования – снижение затрат на передачу и хранение сообщений источника, разумно использовать в качестве критерия эффективности кода среднюю длину кодовых слов, которая, в свою очередь, является пропорциональной средней длине кода l . Таким образом, чем меньше средняя длина кода, тем более эффективным считается код.
На практике, помимо оценки удельных затрат на хранение/передачу кодовых слов, часто также учитывают и другие аспекты способов неравномерного кодирования. Одним из таких аспектов, например, является сложность реализации алгоритмов кодирования и декодирования. В данном учебном пособии мы, однако, не будем принимать во внимание эти тонкости реализации и будем оценивать эффективность кодов только
сточки зрения их средней длины.
Взаключение параграфа сформулируем основную задачу, которую будем решать далее: для данного источника информации с алфавитом X и распределением вероятностей символов p(x) необходимо построить неравномерный префиксный код C с минимальной средней длиной кода. Иногда, однако, мы будем рассматривать префиксные коды, не являю-
51
щиеся оптимальными с точки зрения средней длины, например, код Шеннона или код Гильберта – Мура. Эти коды также будут представлять для нас интерес в силу своих свойств, полезных при решении определённого класса задач.
|
Пример решения задачи |
|
|
||||
Задача. Источник с алфавитом |
X ={a,b,c,d,e} имеет |
следующее |
|||||
распределение |
вероятностей символов: |
p(a) =0.22, |
p(b) =0.24, |
||||
p(c) =0.26, p(d ) =0.016, |
p(e) =0.24 |
и |
p( f ) =0.021. |
Найти среднюю |
|||
длину неравномерного кода: a = 00, |
b =110 , |
c =1110 , |
d =1, |
e =11110 , |
|||
f =111110 . |
|
|
|
|
|
|
|
Решение. В данном случае кодовые слова имеют следующие длины: |
|||||||
l(a) = 2, l(b) =3, |
l(c) = 4 , |
l(d ) =1, l(e) =5 |
и l( f ) =6. Отсюда, в соответ- |
||||
ствии с формулой (2.1.1), получаем |
|
|
|
|
|
||
l = 2 0.22 +3 0.24 +4 0.26 +1 0.016 +5 0.24 +6 0.021 ≈3.54 бит.
Ответ. Средняя длина кода равна l ≈3.54 бит.
Задачи для самостоятельного решения
1. Указать, какой из приведенных неравномерных кодов не является однозначно декодируемым:
С1 ={0,1,11,01,10,111}; С2 ={0,10,110,1110,11110,11111};
С3 ={0,01,011,0111,01111,11111}.
2. Построить бинарное дерево, соответствующее неравномерному префиксному коду C ={0,10,110,11100,111110,1111110}. Проанализиро-
вав построенное дерево, подумать, как можно улучшить полученный код так, чтобы он оставался префиксным, но его средняя длина уменьшилась.
52
3. Источник с алфавитом X ={a,b,c,d,e, f , g} имеет следующее распределение вероятностей символов: p(a) =0.34, p(b) =0.17, p(c) =0.08,
p(d ) =0.04, p(e) = 0.09, |
p( f ) = 0.07 и p(g) =0.21. Найти среднюю длину |
неравномерного кода |
a = 0 , b =110 , c =11110, d =111111, e =1110 , |
f=111110 , g =10.
4.Построить префиксные коды, соответствующие бинарным деревьям, указанным на следующих рисунках:
Контрольные вопросы
1.Какие коды называются неравномерными?
2.Дайте определение префиксного неравномерного кода. Приведите примеры.
3.Поясните, каким образом префиксные неравномерные коды могут изображаться бинарными деревьями. Взаимообратное ли это соответствие?
4.Сформулируйте определение средней длины кода.
5.Какова основная задача неравномерного кодирования?
53
§ 2.2. ОСНОВНЫЕ ТЕОРЕМЫО НЕРАВНОМЕРНОМ КОДИРОВАНИИ
Еще раз рассмотрим пример 2.1.1 из предыдущего параграфа. Код С1 является равномерным, так как все кодовые слова в нем имеют одинаковую длину 2. Можно ли выбрать кодовые слова короче? Префиксный код С2 имеет одно кодовое слово длины 1, но чтобы обеспечить свойство префиксности, необходимо на единицу увеличить длины третьего и четвертого кодовых слов. То есть свойство префиксности накладывает довольно жесткие ограничения на длины кодов, не позволяя им быть слишком коро т- кими.
Теперь рассмотрим следующую задачу. Допустим, мы хотим построить префиксный код с заранее выбранными длинами кодовых слов l1,l2 , ,ln . Предварительно мы хотим выяснить, существует ли префиксный код с такими длинами кодов? Оказывается, что ответ на этот вопрос можно дать без явного построения самого кода. Соответствующий резуль-
тат носит название неравенства Крафта.
ТЕОРЕМА 2.2.1 (неравенство Крафта). Префиксный код с длинами кодовых слов l1,l2 , ,ln существует тогда и только тогда, когда выполняется следующее неравенство:
k∑n=12−lk = 21l1 + 21l2 + + 21ln ≤1.
Применим неравенство Крафта к кодам С2 и С4 из примера 2.1.1 § 2.1. Для кода С2 (который, как мы знаем, префиксный) это неравенство выполняется
211 + 212 + 213 + 213 =1 ≤1.
54
Для кода С4 это неравенство, напротив, не имеет места, так как
211 + 211 + 212 + 212 = 23 >1.
Другими словами, неравенство указывает на то, что неравномерный код с длинами кодовых слов 1 , 1, 2 и 2 ни при каких условиях не будет префиксным.
Таким образом, неравенство Крафта ограничивает снизу длину кодовых слов всякого префиксного кода, состоящего из n кодов. На самом деле, это неравенство имеет место не только для префиксных кодов, но и для любых однозначно декодируемых кодов.
Перейдем теперь к обсуждению так называемых прямой и обратной теорем кодирования. Начнем с прямой теоремы.
ТЕОРЕМА 2.2.2 (прямая теорема кодирования). Для дискретного источника с энтропией H существует посимвольный неравномерный код со средней длиной кодовых слов
|
< H +1. |
(2.2.1) |
l |
Обсудим оценку (2.2.1). Прямая теорема кодирования фактически утверждает, что всегда может быть построен неравномерный код со средней длиной меньшей, чем величина H +1. Это значит, что если для некоторого источника с энтропией H был сконструирован неравномерный префиксный код со средней длиной l большей H +1, этот код заведомо неэффективен, то есть имеется принципиальная возможность уменьшить его среднюю длину. Как это сделать – это уже другой вопрос, но такая возможность есть. В этом смысле оценка (2.2.1) является верхней границей для средней длины эффективного префиксного кода.
Наоборот, обратная теорема неравномерного кодирования дает нижнюю границу для средней длины всякого префиксного кода.
55
ТЕОРЕМА 2.2.3 (обратная теорема кодирования). Для любого неравно-
мерного префиксного кода дискретного источника с энтропией H средняя длина кодовых слов удовлетворяет неравенству
|
≥ H . |
(2.2.2) |
l |
Иными словами, нельзя построить неравномерный префиксный код, средняя длина которого была бы меньше энтропии источника. То есть энтропия H выступает как бы ограничителем, не позволяя сделать среднюю длину меньше определенного предела. Это не означает, что неравномерного кода со средней длиной меньшей H нельзя построить; это означает, что любой такой код не будет префиксным и не годится для использования в задачах кодирования сообщений.
В каких случаях средняя длина неравномерного префиксного кода в точности равна энтропии источника, то есть неравенство(2.2.2) превращается в равенство? Оказывается, что это возможно, если только для всякого
символа источника x X выполняется соотношение p(x) = 2−k , где k – целое положительное число. В силу неравенства Крафтадля такого источника
существует неравномерный |
префиксный код с длинами кодовых слов |
||
l(x) = −log2 p(x) = k. Ясно, что средняя длина такого кода будет равна |
|||
|
|
= ∑ p(x)l(x) = − ∑ p(x) log2 p(x) = H . |
|
l |
|||
|
|
x X |
x X |
В заключение параграфа дадим определение одной характеристики кода, полезной для оценивания его «несовершенства».
ОПРЕДЕЛЕНИЕ 2.2.1. Избыточностью r неравномерного кода называется разность между его средней длиной и энтропией источника:
r = |
|
− H . |
(2.2.3) |
l |
56
