Код Хаффмана работает путем размещения данных в дереве.Если у вас есть двоичное дерево, вы можете связать каждый лист с кодом, сказав, что левый дочерний элемент соответствует биту в 0, а правый дочерний - 1. Путь, который ведет от корня к листу, соответствует коду в ненеоднозначный способ.
Это работает для любого дерева, а свойство префикса основано на том факте, что лист является терминальным.Следовательно, вы не можете перейти к листу (иметь код), передавая другой лист (имея префикс другого кода).
Основная идея кодирования Хаффмана заключается в том, что вы можете строить деревья таким образом, чтобыглубина каждого узла коррелируется с вероятностью появления узла (более вероятные коды будут ближе к корню).
Существует несколько алгоритмов для построения такого дерева.Например, предположим, что у вас есть набор элементов, которые вы хотите закодировать, скажем a..f.Вы должны знать вероятности появления каждого элемента благодаря модели источника или анализу фактических значений (например, путем анализа файла в коде).
Тогда вы можете:
- сортировка элементов по вероятности
- извлечение двух элементов с наименьшей вероятностью
- удаление этих элементов, группировка их в новом составном узле и назначение одного элемента левому потомку (код0), а другой - справа (код 1).
- Вероятность составного узла является суммой отдельных вероятностей и вставьте этот новый узел в список отсортированных элементов.
- Перейти к 2в то время как количество элементов> 1
Для предыдущего дерева оно может соответствовать набору вероятностей
a (0,5) b (0,2) c (0,1) d (0,05) e (0,05) f (0,1)
Затем вы выбираете предметы с наименьшей вероятностью (d и e), группируете их в составном узле (de) и получаете новый список
a (0,5) b (0,2) c (0,1) (де) (0,1) f (0,1)
А тПоследовательные списки предметов могут быть
a (0,5) b (0,2) c (de) (0.2) f (0.1)
a (0.5) b (0.2) (c (de)) f (0,3)
a (0,5) b ((c (de)) f) (0.5)
a (b (((c (de)) f)) 1,0
Таким образом, свойство префикса застраховано строительством.