11.2 Кодеры, основанные на системе сжатия без потерь информации
В данном случае кодирующее устройство должно удовлетворять следующим условиям:
Обеспечивать безошибочную передачу информации, то есть взаимно однозначное соответствие между и
(рисунок
11.2).Обеспечивать кодирование наиболее экономным образом (с минимальной избыточностью).
Для выполнения первого требования:
необходимо, чтобы различным буквам алфавита соответствовали различные кодовые слова;
необходимо, чтобы была предусмотрена возможность разделения кодовых слов при их последовательной передаче. Для обеспечения этой возможности:
используют специальные разделяющие символы;
применяют кодовые слова одинаковой длины (равномерное кодирование);
кодовая таблица составляется таким образом, чтобы никакое кодовое слово не являлось началом другого кодового слова.
Для выполнения второго требования необходимо добиваться при кодировании минимальной средней длины кодового слова:
|
(11.3) |
где
– это длина
-ого
слова
с учетом разделительной буквы (если она
используется).
Теорема 1. Теорема
Шеннона о кодировании в дискретных
каналах без шума. При
кодировании множества сигналов с
энтропией
при условии отсутствия шумов средняя
длина кодового слова
не может быть меньше, чем
,
где
– размер алфавита кодера, 2 – основание
алфавита кода.
Если вероятности
сигналов не являются целочисленными
отрицательными степенями
(то есть все вероятности сообщений
имеют вид:
,
где
– целое положительное число), достижение
указанной нижней границы невозможно,
но при кодировании достаточно длинными
блоками к ней можно сколь угодно
приближаться.
Существует несколько способов, позволяющих получать коды с малой избыточностью; причем все они обладают следующими свойствами:
Более вероятным буквам источника ставятся в соответствие более короткие кодовые слова.
Никакое кодовое слово не является началом другого более длинного кодового слова.
Все буквы алфавита, используемые для передачи информации приблизительно равновероятны.
Символы в последовательности на выходе кодера практически независимы.
11.3 Основные методы побуквенного кодирования. Код Хаффмана
Простейшими кодами, с помощью которых можно выполнять сжатие информации, являются коды без памяти:
код Хаффмана;
код Шеннона;
код Шеннона-Фано;
код Гильбера-Мура.
Наилучшим из кодов, обладающих свойствами, перечисленными выше, является код Хаффмана. Его мы и рассмотрим в ходе этой лекции, а остальные коды рассмотрим в последующих лекциях.
Код Хаффмана – это двоичный префиксный код без памяти. Далее рассмотрим некоторые теоретические основы этого кода.
Префиксным множеством двоичных последовательностей S называется конечное множество двоичных последовательностей таких, что ни одна последовательность в этом множестве не является префиксом, или началом, другой последовательности в S.
Например, множество
двоичных слов
является префиксным множеством, а
– не является т. к. здесь двоичных
последовательность 00 является началом,
другой последовательности 001 в
S2.
Каждый префиксный код является дешифрируемым (обратное утверждение неверно).
Кодирование кодом без памяти осуществляется следующим образом:
Необходимо составить полный список символов
алфавита
входного сигнала; на j-ом
месте стоит символ с вероятностью
,
то есть на первом
месте стоит наиболее часто встречающийся
символ.Для любого
назначить кодовое слово
из префиксного множества двоичной
последовательности S.На выходе кодера объединить в одну последовательность все полученные двоичные слова.
Если
– префиксное множество, то можно
определить некоторый вектор
,
состоящий из чисел, являющихся длинами
соответствующих префиксных
последовательностей (
является длиной
).
Вектор
состоит из неуменьшающихся положительных
целых чисел и называется вектор
Крафта. Для
него выполняется неравенство
Крафта:
|
(11.4) |
Длины двоичных последовательностей в префиксном множестве удовлетворяют данному соотношению. Если в (11.4) имеет место строгое равенство, то код называется оптимальным.
Пример № 1.
,
.
,
.
Средняя длина
двоичной последовательности на выходе
кодера – это
.
Лучший код без памяти – это код, для
которого средняя длина
минимальна. Для того чтобы это выполнялось,
необходимо найти соответствующий вектор
Крафта
.
Простым перебором такую задачу при
больших k
осуществить трудно.
11.3.1 Код Хаффмана. Алгоритм кодирования Хаффмана дает эффективный способ поиска оптимального вектора Крафта. Код, получаемый с использованием этого оптимального вектора, называется кодом Хаффмана.
Далее приведен алгоритм построения кодового дерева Хаффмана (H-дерева):
Шаг 1. Инициализация.
Список подлежащих обработки узлов
состоит из
узлов, где
– мощность алфавита входных сообщений
(количество букв в этом алфавите). Каждому
из узлов приписывается вероятность
появления буквы.
Шаг 2. Цикл.
Пока
в списке необработанных узлов находим
два узла с наименьшими вероятностями.
Они исключаются из списка, и вместо них
вводится новый узел, которому приписывается
суммарная вероятность двух исключенных
узлов. Новый узел связывается ребрами
с исключенными узлами.
.
Теорема 2. Код Хаффмана является оптимальным.
Пример № 2.
Пусть дан ансамбль
сообщений (алфавит):
.
Энтропия ансамбля
(алфавита):
бит.
На рисунке 11.4 приведено кодовое дерево для ансамбля X. Движение при кодировании и декодировании происходит справа налево.
Рисунок 11.4 –Кодовое дерево Хаффмана
Таким образом, имеем:
Буква |
Код |
l – длина кодового слова |
k – номер кодового слова |
а |
00 |
2 |
1 |
b |
10 |
2 |
2 |
c |
010 |
3 |
3 |
d |
011 |
3 |
4 |
e |
110 |
3 |
5 |
f |
111 |
3 |
6 |
Найдены кодовые
слова и вектор Крафта:
.
Проверим выполнение неравенства Крафта (11.4):
,
значит найденный код оптимальный.
Средняя длина двоичной последовательности, вычисленная по формуле (11.3) составляет
бит.
Очевидно, эта длина
не меньше энтропии (
бит).
Найдем избыточность данного неравномерного кода:
бит.
Вычисленная избыточность показывает, что при данном кодировании тратится на 0,05 бит больше, чем могло бы быть затрачено в принципе при теоретически лучшем принципе кодирования.
Для декодирования выходной последовательности используется тоже двоичное кодовое дерево (дерево просматривается справа налево); если в потоке встречается нулевой бит, то берется верхняя ветвь, иначе – нижняя. Так продолжается до тех пор, пока не получен лист дерева, соответствующий исходному символу последовательности.
Средняя длина кодовых слов для данного алгоритма удовлетворяет неравенству
бит,
что и было показано ранее в примере № 2.
Закодируем при помощи построенного кода Хаффмана сообщение «abba»:
a |
b |
b |
a |
00 |
10 |
10 |
00 |
Видно, что длина кодовой цепочки символов составляет 8 бит = 1 байт.
Если бы сообщение «abba» кодировалось при помощи кодой таблицы ASCII (American Standard Code of Information Interchange – американский стандартный код информационного обмена), то длина кодовой цепочки символов составляет 4 байт (каждая буква кодируется одним байтом). Следовательно, в данном случае коэффициент сжатия, рассчитанный по формуле (11.1), составит
.
Выводы
Построенный в примере № 2 код Хаффмана действительно является оптимальным.
Средняя длина двоичной последовательности построенного кода Хаффмана составляет 2,45 бит.
Избыточность данного неравномерного кода составляет 0,05 бит.
Коэффициент сжатия сообщение «abba» кода Хаффмана составляет 4 для случая, когда размер источника сообщений определялся на основе кодой таблицы ASCII.

.