Двоичные деревья. Алгоритм Хаффмана.
Задача
Задача: найти минимальный префиксный код для множества.(префиксный означает что никакой символ не является префиксом другого символа при кодировании)
Пусть имеется текст, состоящий из множества 4 символов: AAAAAAAAAAAABBBBBBCCD
Его длина 21 символов. Текст можно закодировать следующим образом:
(A -> 00),(B -> 01),(C -> 10),(D -> 11)
Для простоты и наглядности разместим наш алфавит в виде двоичного дерева
Для кодирования каждого символа понадобится 2 бита и длина кода составит 42 бит.
Определение
Алгоритм Хаффмана - алгоритм оптимального префиксного кодирования алфавита. Его идея состоит в подсчёта частоты вхождения каждого элемента во множестве. Чем чаще встречается элемент тем меньше он должен весить.
Алгоритм
- помещаем в каждый узел частоту символа
- располагаем узлы в порядке убывания
- для 2 наименьших добавляем узел, который их соединяет
- его значение cоотвествует сумме частот его детей
- повторяем с п.3
Вернемся к примеру: AAAAAAAAAAAABBBBBBCCD Вычисляем частоты вхождений: F(a) = 12; F(b) = 6; F(c) = 2; F(d) = 1;
Ход решения:
- выбираем 2 узла с наименьшей частотой(С и D), помещаем их на 1 уровень, соединяем с родителем CD=3
- Повторяем п.1, но уже для множества A=12, B=6, CD=3
Ответом для данного набора является
A => 0; B => 10; C => 110; D => 111
Общая длина составит 33 бита что < 42.