previous up index search
Previous: 2.6.4 Метод Шеннона-Фано    UP: 2.6 Методы сжатия информации

2.6.5 Статический алгоритм Хафмана

Семенов Ю.А. (ИТЭФ-МФТИ)
Yu. Semenov (ITEP-MIPT)

Статический алгоритм Хафмана можно считать классическим (см. также Р. Галлагер. Теория информации и надежная связь. “Советское радио”, Москва, 1974.) Определение статический в данном случае относится к используемым словарям. Смотри также www.ics.ics.uci.edu/~dan/pubs/DataCompression.html (Debra A. Lelewer и Daniel S. Hirschberg).

Пусть сообщения m(1),…,m(n) имеют вероятности P(m(1)),… P(m(n)) и пусть для определенности они упорядочены так, что P(m(1)) і P(m(2)) іі P(m(N)). Пусть x1,…, xn – совокупность двоичных кодов и пусть l1, l2,…, lN – длины этих кодов. Задачей алгоритма является установление соответствия между m(i) и xj. Можно показать, что для любого ансамбля сообщений с полным числом более 2 существует двоичный код, в котором два наименее вероятных кода xN и xN-1 имеют одну и ту же длину и отличаются лишь последним символом: xN имеет последний бит 1, а xN-10. Редуцированный ансамбль будет иметь свои два наименее вероятные сообщения, сгруппированными вместе. После этого можно получить новый редуцированный ансамбль и так далее. Процедура может быть продолжена до тех пор, пока в очередном ансамбле не останется только два сообщения. Процедура реализации алгоритма сводится к следующему (см. рис. 2.6.5.1). Сначала группируются два наименее вероятные сообщения, предпоследнему сообщению ставится в соответствие код с младшим битом, равным нулю, а последнему – код с единичным младшим битом (на рисунке m(4) и m(5)). Вероятности этих двух сообщений складываются, после чего ищутся два наименее вероятные сообщения во вновь полученном ансамбле (m(3) и m`(4); p(m`(4)) = p(m(4)) + P(m(5))).

Рис. 2.6.5.1 Пример реализации алгоритма Хафмана

На следующем шаге наименее вероятными сообщениями окажутся m(1) и m(2). Кодовые слова на полученном дереве считываются справа налево. Алгоритм выдает оптимальный код (минимальная избыточность).

Но при использовании кодов разной длины могут возникнуть проблема разделение кодовых слов при последовательной пересылке. Например [6], пусть <(a,1); (b,01); (c,101); (d,011)>, тогда битовая последовательность 1011 может быть интерпретирована как aba, ca или ada. Чтобы избежать этой неопределенности можно посылать код длины перед каждым символом, что связано с пересылкой дополнительных данных. Более эффективным решением является конструирование кодов, в которых мы можем всегда однозначно преобразовать битовую последовательность в кодовое слово. Кодом такого типа является префиксный код, в котором никакая битовая строка не является префиксом другого кода. Например, <(a,1); (b.01);(c,000);(d,001)>. Префиксные коды имеют то преимущество перед другими кодами, что мы можем дешифровать любое сообщение без необходимости выявления начала следующего. Префиксный код может быть представлен в виде двоичного дерева:

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

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

Возможно применение стандартных алфавитов (кодовых таблиц) для пересылки английского, русского, французского и т.д. текстов, программных текстов на С++, Паскале и т.д. Кодирование при этом не будет оптимальным, но исключается статистическая обработка пересылаемых фрагментов и отпадает необходимость пересылки кодовых таблиц. Ниже в таблице представлена таблица возможных кодов Хафмана для английского алфавита.

Буква Код Хафмана
E100
T001
A1111
O1110
N1100
R1011
I1010
S0110
H0101
D11011
L01111
F01000
C01000
M00011
U00010
G00001
Y00000
P110101
W011101
B011100
V1101001
K110100011
X110100001
J110100000
Q1101000101
Z1101000100

Ниже представлена аналогичная таблица для русского алфавита [Яглом А.М., Яглом И.М. "Вероятность и информация". 3-е изд. - Наука, 1973]. В этой таблице коды букв Е и Ё идентичны, аналогичная сутуация с кодами Ь и Ъ. Следует также иметь в виду, что помимо букв определенные коды должны быть присвоены символам пунктуации, числам и некоторым специальным символам (1 2 3 4 5 6 7 8 9 0 . , : ; ! ? ... ' " ~ % # * + - = \ ( ) [ ] { } _).

БукваОтносит.
частота
Код Хафмана

пробел
0,175111
O 0,090110
Е,Ё0,0721001
А0,0621010
И0,0621001
T0,0531000
Н0,0530111
C0,0450110
Р0,04001011
В0,03801010
Л0,03501001
К0,02801000
М0,02600111
Д0,025001101
П0,023001100
У0,02100101
Я0,018001001
Ы0,016001000
З0,016000111
Ь,Ъ0,014000110
Б0,014000101
Г0,013000100
Ч0,012000011
Й0,0100000101
Х0,0090000100
Ж0,0070000011
Ш0,00600000101
Ю0,00600000100
Ц0,00400000010
Щ0,00300000001
Э0,003000000001
Ф0,002000000000

Возможная схема реализации алгоритма формирования кодов Хафмана для русского алфавита показана на рис. 2.6.5.2.

Рис. 2.6.5.2

Среднее число элементарных сигналов для передачи буквы при данном методе кодирования равно 4,4.

Следует заметить, что часто встречающиеся символы (последовательности бит) несут меньше информации, чем редко встречающиеся, не случайно для них применено большее число бит. Также как поезд, сходящий с рельс, имеет большую информационную емкость, чем поезд прибывающий по расписанию. Не случайно люди интуитивно воспринимают сообщения о несчастьях с большим интересом.

Previous: 2.6.4 Метод Шеннона-Фано    UP: 2.6 Методы сжатия информации