- •Глава 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.4. Оптимальное кодирование
Оптимальное кодирование обладает определенными свойствами, которые можно использовать для его построения.
ЛЕММАПусть-схема оптимального кодирования для распределения вероятностей . Тогда еслиpi>pj, то .
Доказательство
От противного. Пусть i<j,pi>pjиli>lj. Тогда рассмотрим
Имеем:
что противоречит тому, что оптимально.
Таким образом, не ограничивая общности, можно считать, что .
ЛЕММА
Если -схема оптимального префиксного кодирования для распределения вероятностей , то среди элементарных кодов, имеющих максимальную длину, имеются два, которые различаются только во последнем разряде.
Доказательство
От противного
Пусть кодовое слово максимальной длины одно и имеет вид , гдеb=0Vb=1. Имеем:. Так как схема префиксная, то словане являются префиксами. С другой стороны,не является префиксом слов, иначе было бы, а значит,было бы префиксом. Тогда схематоже префиксная, причем, что противоречит оптимальности.
Пусть теперь два кодовых слова имаксимальной длины отличаются не в последнем разряде, то есть, причемне являются префиксами дляи наоборот. Тогда схематакже является префиксной, причем, что противоречит оптимальности.
ТЕОРЕМА Если - схема оптимального префиксного кодирования для распределения вероятностейи, причем
,
то кодирование со схемой
является оптимальным префиксным кодированием для распределения вероятностей Pn=p1,…,pj-1,pj+1,…,pn-1,q’,q’’.
Доказательство
Если было префиксным, тотоже будет префиксным по построению.
Пусть схема оптимальна дляPn. Тогда по предшествуюещй лемме. Положими рассмотрим схему, гдеj определено так, чтобы.
5. - префиксное, значит тоже префиксное.
6. - оптимально, значит,.
7. , но - оптимально, значит оптимально.
6.2.5. Алгоритм Хаффмана
Следующий рекурсивный алгоритм строит схему оптимального префиксного алфавитного кодирования для заданного распределения вероятностей появления букв.
Алгоритм 6.2. Построение оптимальной схемы – рекурсивная процедураHuffman
Вход: n– количество букв,P:array[1..n]ofreal– массив вероятностей букв, упорядоченный по убыванию.
Выход:C:array[1..n,1..L]of0..1 – массив элементарных кодов,l:array[1..n]of1..L– массив длин элементарных кодов схемы оптимального префиксного кодирования.
ifn=2then
C[1, 1] := 0;l[1] := 1; { первый элемент }
C [2, 1] := 1; l[2] := 1; { Второй элемент }
else
q:=P[n-1]+P[n] { сумма двух последних вероятностей }
j:=Up(n,q) { поиск места и вставка суммы }
Huffman(P,n-1) { рекурсивный вызов }
Down(n,j) { достраивание кодов }
Endif
Функция Upнаходит в массивеPместо, в котором должно находиться числоq(см. предыдущий алгоритм) и вставляет это число, сдвигая вниз остальные элементы.
Вход: n– длина обрабатываемой части массиваp,q– вставляемая сумма.
Выход: измененный массивP.
for I from n-1 downto 2 do
if P [i-1] <= q then
P[i] :=P[i-1] { сдвиг элемента массива }
else
j:=i-1 { определение места вставляемого элемента }
exitforI{ все сделано – цикл не нужно продолжать }
end if
end for
P[j] := q;
return j
Процедура Downстроит оптимальный код дляnбукв на основе построенного оптимального кода дляn-1 буквы. Для этого код буквы с номеромjвременно исключается из массиваCпутем сдвига вверх кодов букв с номерами, большимиj, а затем в конец обрабатываемой части массива С добавляется пара кодов, полученных из кода буквы с номеромjудлинением на 0 и 1, соответственно. ЗдесьC[I,*] означает вырезку из массива, то естьi-ю строку массива С.
Вход: n– длина обрабатываемой части массиваP,j– номер «разделяемой» буквы.
Выход: оптимальные коды в первыхnэлементах массивов С иl.
c:=C[j, *] { запоминание кода буквыj}
l:=l[j] { и длины этого кода }
for i from j to n-2 do
C[I,*]:=C[i+1,*] { сдвиг кода }
l[i] :=l[i+1] { и его длины }
endfor
C[n-1,*]:=c;C[n,*] :=c{ копирование кода буквыj}
C[n-1,l+1]:=0;C[n,l+1] := 1 { наращивание кодов }
L[n-1] :=l+1;l[n] :=l+1 { и увеличение длин }
Обоснование
Для пары букв при любом распределении вероятностей оптимальное кодирование очевидно: первой букве нужно назначить код 0, а второй – 1. Именно это и делается в первой части оператора ifосновной процедурыHuffman. Рекурсивная часть алгоритма в точности следует доказательству теоремы предыдущего подраздела. С помощью функцииUpв исходном упорядоченном массивеPотбрасываются две последние (наименьшие) вероятности, и их сумма вставляется в массивP, так чтобы массив (на единицу меньшей длины) остался упорядоченным. Заметим, что при этом место вставки сохраняется в локальной переменнойj. Так происходит до тех пор, пока не останется массив их двух элементов, для которого оптимальный код известен. После этого в обратном порядке строятся оптимальные коды для трех, четырех и т. д. элементов. Заметим, что при этом массив вероятностей Р уже не нужен – нужна только последовательность номеров кодов, которые должны быть изъяты из массива кодов и продублированы в конце с добавлением разряда. А эта последовательность храниться в экземплярах локальной переменнойj, соответствующих рекурсивным вызовам процедурыHuffman.