Взвешенные листья образуют дерево двоичного кода, где частые символы получают короткие пути, а одно представление служит кодированию и декодированию.
Вопрос для размышления
Как одно взвешенное дерево может определять как записываемые биты, так и восстанавливаемые символы?
Представление каждого листа одним символом и его весом частоты
Построение дерева кода путем многократного объединения двух самых легких узлов
Кодирование символа путем отслеживания принадлежности ветви от корня
Декодирование битов путем перехода к листу и перезапуска от корня
make-leaf-set упорядочивает конечное число взвешенных символов от самых легких к самым тяжелым. successive-merge извлекает два самых легких узла, объединяет их множества символов и веса, а затем вставляет новый узел обратно в этот порядок, пока не останется одно дерево. При предоставленных весах A получает путь длиною в один бит, тогда как B, C и D получают все более глубокие пути.
Кодирование проверяет, принадлежит ли следующий символ левой или правой ветви, и записывает 0 или 1 перед продолжением пути под этой ветвью. Декодирование обрабатывает те же решения в обратном направлении. Достижение листа выдает его символ и возвращает к корню для следующего кодового слова. Одинаковые веса могут допускать другое корректное дерево, но явное правило вставки фиксирует дерево, используемое в этих запусках.
Первая программа возвращает (8 (A B C D) ((0) (1 0) (1 1 0) (1 1 1))). Вторая программа возвращает ((0 1 1 1 1 0) (A D B)).
На что обратить внимание в трассе
Проследите за взвешенными объединениями, создающими корень, а затем сопоставьте каждую проверку принадлежности символа с записанным битом ветви. Во время декодирования наблюдайте, как те же биты выбирают ветви до тех пор, пока лист не выдаст символ и обход не начнется заново от корня. Трасса выполнения фиксирует это дерево и сообщение в рамках фиксированных ограничений времени выполнения.
Попробуйте сами
Измените программу и сравните результат.
Закодируйте (A B C D A) с помощью предоставленного дерева. Перед запуском определите общее количество битов и объясните, почему A требует меньше битов, чем C или D.
Показать подсказку
Считайте каждый код из первого примера, соедините пять путей и подсчитайте решения на ветвях.