Алгоритм Хаффмана
Алгоритм основан на том факте, что некоторые символы из
стандартного 256-символьного набора в произвольном тексте могут встречаться
чаще среднего периода повтора, а другие, соответственно, реже. Следовательно,
если для записи распространенных символов использовать короткие последовательности
бит, длиной меньше 8, а для записи редких символов длинные, то суммарный
объем файла уменьшится.
Хаффман предложил очень простой алгоритм
определения того, какой
символ необходимо кодировать каким кодом для получения файла с длиной,
очень близкой к его энтропии
(то есть информационной насыщенности).
Пусть у нас имеется список всех символов, встречающихся в исходном
тексте, причем известно количество появлений каждого символа в нем.
Выпишем их вертикально в ряд в виде ячеек будущего графа
по правому краю листа (рис. 1а). Выберем два символа с наименьшим
количеством повторений в тексте (если три или большее число символов
имеют одинаковые значения, выбираем любые два из них). Проведем от
них линии влево к новой вершине графа и запишем в нее значение, равное
сумме частот повторения каждого из объединяемых символов (рис.2б).
Отныне не будем принимать во внимание при поиске наименьших частот
повторения два объединенных узла (для этого сотрем числа в этих двух
вершинах), но будем рассматривать новую вершину как полноценную ячейку
с частотой появления, равной сумме частот появления двух соединившихся
вершин. Будем повторять операцию объединения вершин до тех пор, пока
не придем к одной вершине с числом (рис.2в и 2г). Для проверки:
очевидно, что в ней будет записана длина кодируемого файла. Теперь
расставим на двух ребрах графа, исходящих из каждой вершины, биты 0 и 1
произвольно например, на каждом верхнем ребре 0, а на каждом нижнем
1. Теперь для определения кода каждой конкретной буквы необходимо
просто пройти от вершины дерева до нее, выписывая нули и единицы по
маршруту следования. Для рисунка 4.5 символ "А" получает код "000",
символ "Б" код "01", символ "К" код "001",
а символ "О" код "1".
Рис.1.
В теории кодирования информации показывается, что код Хаффмана
является префиксным, то есть код никакого символа
не является
началом кода какого-либо другого символа. Проверьте это на нашем примере.
А из этого следует, что код Хаффмана однозначно восстановим получателем,
даже если не сообщается длина кода каждого переданного символа. Получателю
пересылают только дерево Хаффмана в компактном виде, а затем входная
последовательность кодов символов декодируется им самостоятельно без
какой-либо дополнительной информации. Например, при приеме "0100010100001"
им сначала отделяется первый символ "Б" : "01-00010100001", затем снова
начиная с вершины дерева "А" "01-000-10100001", затем аналогично
декодируется вся запись "01-000-1-01-000-01" "БАОБАБ".
Назад | Содержание
| Вперед