Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория информации - курс лекций.doc
Скачиваний:
432
Добавлен:
13.03.2015
Размер:
4.65 Mб
Скачать

5. Префиксный код Хаффмана

Способ оптимального префиксного двоичного кодирования был предложен Д. Хаффманом. Схему построения кодов Хаффмана мы рассмотрим на том же примере, на котором рассматривали построение кодов Шеннона–Фано.

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

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

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

Табл. 8. Вспомогательные алфавиты

,

,

, ,

, ,,

,

, ,

,

, ,

,

,

, ,

,

,

,

Для удобства можно было работать только с таблицей вероятностей, не обращая внимание на содержание алфавитов (табл. 9):

Табл. 9. Таблица вероятностей

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

Табл. 10. Последовательность действий при формировании вспомогательных алфавитов

Теперь эту таблицу продублируем, однако, для простоты (чтобы освободить место для письма) не будем переписывать вероятности, подразумевая, что они остаются на своих местах – в своих клетках. Вместо вероятностей будем писать коды. Приписывать очередной разряд будем справа, как и в случае кодов Шеннона–Фано.

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

Символам алфавита присвоим сверху вниз 0 и 1, то есть символы ииз алфавитаполучат коды «0» и «1» соответственно (табл. 11):

Табл 11. Построение кода Хаффмана

0

1

Символ (то есть символиз алфавита) наследует по стрелке код «1». Коды дляистроим следующим образом. Первый слева разряд их кода наследуется по стрелке от– то есть «0». Вторые слева их разряды будут «0» и «1» сверху вниз дляисоответственно (табл. 12):

Табл 12. Построение кода Хаффмана (продолжение)

1

0

00

1

01

Аналогично строятся коды и далее (табл. 13).

Табл 13. Построение кода Хаффмана (продолжение)

00

00

00

1

0

10

10

01

00

1

11

11

10

01

010

010

11

0110

011

0111

Последовательность действий

Итак, полученные коды выглядят так (табл. 14):

Табл 14. Код Хаффмана

Знак

Код

0.30

00

0.20

10

0.20

11

0.15

010

0.10

0110

0.05

0111

Полученные коды удовлетворяют условию Фано, то есть являются префиксными и, следовательно, не требуют разделителя.

Найдем среднюю длину полученного кода:

.

Таким образом, для кодирования одного символа первичного алфавитапотребовалось в среднем 2.45 символов вторичного (двоичного) алфавита, как и в случае кода Шеннона–Фано.

Избыточность полученного двоичного кода равна:

,

то есть избыточность также около 2.5.

Посмотрим, является ли этот код оптимальным. Нулей в полученных кодах – 8 штук, а единиц – 9 штук. Таким образом, вероятности появления 0 и 1 существенно сблизились (0.47 и 0.53 соответственно). Следовательно, полученный код оптимален.

Более высокая эффективность кодов Хаффмана по сравнению с кодами Шеннона–Фано становится очевидной, если сравнить избыточности этих кодов для какого-либо естественного языка. При кодировании русского алфавита кодами Хаффмана средняя длина кода оказывается равной , при этом избыточность кода равна, то есть не превышает 1, что заметно меньше избыточности кода Шеннона–Фано.

Код Хаффмана важен в теоретическом отношении, поскольку в теории информации доказано, что он является самым экономичным из всех возможных, то есть ни для какого метода алфавитного кодирования длина кода не может оказаться меньше, чем код Хаффмана.

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

Код Хаффмана, кроме теоретического, имеет и практическое значение. Метод Хаффмана и его модификация – метод адаптивного кодирования (динамическое кодирование Хаффмана) – широко применяются в программах-архиваторах, программах резервного копирования файлов и дисков, в системах сжатия информации в модемах и факсах.