Близким к коду Шеннона-Фано, но ещё более выгодным является код Хаффмана. Постро-ение этого кода опирается на простое преобразование того алфавита, на котором запи-сываются передаваемые по линиям связи сообщения. Это преобразование называется сжатиемалфавита.
Пусть имеется алфавит A, содержащий буквы A1; A2; : : : ; An, вероятности появления ко-торых в сообщении соответственно равны p1; p2; : : : ; pn. При этом мы считаем буквы рас-положенными в порядке убывания их вероятности (p1 > p2 > : : : > pn). Условимся не различать между собой две наименее вероятные буквы алфавита (an−1; an) - новая буква b алфавита A1: a1; a2; : : : ; an−2; b и вероятностью появления p1; p2; : : : ; pn−2; (pn−1+ pn).
Алфавит A1 называется алфавитом, подученным из алфавита A c помощью одной опера-ции сжатия. Расположим буквы нового алфавита A1 в порядке убывания их вероятностей и подвергнем сжатию алфавит A1. При этом мы придём к алфавиту A2, получаемому из алфавита A двукратным сжатием. Продолжая эту процедуру мы будем приходить ко всё более коротким алфавитам. После N − 2-кратного сжатия мы придём к алфавиту An−2, содержащему всего 2 буквы.
ПримерПустьn= 6(алфавит из6букв),вероятности которых равны соответственно
0:4; 0:2; 0:2; 0:1; 0:05; 0:05.
Рассмотрим наш алфавит из 6 букв с соответствующими вероятностями:
N буквы
Исх алфавит A
A1
A2
A3
A4
0:4 0
0:4 0
0:4 0
0:4 0
0:6 1
0:2 10
0:2 10
0:2 10
0:4 11
0:4 0
0:2 111
0:2 111
0:2 111
0:2 10
0:1 1101
0:1 1101
0:2 110
0:05 11001
0:1 1100
0:05 11000
Условимся приписывать двум буквам последнего алфавита кодовые обозначения 1 и 0. Если кодовые обозначения уже приписаны всем буквам алфавита Aj, то буквам преды-дущего алфавита Aj−1, сохранившимся и в алфавите Aj мы припишем те-же кодовые обозначения, которые они имели в алфавите Aj. Двум буквам алфавита Aj−1 : A′; A", слившимся в одну букву b алфавита Aj мы припишем обозначения, получающиеся из ко-дового обозначения буквы b добавлением цифр 1 и 0 в конце.
Легко увидеть, что из самого построения получаемого таким образом кода Хаффмана вы-текает, что он удовлетворяет условию: никакое кодовое обозначение не является здесь начало другого, более длинного, кодового обозначения. Заметим также, что кодирова-ние некоторого алфавита по методу Хаффмана также, как и по методу Шеннона - Фано не является однозначно определённой процедурой, однако отметим, что среднее чис-ло k элем сигналов, приходящихся на одну букву алфавита для всех построенных кодов всегда остаётся одинаковым. Можно показать, что код Хаффмана является самым эко-номнымиз всех возможных в том смысле,что ни для какого другого метода кодирова-ния букв некоторого алфавита среднее число k элементарных сигналов, приходящихся на одну букву не может быть меньше того, какое получается при кодировании по методу Хаффмана.