Алгоритм построения оптимального префиксного кода по заданному множеству данных может работать по-разному в зависимости от используемого алгоритма.
Алгоритм Фано: 1
- Список букв алфавита источника упорядочивается в порядке невозрастания вероятностей их появления в сообщениях. 1
- Список букв делится на две последовательные части с равными или примерно равными суммами вероятностей. 1
- Буквам первой части приписывается цифра 0, а буквам второй части — цифра 1. 1
- Действия пунктов 2 и 3 применяются к каждой части до тех пор, пока все полученные части не станут содержать по одной букве. 1
- Каждой букве ставится в соответствие элементарный код, состоящий из цифр 0 и 1, последовательно приписанных частям, содержащим эту букву. 1
Алгоритм Хаффмана: 2
- На входе получает таблицу частотностей символов в сообщении. 2
- На основании этой таблицы строится дерево кодирования Хаффмана (Н-дерево). 2 Символы входного алфавита образуют список свободных узлов. 2 Каждый лист имеет вес, который может быть равен либо вероятности, либо количеству вхождений символа в сжимаемое сообщение. 2
- Выбираются два свободных узла дерева с наименьшими весами. 2
- Создаётся их родитель с весом, равным их суммарному весу. 2 Родитель добавляется в список свободных узлов, а два его потомка удаляются из этого списка. 2
- Одной дуге, выходящей из родителя, ставится в соответствие бит 1, другой — бит 0. 2 Битовые значения ветвей, исходящих от корня, не зависят от весов потомков. 2
- Шаги, начиная со второго, повторяются до тех пор, пока в списке свободных узлов не останется только один свободный узел. 2 Он и будет считаться корнем дерева. 2
- Чтобы определить код для каждого из символов, входящих в сообщение, нужно пройти путь от листа дерева, соответствующего текущему символу, до его корня, накапливая биты при перемещении по ветвям дерева (первая ветвь в пути соответствует младшему биту). 2
Также существует метод Хаффмана, который заключается в последовательной замене букв, имеющих наименьшие вероятности, на одну новую, имеющую вероятность, равную сумме вероятностей заменяемых букв. 3