Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
351
Добавлен:
14.04.2015
Размер:
4.43 Mб
Скачать

8.3.2. Префиксные коды

Простейшими кодами, на основе которых может выполняться сжатие данных, являются коды без памяти. В коде без памяти каждый символ в кодируемом векторе данных заменяется кодовым словом из префиксного множества двоичных последовательностей или слов.

Префиксным множеством двоичных последовательностей S называется конечное множество двоичных последовательностей, таких, что ни одна последовательность в этом множестве не является префиксом, или началом, никакой другой последовательности в S.

К примеру, множество двоичных слов S1 = {00, 01, 100, 110, 1010, 1011 } является префиксным множеством двоичных последовательностей, поскольку, если проверить любую из возможных совместных комбинаций (wi wj) из S1, то видно, что wi никогда не явится префиксом (или началом) wj. С другой стороны, множество S2 = { 00, 001, 1110 } не является префиксным множеством двоичных последовательностей, так как последовательность 00 является префиксом (началом) другой последовательности из этого множества - 001.

Таким образом, если необходимо закодировать некоторый вектор данных X = ( x1, x2,… xn ) с алфавитом данных А размера N, то кодирование кодом без памяти осуществляется следующим образом:

- составляют полный список символов a1, a2, aj ... ,aN алфавита А, в котором aj - j-й по частоте появления в X символ, то есть первым в списке будет стоять наиболее часто встречающийся в алфавите символ, вторым – реже встречающийся и т.д.;

- каждому символу aj назначают кодовое слово wj из префиксного множества двоичных последовательностей S;

- выход кодера получают объединением в одну последовательность всех полученных двоичных слов.

Формирование префиксных множеств и работа с ними – это отдельная серьезная тема из теории множеств, выходящая за рамки нашего курса, но несколько необходимых замечаний все-таки придется сделать.

Если S ={w1, w2, ... , wN} - префиксное множество, то можно определить некоторый вектор , состоящий из чисел, являющихся длинами соответствующих префиксных последовательностей (mi - длина wi ).

Вектор , состоящий из неуменьшающихся положительных целых чисел, называется вектором Крафта. Для него выполняется неравенство

. (8.10)

Это неравенство называется неравенством Крафта. Для него справедливо следующее утверждение: если S - какое-либо префиксное множество, то v(S) - вектор Крафта.

Иными словами, длины двоичных последовательностей в префиксном множестве удовлетворяют неравенству Крафта.

Если неравенство (8.10) переходит в строгое равенство, то такой код называется компактным и обладает наименьшей среди кодов с данным алфавитом длиной, то есть является оптимальным.

Ниже приведены примеры простейших префиксных множеств и соответствующие им векторы Крафта:

S1 = {0, 10, 11} и v(S1) = ( 1, 2, 2 );

S2 = {0, 10, 110, 111} и v(S2) = ( 1, 2, 3, 3 );

S3 = {0, 10, 110, 1110, 1111} и v(S3) = ( 1, 2, 3, 4, 4 );

S4 = {0, 10, 1100, 1101, 1110, 1111} и v(S4) = ( 1, 2, 4, 4, 4, 4 );

S5 = {0, 10, 1100, 1101, 1110, 11110, 11111} и v(S5) = ( 1, 2, 4, 4, 4, 5, 5 );

S6 = {0, 10, 1100, 1101, 1110, 11110, 111110, 111111}

и v(S6) = (1,2,4,4,4,5,6,6).

Допустим мы хотим разработать код без памяти для сжатия вектора данных X = ( x1, x2,… xN ) с алфавитом А размером в N символов. Введем в рассмотрение так называемый вектор вероятностей , где- вероятность появленияi-го символа из А в X или вектор частот F = ( f1, f2, ... , fN ), где fi - количество появлений i-го символа из А в X. Закодируем X кодом без памяти.

Длина двоичной кодовой последовательности на выходе кодера составит

, (8.11)

а средняя длина двоичной кодовой последовательности на выходе кодера составит

. (8.12)

Лучшим кодом без памяти был бы код, для которого средняя длина - минимальна. Для разработки такого кода нам нужно найти вектор Крафта, для которого была бы минимальной.

Простой перебор возможных вариантов - вообще-то, не самый лучший способ найти такой вектор Крафта, особенно для большого .

Прямая теорема неравномерного кодирования

Теорема 8.1. Для ансамбля с энтропией существует побуквенный неравномерный префиксный код со средней длиной кодовых слов

. (8.13)

Обсудим полученную оценку длины кодовых слов. Мы знаем, что дости­жимая скорость кодирования примерно равна энтропии. Теорема гарантирует, что средняя длина слов хорошего кода отличается от энтропии не более чем на 1. Ес­ли энтропия велика, то проигрыш по сравнению с минимально достижимой ско­ростью можно считать небольшим. Но предположим, что . Теорема га­рантирует, что существует код со средней длиной кодовых слов не более 1,1 бита. Но нам хотелось бы затрачивать на передачу одного сообщение примерно в 10 раз меньше бит. Этот пример показывает, что либо теорема дает неточную оценку, либо побуквенное кодирование в этом случае не эффективно.

На этом же примере мы убедимся в том, что теорема достаточно точна и ее результат не может быть улучшен, если не использовать никакой дополнительной информации об источнике. Действительно, предположим, что дан двоичный ис­точник Х={0,1} с вероятностями букв . Минимально достижимая длина кодовых слов наилучшего кода, очевидно, равна 1. Теорема говорит, что средняя длина кодовых слов не больше, т. е. стремится к 1 при. Таким обра­зом, для данного примера двоичного источника теорема верна.

Достижение скоростей (затрат на передачу одной буквы источника), мень­ших 1, невозможно при побуквенном кодировании, поскольку длина кодового слова не может быть меньше 1. Однако переход к кодированию блоков сообще­ний решает эту проблему и позволяет сколь угодно близко подойти к теоретическому пределу, равному энтропии . Конструктивным ре­шением данной задачи является арифметическое кодирование.

Обратная теорема неравномерного кодирования

Обратная теорема неравномерного кодирования устанавливает нижнюю границу средней длины кодовых слов любого однозначно декодируемого кода.

Теорема 8.2. Для любого однозначно декодируемого кода дискретного источника с энтропией средняя длина кодовых слов соответст­вует неравенству

. (8.14)

Иными словами, не существует кода со средней длиной кодовых слов меньше и обладающего свойством однозначной декодируемости.

Рассмотрим вопрос о том, при каких условиях возможно равенство в обратной теореме. Перепишем неравенство (8.14):

.

Для этого при каждом должно выполняться соотношение

.

В то же время для такого распределения вероятностей существует полный префиксный код с длинами кодовых слов

.

Для этого кода неравен­ство Крафта преобразуется в равенство

.

Таким образом, мы установили справедливость следующего утверждения.

Следствие. Для существования кода со средней длиной кодовых слов необходимо, чтобы все вероятности сообщений имели вид

, (8.15)

где — целые положительные числа.

8.3.3. Код Хаффмена

Алгоритм Хаффмена, названный в честь его изобретателя - Дэвида Хаффмена, - дает эффективный способ поиска оптимального вектора Крафта для которого – минимальна. Код, полученный с использованием оптимального , называют кодом Хаффмена.

Алгоритм Хаффмена

Алгоритм Хаффмена реализует общую идею статистического кодирования с использованием префиксных множеств и работает следующим образом:

1. Выписываем в ряд все символы алфавита в порядке не возрастания вероятности их появления в тексте.

2. Последовательно объединяем два символа с наименьшими вероятностями появления в новый составной символ. Каждому символу из составного символа приписываем: одному «0», а второму «1». Вероятность появления составного символа полагаем равной сумме вероятностей составляющих его символов. Составной символ переставляем в ряде в соответствии с новой суммарной вероятностью. В конце концов, построим дерево, каждый узел которого имеет суммарную вероятность всех узлов, находящихся ниже него.

3. Прослеживаем путь к каждому листу дерева, помечая направление к каждому узлу (например, направо - 1, налево - 0) . Полученная последовательность дает кодовое слово, соответствующее каждому символу.

Построим кодовое дерево для сообщения со следующим алфавитом табл. 8.8.

Таблица 8.8. Символы алфавита в порядке не возрастания вероятности их появления в тексте

  1. Объединяем Е и F как символы с наименьшими вероятностями и приписываем символу Е – «0», а F – «1». Суммарная вероятность двух символов 0,2. Составной символ Е F переставляем в ряде в соответствии с новой суммарной вероятностью.

Продолжение табл.8.8

2. Объединяем С и D как символы с наименьшими вероятностями на данном шаге и приписываем символу С – «0», а D – «1». Суммарная вероятность двух символов 0,25. Составной символ С D переставляем в ряде в соответствии с новой суммарной вероятностью.

Продолжение табл.8.8

3. Объединяем В и Е F как символы с наименьшими вероятностями на данном шаге и приписываем символу В – «0», а Е F – «1». Суммарная вероятность символов 0,4. Составной символ В Е F переставляем в ряде в соответствии с новой суммарной вероятностью.

Продолжение табл.8.8

4. Объединяем А и С D как символы с наименьшими вероятностями на данном шаге и приписываем символу A – «0», а С D – «1». Суммарная вероятность символов 0,6. Составной символ А С D переставляем в ряде в соответствии с новой суммарной вероятностью.

Продолжение табл.8.8

5. На последнем шаге объединяем А С D и B E F и приписываем символу А С D – «0», а B E F – «1». Суммарная вероятность символов 1.

На рис.8.6 представлено дерево кода Хаффмена.

Рис. 8.6. Дерево кода Хаффмена

Соседние файлы в папке Пособие ТЕЗ_рус12