
- •Глава 3. Кодирование символьной информации
- •3.1. Постановка задачи кодирования. Первая теорема Шеннона
- •3.2. Способы построения двоичных кодов 3.2.1. Алфавитное неравномерное двоичное кодирование сигналами равной длительности. Префиксные коды
- •3.2.2. Равномерное алфавитное двоичное кодирование. Байтовый код
- •3.2.3. Алфавитное кодирование с неравной длительностью элементарных сигналов. Код Морзе
- •3.2.4. Блочное двоичное кодирование
- •Глава 6. Кодирование
- •6.1 Алфавитное кодирование
- •6.1.1. Префикс и постфикс слова
- •6.1.2. Таблица кодов
- •6.1.3. Разделимые схемы
- •6.1.4. Префиксные схемы
- •6.1.5. Неравенства Макмиллана
- •6.2. Кодирование с минимальной избыточностью
- •6.2.1. Минимизация длины кода сообщения
- •6.2.2. Цена кодирвания
- •6.2.3. Алгоритм Фано
- •6.2.4. Оптимальное кодирование
- •6.2.5. Алгоритм Хаффмана
- •6.3. Помехоустойчивое кодирование
- •6.3.1. Кодирование с исправлением ошибок
- •6.3.2. Классификация ошибок
- •6.3.3. Возможность исправления всех ошибок
- •6.3.4. Кодовое расстояние
6.2. Кодирование с минимальной избыточностью
Для практики важно, чтобы коды сообщений имели по возможности наименьшую длину. Алфавитное кодирование пригодно для любых сообщений, то есть S=A*. Если больше про множествоSничего не известно, то точно сформулировать задачу оптимизации затруднительно. Однако на практике часто доступна дополнительная информация. Например, для текстов на естественных языках известно распределение вероятности появления букв в сообщении. Использование такой информации позволяет строго поставить и решить задачу построения оптимального алфавитного кодирования.
6.2.1. Минимизация длины кода сообщения
Если задана разделимая схема алфавитного
кодирования
,
то любая схема
,
где
является перестановкой
,
также будет разделимой. Если длины
элементарных кодов равны, то перестановка
элементарных кодов в схеме не влияет
на длину кода сообщения. Но если длины
элементарных кодов различны то длина
кода сообщения зависит от состава букв
в сообщении и от того, какие элементарные
коды каким буквам назначены.
Если заданы конкретное сообщение и конкретная схема кодирования, то нетрудно подобрать такую перестановку элементарных кодов, при которой длина кода сообщения будет минимальна.
Пусть k1,…,kn– количества вхождений буквa1,...,anв сообщениеS,аl1,…,ln– длины элементарных кодов,
соответственно. Тогда, если
и
,
то
.
Действительно, пустьkj=k+a,ki=kиlj=l,li=l+b,
гдеa,b
0.
Тогда
Отсюда вытекает алгоритм назначения элементарных кодов, при котором длина кода конкретного сообщения Sбудет минимальна: нужно отсортировать буквы в порядке убывания количества вхождений, элементарные коды отсортировать в порядке возрастания длины и назначить коды буквам в этом порядке.
ЗАМЕЧАНИЕ
Этот простой метод решает задачу
минимизации длины кода только для
фиксированного сообщения Sи фиксированной схемы.
6.2.2. Цена кодирвания
Пусть заданы алфавит
и вероятности появления букв в сообщении
(pi–
вероятность появления буквыai).
Не ограничивая общности, можно считать,
чтоpi+…+pn=1
и
(то есть можно сразу исключить буквы,
которые не могут появиться в сообщении,
и упорядочить буквы по убыванию
вероятности их появления).
Для каждой (разделимой) схемы
алфавитного кодирования математическое
ожидание коэффициента увеличения длины
сообщения при кодировании (обозначается
)
определяется следующим образом:
,
где
и называется средней ценой (илидлиной) кодированияпри распределении вероятностейP.
Пример
Для разделимой схемы А={a,b},B={0,1},
при распределении вероятностей
цена кодирования составляет 0.5*1+0.5*2=1.5,
а при распределении вероятностей
она равна 0.9*1+0.1*2=1.1.
Обозначим
Очевидно, что всегда существует разделимая
схема
,
такая что
.
Такая схема называется схемойравномерного
кодироваия. Следовательно,
и достаточно учитывать только такие
схемы, для которых
,
гдеliцелое и
.
Таким образом, имеется лишь конечное
число схем
,
для которых
.
Следовательно, существует схема
,
на которой инфимум достигается:
Алфавитное (разделимое) кодирование
,
для которого
,
называется кодированием сминимальной
избыточностью, или оптимальным
кодированием, для распределения
вероятностейP.
6.2.3. Алгоритм Фано
Следующий рекурсивный алгоритм строит разделимую префиксную схему алфавитного кодирования, близкого к оптимальному.
Алгоритм 6.1. Построение кодирования, близкого к оптимальному
Вход:P:array[1..n]ofreal– массив вероятностей появления УКВ в
сообщении, упорядоченный по невозрастанию;.
Выход:C:array[1..n, 1..L]of0..1 – массив элементархых кодов.
Fano(1,n, 0) { вызов рекурсивной процедурыFano}
Основная работа по построению элементарных кодов выполняется следующей рекурсивной процедурой Fano.
Вход:b– индекс начала обрабатываемой части массиваP, е – индекс конца обрабатываемой части массиваP, к – длина уже построенных кодов в обрабатываемой части массива С.
Выход: заполненный массив С.
ife>bthen
k:=k+1 { место для очередного разряда в коде }
m:=Med(b,e) { деление массива на две части }
for I from b to e do
C[i,k] :=I>m{ в первой части добавляем 0, во второй - 1 }
endfor
Fano(b,m,k) { обработка первой части }
Fano(m+1,e,k) { обработка второй части }
end if
Функция Medнаходитмедиану
указанной части массиваP[b..e], то есть
определяет такой индексm(),
что сумма элементовP[b..m] наиболее
близка к сумме элементовP[m+1..e].
Вход: b– индекс начала обрабатываемой части массиваP,e– индекс концап обрабатываемой части массиваP.
Выход: m– индекс медианы,
то есть
Sb:= {сумма элементов первой части }
for i from b to e-1 do
Sb:=Sb+P[i] { вначале все, кроме последнего }
end for
Se:=P[e] { сумма элементво второй части }
M:=e{ начинаем искать медиану с конца }
repeat
d:=Sb-Se{ разность сумм первой и второй части }
m:=m-1 { сдвигаем границу медианы вниз }
Sb:=Sb-P[m];
Se:=Se+P[m]
until |Sb-Se|d
return m
Обоснование
При каждом удлинении кодов в одной части коды удлиняются нулями, а в другой – единицами. Таким образом, коды одной части не могут быть префиксами другой. Удлинение кода заканчивается тогда и только тогда, когда длина части равна 1, то есть остается единственный код. Таким образом, схема по построению префиксная, а потому разделимая.
Пример
Коды, построенные алгоритмом Фано для заданного распределения (n=7).
pi |
C[i] |
li |
0.20 |
00 |
2 |
0.20 |
010 |
3 |
0.19 |
011 |
3 |
0.12 |
100 |
3 |
0.11 |
101 |
3 |
0.09 |
110 |
3 |
0.09 |
111 |
3 |
|
|
2.80 |