Второй пункт звучит как фокус: длины – это ещё не коды, откуда получателю знать, какое кодовое слово кому досталось? Ниоткуда – если не договориться заранее. Поэтому и договариваются: коды раздаются по жёсткому правилу, одинаковому у обеих сторон. Получатель не восстанавливает то же самое дерево – он строит по длинам свою таблицу, а отправитель, зная правило, кодирует ровно по такой же. Код, раздающий слова по этому правилу, называется каноническим.
Само правило – четыре пункта.
- Символы выстраиваются по возрастанию длины кода, а внутри одной длины – по алфавиту. Годится любой заранее оговорённый порядок, важно лишь, чтобы он был один и тот же у обеих сторон.
- Первому символу достаётся код из одних нулей – столько нулей, какова его длина.
- Каждый следующий код – это предыдущий, увеличенный на единицу как двоичное число.
- Если при переходе к очередному символу длина выросла на $k$ битов, к получившемуся числу дописывается $k$ нулей справа.
Ни дерева, ни частот, ни правила разрешения ничьих при этом не нужно – только список длин. Вот что получается для нашего слова:
| Буква |
Длина |
Код с дерева |
Канонический код |
| А |
1 |
0 |
0 |
| Б |
3 |
110 |
100 |
| Д |
3 |
101 |
101 |
| К |
3 |
100 |
110 |
| Р |
3 |
111 |
111 |
Проследим по строкам. А – единственная с длиной 1, ей достаётся 0. Дальше длина прыгает до трёх: прибавляем единицу (0 + 1 = 1) и дописываем два нуля – выходит 100, это Б. Остальные получаются простым прибавлением единицы: 101, 110, 111.
Запись не стала длиннее. Длины остались теми же, что у кода с дерева, а объём ленты зависит только от них – всё те же 23 бита. Кодовые слова другие, но из предыдущего блока мы уже знаем, что это нормально.
Условие Фано не ломается. Возьмём короткий код $c$ длины $m$ и любой более длинный код $d$. Первые $m$ битов $d$ – это то самое число, в которое превратился $c$ после прибавления единицы (а может, и нескольких), то есть строго больше $c$. Значит, $c$ не совпадает с началом $d$ и префиксом его быть не может.
Что в итоге едет в файле. Вместо дерева – список длин по фиксированному порядку символов: 1, 3, 3, 3, 3. На практике длина кода не превышает полутора-двух десятков битов, поэтому одну длину можно записать четырьмя-пятью битами вместо целой ветки дерева. Ровно так устроены таблицы Хаффмана в JPEG и в DEFLATE (ZIP, gzip, PNG).