Один из методов разработки оптимального кодирующего дерева — классический алгоритм Хаффмана. ru.ruwiki.ru ru.wikipedia.org Он основан на том, что, зная вероятности появления символов в сообщении, можно построить коды переменной длины, состоящие из целого количества битов. ru.ruwiki.ru ru.wikipedia.org Символам с большей вероятностью ставятся в соответствие более короткие коды. ru.ruwiki.ru
Алгоритм построения дерева Хаффмана: intuit.ru
- Символы входного алфавита образуют список свободных узлов. ru.ruwiki.ru intuit.ru Каждый лист имеет вес, который может быть равен либо вероятности, либо количеству вхождений символа в сжимаемый текст. ru.ruwiki.ru intuit.ru
- Выбираются два свободных узла дерева с наименьшими весами. ru.ruwiki.ru intuit.ru
- Создаётся их родитель с весом, равным их суммарному весу. ru.ruwiki.ru intuit.ru
- Родитель добавляется в список свободных узлов, а двое его детей удаляются из этого списка. intuit.ru
- Одной дуге, выходящей из родителя, ставится в соответствие бит 1, другой — бит 0. ru.ruwiki.ru intuit.ru
- Шаги, начиная со второго, повторяются до тех пор, пока в списке свободных узлов не останется только один свободный узел. ru.ruwiki.ru intuit.ru Он и будет считаться корнем дерева. ru.ruwiki.ru intuit.ru
Также существует метод построения дерева Хаффмана с использованием очереди с приоритетами, где узлу с наименьшей частотой будет присвоен высший приоритет. habr.com