Подтема 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 изображается так:
Точки дерева называют вершинами. Количество шагов от корня до вершины называется её глубиной. В кодовом дереве глубина совпадает с длиной кода: до 110 нужно сделать три шага, поэтому его глубина и длина равны трём.
Вершина, в которой заканчивается путь к букве и дальше нет используемых продолжений, называется листом.
Условие Фано на дереве
На дереве условие Фано звучит так: буквы стоят в листьях, и ниже буквы других букв нет. Если назначили букве код 10, то под ней нельзя размещать коды 100, 101, 1000, 1001 и все остальные, которые начинаются с 10.
И наоборот: если где-то ниже уже есть код 100, то вершину 10 нельзя назначить другой букве — она лежит на пути к существующему коду.
Это и есть две проверки нового кода из подтемы 1, показанные геометрически: «новый код — начало старого» значит, что новая буква встала на путь к старой; «старый код — начало нового» — что новая буква встала под старой.
Чтение по дереву
Сообщение читают по дереву: от корня до буквы, а затем снова от корня. Пусть получено 111010110. Идём от корня по знакам: пока вершина лежит на пути к буквам, читаем дальше; как только пришли в букву — записываем её и возвращаемся в корень.
- Читаем 111010110 слева направо. Начинаем в корне дерева.
- Знак 1: вершина 1 лежит на пути к буквам, читаем дальше.
- Знак 1: вершина 11 лежит на пути к буквам, читаем дальше.
- Знак 1: пришли в лист 111 — это Г. Следующую букву читаем снова от корня.
- Знак 0: пришли в лист 0 — это А. Следующую букву читаем снова от корня.
- Знак 1: вершина 1 лежит на пути к буквам, читаем дальше.
- Знак 0: пришли в лист 10 — это Б. Следующую букву читаем снова от корня.
- Знак 1: вершина 1 лежит на пути к буквам, читаем дальше.
- Знак 1: вершина 11 лежит на пути к буквам, читаем дальше.
- Знак 0: пришли в лист 110 — это В. Следующую букву читаем снова от корня.
- Сообщение кончилось ровно на листе: 111010110 — это ГАБВ.
Получается 111 | 0 | 10 | 110 — ГАБВ. Не нужно специально выбирать «самый длинный подходящий код»: при условии Фано первое найденное кодовое слово уже определяет букву.
Если сообщение закончилось, а прочитанный остаток не образует кодовое слово, последовательность не является полной записью сообщения по этой таблице. Например, одиночное 11 здесь не обозначает букву: это только начало кодов В и Г.
Свободная ветвь
Свободная ветвь — вершина, на которой и под которой нет ни одной буквы. Возьмём неполную таблицу А — 1, Б — 000, В — 011 и разберём, где можно разместить новую букву.
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.
Итого
- Кодпуть от корня; длина кода — глубина вершины
- Буквастоит в листе: ниже неё других букв нет
- Чтениеот корня до буквы и снова от корня
- Свободная ветвьни на ней, ни под ней нет букв
- Кратчайший кодсначала длина, затем значение; ведущие нули сохраняются
Проверьте себя
Ответь сначала сам, потом открой ответ.
01, Б — 000, В — 11. Какие ветви свободны?ОтветСкрыть ответ
001 и 10: под 0 заняты 01 и 000, под 1 — только 11.0, Б — 10, В — 110, Г — 111 прочитай 11010 и 1101. Какая из записей неполная?ОтветСкрыть ответ
11010 — ВБ: 110 | 10. Запись 1101 неполная: после 110 остаётся 1.1, Б — 000, В — 011 найди кратчайший код Г с наибольшим числовым значением.ОтветСкрыть ответ
010: свободны две вершины длины 3 — 001 и 010, коротких свободных нет; большее значение у 010.001. Можно ли записать ответ как 1?ОтветСкрыть ответ
1 — другой код длины 1, и он здесь занят.Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Кратчайший код Д
Алфавит содержит только А, Б, В, Г, Д. Известно: А — 00, Б — 01, В — 110, Г — 111. Найди кратчайший код Д.
Введите кодовое слово (последовательность из 0 и 1).
Подсказка
Проверяй длины по возрастанию: сначала 1, потом 2.
Решение
Коды длины 1 недопустимы — 0 начало 00 и 01, 1 начало 110 и 111; код 10 свободен.
Ответ: 10
Кратчайший код Г
Сообщения содержат только буквы А, Б, В, Г; А — 0, Б — 111, В — 101. Найди кратчайший код Г; если вариантов несколько, выбери код с наибольшим числовым значением.
Введите кодовое слово (последовательность из 0 и 1).
Подсказка
Среди кодов одной длины сравнивают числовые значения.
Решение
Свободны ровно две вершины длины 3 — 100 и 110, коротких свободных нет. Большее значение у 110.
Ответ: 110
Все коды длины 4
Для таблицы А — 1, Б — 000, В — 011 перечисли все коды длины 4, которые можно дать букве Г.
Введите коды через пробел в порядке возрастания.
Подсказка
У каждой свободной ветви длины 3 два продолжения длины 4.
Решение
0010, 0011, 0100, 0101: по два продолжения у каждой свободной ветви 001 и 010.
Ответ: 0010 0011 0100 0101
Кратчайший код П
Для кодирования некоторой последовательности, состоящей из букв К, Л, М, Н, П, решили использовать неравномерный двоичный код, удовлетворяющий условию Фано. Для букв К, Л, М, Н использовали соответственно кодовые слова 01, 001, 11, 100. Укажи кратчайшее возможное кодовое слово для буквы П. Если таких кодов несколько, укажи код с наименьшим числовым значением.
Введите кодовое слово (последовательность из 0 и 1).
Подсказка
Ведущие нули — часть кода.
Решение
Свободны 000 и 101, обе длины 3; меньшее значение у 000, ведущие нули сохраняем.
Ответ: 000
Кратчайший код К
По каналу связи передаются сообщения, содержащие только десять букв: А, Б, В, Г, Д, Е, Ж, З, И, К. Используется двоичный код, удовлетворяющий условию Фано. Для девяти букв кодовые слова известны: А — 000, Б — 0010, В — 0011, Г — 010, Д — 0110, Е — 100, Ж — 101, З — 1100, И — 111. Укажи кратчайшее кодовое слово для буквы К. Если таких кодов несколько, укажи код с наименьшим числовым значением.
Введите кодовое слово (последовательность из 0 и 1).
Подсказка
Найди свободные вершины дерева девяти кодов.
Решение
Свободны только 0111 и 1101, обе длины 4.
Ответ: 0111
Кратчайший код с наибольшим значением
Сообщения содержат только буквы Р, С, Т, У; используется двоичный код, удовлетворяющий условию Фано: Р — 1, С — 001, Т — 010. Укажи кратчайшее кодовое слово для буквы У. Если таких кодов несколько, укажи код с наибольшим числовым значением.
Введите кодовое слово (последовательность из 0 и 1).
Подсказка
Из кодов наименьшей длины выбери больший.
Решение
Свободны 000 и 011; из двух кодов длины 3 большее значение у 011.
Ответ: 011