К содержанию

Подтема 2 из 4

Кодовое дерево и кратчайший код

Коды как пути в дереве: как читать сообщение, где свободные ветви и какой код самый короткий.

Коды как пути

Задача подтемы: сообщения состоят из букв А, Б, В, Г; известны А — 1, Б — 000, В — 011. Найди кратчайший код Г, а если таких несколько — с наименьшим числовым значением.

Все коды таблицы удобно видеть сразу — как пути в двоичном дереве: буква стоит в конце своего пути, и ниже неё других букв нет. Сначала нарисуем дерево знакомой таблицы А — 0, Б — 10, В — 110, Г — 111 и прочитаем по нему сообщение, затем вернёмся к задаче.

Путь от корня

Каждый код — путь от корня: за каждый знак делаем шаг по ветви 0 или 1. Вместо постоянного сравнения строк удобно изображать все возможные коды в виде дерева. Начинаем с начальной точки — она называется корнем дерева. Из каждой точки можно сделать два шага: по ветви 0 или по ветви 1. Пройденные знаки образуют код.

Например, один шаг 0 даёт код 0; шаги 1, затем 0 дают 10; шаги 1, 1, 0 дают 110. Таблица А — 0, Б — 10, В — 110, Г — 111 изображается так:

Код буквы — путь от корня до неё: к В ведут ветви 1, 1, 0. Номер уровня слева — длина кода: В и Г на третьем уровне, их коды из трёх знаков.

Точки дерева называют вершинами. Количество шагов от корня до вершины называется её глубиной. В кодовом дереве глубина совпадает с длиной кода: до 110 нужно сделать три шага, поэтому его глубина и длина равны трём.

Вершина, в которой заканчивается путь к букве и дальше нет используемых продолжений, называется листом.

Условие Фано на дереве

На дереве условие Фано звучит так: буквы стоят в листьях, и ниже буквы других букв нет. Если назначили букве код 10, то под ней нельзя размещать коды 100, 101, 1000, 1001 и все остальные, которые начинаются с 10.

И наоборот: если где-то ниже уже есть код 100, то вершину 10 нельзя назначить другой букве — она лежит на пути к существующему коду.

Это и есть две проверки нового кода из подтемы 1, показанные геометрически: «новый код — начало старого» значит, что новая буква встала на путь к старой; «старый код — начало нового» — что новая буква встала под старой.

Чтение по дереву

Сообщение читают по дереву: от корня до буквы, а затем снова от корня. Пусть получено 111010110. Идём от корня по знакам: пока вершина лежит на пути к буквам, читаем дальше; как только пришли в букву — записываем её и возвращаемся в корень.

  1. Читаем 111010110 слева направо. Начинаем в корне дерева.
  2. Знак 1: вершина 1 лежит на пути к буквам, читаем дальше.
  3. Знак 1: вершина 11 лежит на пути к буквам, читаем дальше.
  4. Знак 1: пришли в лист 111 — это Г. Следующую букву читаем снова от корня.
  5. Знак 0: пришли в лист 0 — это А. Следующую букву читаем снова от корня.
  6. Знак 1: вершина 1 лежит на пути к буквам, читаем дальше.
  7. Знак 0: пришли в лист 10 — это Б. Следующую букву читаем снова от корня.
  8. Знак 1: вершина 1 лежит на пути к буквам, читаем дальше.
  9. Знак 1: вершина 11 лежит на пути к буквам, читаем дальше.
  10. Знак 0: пришли в лист 110 — это В. Следующую букву читаем снова от корня.
  11. Сообщение кончилось ровно на листе: 111010110 — это ГАБВ.

Получается 111 | 0 | 10 | 110 — ГАБВ. Не нужно специально выбирать «самый длинный подходящий код»: при условии Фано первое найденное кодовое слово уже определяет букву.

Если сообщение закончилось, а прочитанный остаток не образует кодовое слово, последовательность не является полной записью сообщения по этой таблице. Например, одиночное 11 здесь не обозначает букву: это только начало кодов В и Г.

Свободная ветвь

Свободная ветвь — вершина, на которой и под которой нет ни одной буквы. Возьмём неполную таблицу А — 1, Б — 000, В — 011 и разберём, где можно разместить новую букву.

Буквы занимают 1, 000 и 011. Вершины 0, 00 и 01 лежат на путях к ним. Свободны только две ветви — 001… и 010…: на них и под ними нет ни одной буквы.
  • 1 занято буквой А, все продолжения 1… запрещены; так же заняты 000… и 011….
  • 0, 00 и 01 нельзя назначить новым буквам: они являются началами существующих кодов.
  • Остаются две полностью свободные ветви: 001… и 010….

Что означает «ветвь 001… свободна»? В ней можно использовать сам код 001 для одной буквы — либо не занимать 001, а размещать буквы глубже: 0010, 0011 и так далее. Это принципиальный выбор:

Свободную вершину можно занять одной буквой или разветвить для нескольких букв. Одновременно сделать и то и другое нельзя.

Если назначили Г — 001, то использовать 0010 и 0011 для других букв уже нельзя. Если нужны Г — 0010 и Д — 0011, то 001 остаётся промежуточной вершиной, а не кодом отдельной буквы.

При поиске свободных ветвей записывай их у ближайших к корню свободных вершин: достаточно записать 001, а не перечислять отдельно 0010, 0011, 00100 и все остальные продолжения.

Кратчайший код

Кратчайший код ищут по длине, а среди кодов одной длины — по числовому значению. Найдём кратчайший код Г для таблицы А — 1, Б — 000, В — 011; если вариантов несколько, выберем код с наименьшим числовым значением. Проверяем длины по порядку:

1
0 — начало 000 и 011; 1 уже занятодного знака недостаточно
2
00 — начало 000; 01 — начало 011; 10 и 11 начинаются с занятого 1двух знаков тоже недостаточно
3
000 и 011 заняты, 1… не подходит; 001 и 010 подходяткратчайшая длина — 3

Это ровно две свободные ветви с рисунка. Они имеют одинаковую длину, меньшее числовое значение у 001. Ответ: 001.

Почему одинаковые по длине двоичные коды можно сравнивать слева направо? Смотрим на первый знак, в котором они различаются: код, у которого в этой позиции стоит 0, меньше. У 001 и 010 первый знак одинаковый, во втором у первого кода 0, у второго — 1. Поэтому первый меньше.

Иногда спрашивают код с наибольшим числовым значением — тогда среди кратчайших берут последний: здесь это 010. Длина при этом всё равно минимальная: сначала длина, потом значение.

Два правила оформления ответа:

  • если спрашивают код, записываем саму последовательность, включая ведущие нули;
  • если спрашивают длину, записываем количество знаков.

Для найденного кода ответы на эти разные вопросы — 001 и 3.

Итого

  • Кодпуть от корня; длина кода — глубина вершины
  • Буквастоит в листе: ниже неё других букв нет
  • Чтениеот корня до буквы и снова от корня
  • Свободная ветвьни на ней, ни под ней нет букв
  • Кратчайший кодсначала длина, затем значение; ведущие нули сохраняются

Проверьте себя

Ответь сначала сам, потом открой ответ.

Вопрос 1
Нарисуй дерево кодов А — 01, Б — 000, В — 11. Какие ветви свободны?
ОтветСкрыть ответ
Ответ
001 и 10: под 0 заняты 01 и 000, под 1 — только 11.
Вопрос 2
По таблице А — 0, Б — 10, В — 110, Г — 111 прочитай 11010 и 1101. Какая из записей неполная?
ОтветСкрыть ответ
Ответ
11010 — ВБ: 110 | 10. Запись 1101 неполная: после 110 остаётся 1.
Вопрос 3
Для таблицы А — 1, Б — 000, В — 011 найди кратчайший код Г с наибольшим числовым значением.
ОтветСкрыть ответ
Ответ
010: свободны две вершины длины 3 — 001 и 010, коротких свободных нет; большее значение у 010.
Вопрос 4
Кратчайший код получился 001. Можно ли записать ответ как 1?
ОтветСкрыть ответ
Ответ
Нет: код — последовательность знаков, ведущие нули — её часть. 1 — другой код длины 1, и он здесь занят.

Практика

Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.

Кратчайший код Д

Алфавит содержит только А, Б, В, Г, Д. Известно: А — 00, Б — 01, В — 110, Г — 111. Найди кратчайший код Д.

Введите кодовое слово (последовательность из 0 и 1).

Кратчайший код Г

Сообщения содержат только буквы А, Б, В, Г; А — 0, Б — 111, В — 101. Найди кратчайший код Г; если вариантов несколько, выбери код с наибольшим числовым значением.

Введите кодовое слово (последовательность из 0 и 1).

Все коды длины 4

Для таблицы А — 1, Б — 000, В — 011 перечисли все коды длины 4, которые можно дать букве Г.

Введите коды через пробел в порядке возрастания.

Кратчайший код П

Для кодирования некоторой последовательности, состоящей из букв К, Л, М, Н, П, решили использовать неравномерный двоичный код, удовлетворяющий условию Фано. Для букв К, Л, М, Н использовали соответственно кодовые слова 01, 001, 11, 100. Укажи кратчайшее возможное кодовое слово для буквы П. Если таких кодов несколько, укажи код с наименьшим числовым значением.

Введите кодовое слово (последовательность из 0 и 1).

Кратчайший код К

По каналу связи передаются сообщения, содержащие только десять букв: А, Б, В, Г, Д, Е, Ж, З, И, К. Используется двоичный код, удовлетворяющий условию Фано. Для девяти букв кодовые слова известны: А — 000, Б — 0010, В — 0011, Г — 010, Д — 0110, Е — 100, Ж — 101, З — 1100, И — 111. Укажи кратчайшее кодовое слово для буквы К. Если таких кодов несколько, укажи код с наименьшим числовым значением.

Введите кодовое слово (последовательность из 0 и 1).

Кратчайший код с наибольшим значением

Сообщения содержат только буквы Р, С, Т, У; используется двоичный код, удовлетворяющий условию Фано: Р — 1, С — 001, Т — 010. Укажи кратчайшее кодовое слово для буквы У. Если таких кодов несколько, укажи код с наибольшим числовым значением.

Введите кодовое слово (последовательность из 0 и 1).