Задание 4 ЕГЭ: кодовые слова и условие Фано
Буквам назначают последовательности из нулей и единиц: например, А → 00, Б → 01, В → 1. Длины кодов могут различаться. В этих задачах нужно дополнить кодовую таблицу так, чтобы сообщение можно было однозначно читать слева направо.
У слов 01 и 010 конфликт: прочитав 01, ещё нельзя понять, закончилась буква или нужно читать следующий 0. А 010 и 011 совместимы: ни одно целиком не стоит в начале другого.
| Пара кодов | Проверка | Результат |
|---|---|---|
0 и 01 | 0 — начало 01 | Конфликт |
00 и 0011 | 00 — начало 0011 | Конфликт |
010 и 011 | Общий участок 01 разрешён; целые коды различаются | Можно |
1000 и 1001 | Различаются последним битом | Можно |
01 и 01 | Одинаковый код для разных букв | Нельзя |
Дерево помогает увидеть все эти отношения сразу. Готовые кодовые слова отмечаем буквами в конечных вершинах — листьях. Общие начала слов остаются внутренними вершинами.
Как строить двоичное дерево по кодам
- Нарисуй корень. Это старт до чтения битов. У корня пока нет кода и нет буквы.
- Договорись о направлениях: ребро 0 идёт налево, ребро 1 — направо. На каждом шаге читай ровно один бит.
- Для А = 00 пройди из корня 0 → 0. В конце поставь А. Длина 2 — это два ребра, а не количество нарисованных вершин.
- Для C = 010 вернись к корню, пройди 0 → 1 → 0. Начальную ветвь 0 используй ту же самую. Поставь C только в конце пути.
- Для D = 011 снова начни от корня. Путь 0 → 1 уже существует; добавь правое ребро 1 и подпиши D.
- Проверь листья. Из вершины с готовой буквой больше не проводи ветви: любой код ниже неё нарушит условие Фано.
Четыре состояния вершины
| Состояние | Пример в дереве выше | Можно назначить новую букву? |
|---|---|---|
| Готовый лист | 00, 010, 011 | Нет: код уже занят |
| Развилка над готовыми кодами | 0, 01 | Нет: новый код станет началом существующего |
| Потомок готового листа | 000 под A = 00 | Нет: существующий код станет началом нового |
| Свободная ветвь | 1 и её продолжения | Да, с учётом остальных новых букв |
«Вершина не подписана» ещё не значит «свободна». Сначала проверь, нет ли готовой буквы выше по пути и нет ли уже назначенных букв ниже.
Интерактивный тренажёр двоичного дерева
Выбери режим. Проходи путь кнопками 0 и 1 либо введи код вручную, затем закрепи за ним букву. В дереве можно выбирать вершины мышью или клавишами Tab и Enter. На узком экране прокрути схему в сторону.
Ведущие нули сохраняются. Пустой путь от корня не считается кодовым словом.
Подсказка для текущего режима
Учебное поле показывает пути длиной до 6 бит. Это ограничение тренажёра: в математической задаче коды могут быть длиннее, если условие не задаёт предел.
Как найти кратчайшее кодовое слово
| Буква | Код | Буква | Код |
|---|---|---|---|
| A | 00 | F | 1001 |
| B | ? | S | 1100 |
| C | 010 | X | 1010 |
| D | 011 | Y | 1101 |
| E | 1011 | Z | 111 |
Шаг 1. Построй известные пути
Начни с короткого A = 00: вся область под 00 сразу закрыта. Затем добавь C = 010 и D = 011. В правой половине дерева разложи коды 1001, 1010, 1011, 1100, 1101 и 111.
Шаг 2. Ищи свободную вершину по уровням сверху вниз
| Длина | Кандидаты | Почему не подходят |
|---|---|---|
| 1 | 0, 1 | Оба являются началами готовых кодов |
| 2 | 00, 01, 10, 11 | 00 занят; остальные ведут к готовым кодам |
| 3 | 000, 001 | Находятся под готовым A = 00 |
| 3 | 010, 011, 111 | Уже заняты буквами C, D и Z |
| 3 | 100, 101, 110 | Являются началами готовых четырёхбитных кодов |
| 4 | 1000 | Свободен: нет готового кода ни выше, ни ниже |
Шаг 3. Закрепи B = 1000 и проверь оба направления
Ни один известный код не является началом 1000. Само 1000 тоже не является началом известного кода. Соседний F = 1001 не мешает: общая развилка 100 разрешена.
Если кратчайших вариантов несколько
Пусть известны только 00 и 11. Код длины 1 невозможен, а на длине 2 свободны 01 и 10. Выбираем 01: при равной длине он меньше 10. Проверять удобно слева направо: 00, 01, 10, 11.
Не превращай строку 01 в 1: ведущий ноль — часть пути, поэтому эти два кода находятся в разных вершинах.
Как получить минимальную суммарную длину
Шаг 1. Найди область для всех новых букв
Любой новый код начинается с 10. Но если сразу закрепить 10 за одной буквой, остальные три уже не поместятся: вся оставшаяся свободная область окажется под готовым листом.
Шаг 2. Преврати одну свободную ветвь в четыре листа
- Раскрой 10 в две дочерние вершины: 100 и 101.
- Раскрой 100: получатся 1000 и 1001.
- Раскрой 101: получатся 1010 и 1011.
- Назначь четырём листьям Д, Е, Ж и З в любом порядке. Каждая буква получила по 4 бита.
Почему короткий код для одной буквы может ухудшить сумму
Можно закрепить Д = 100 и разместить остальные три буквы глубже в соседней ветви. Условие Фано не запрещает такое дерево. Например:
| Буква | Код | Длина |
|---|---|---|
| Д | 100 | 3 |
| Е | 1010 | 4 |
| Ж | 10110 | 5 |
| З | 10111 | 5 |
3 + 4 + 5 + 5 = 17. Выиграли один бит на первой букве, но потеряли по одному биту на двух других.
Короткое доказательство минимума 16
Ветка 10 должна разойтись и налево, и направо. Если все четыре кода отправить в одну её половину, у всех появится лишний общий бит: его можно убрать и уменьшить сумму.
- Две буквы в 100 и две в 101. В каждой половине два разных кода требуют хотя бы ещё по одному биту. Итого все четыре имеют длину не меньше 4: сумма минимум 16, и наш вариант её достигает.
- Одна буква в одной половине и три в другой. Первую выгоднее сделать кодом длины 3. Для трёх остальных кратчайшие добавочные пути внутри соседней половины имеют длины 1, 2, 2: один дочерний лист и два в другой дочерней ветви. Полные длины получаются 4, 5, 5. Сумма минимум 17.
Распределение 3 + 1 симметрично. Других распределений четырёх букв по двум используемым половинам нет. Поэтому сумма меньше 16 невозможна.
Здесь минимизируется сумма длин четырёх кодов, каждый учитывается один раз. Если условие спрашивает длину конкретного сообщения, учитывай число повторений каждой буквы: код длины 3, встречающийся 5 раз, даст 15 бит.
Десять упражнений по деревьям и кодам
После ошибки измени ответ и проверь снова. В кодах сохраняй начальные нули.
Решено: 0 из 10
1. Длина пути
Сколько рёбер нужно пройти от корня для кода 0101?
2. Общий префикс
Могут ли одновременно быть кодами двух букв 010 и 011? Ответь «да» или «нет».
3. Продолжение готового кода
Есть A = 00. Можно ли назначить другой букве код 001? Ответь «да» или «нет».
4. Код над готовым листом
Есть C = 010. Можно ли назначить другой букве код 01? Ответь «да» или «нет».
5. Выбор при равной длине
Заданы только коды 00 и 11. Найди кратчайший новый код; при равенстве длин выбери наименьшее числовое значение. Сохрани ведущий ноль.
6. Первый разбор
Какой кратчайший код нужно назначить B в первом полном примере?
7. Оставшаяся область
Известны 000, 001, 01 и 11. С каких двух битов начинаются все новые коды?
8. Считаем сумму
Четырём новым буквам назначены коды 1000, 1001, 1010 и 1011. Какова сумма длин только новых кодов?
9. Допустимый, но более длинный вариант
Чему равна сумма длин кодов 100, 1010, 10110 и 10111?
10. Читаем сообщение по дереву
Даны A = 00, B = 01, C = 1. Расшифруй сообщение 00011 латинскими буквами без пробелов.
Видео по заданию №4
Видео скоро выйдет.
Алгоритм решения задания 4
- Выпиши известные коды, не теряя ведущие нули.
- Построй единое дерево: 0 влево, 1 вправо; буква ставится только в конце своего пути.
- Закрой продолжения готовых листьев. Не назначай буквы вершинам над ними.
- Если нужна одна буква, ищи свободный код по уровням от коротких к длинным.
- Если нужны несколько букв, оставь достаточно свободных листьев и сравни суммарную длину всего нового набора.
- Проверь все новые коды друг с другом и с известными: нет совпадений и ни один не является началом другого.
- Запиши то, что спрашивается: само кодовое слово, его длину, сумму длин или длину сообщения.
Частые вопросы о двоичных деревьях
Почему нельзя взять любую вершину без буквы?
Она может быть развилкой над уже готовым кодом или находиться ниже готового листа. Оба случая нарушают условие Фано. Свободна только область без готовых кодов на пути сверху и в продолжениях снизу.
Общий префикс у двух кодов всегда запрещён?
Нет. У 1000 и 1001 есть общий участок 100 — это разрешено. Запрещено, когда один целый код является началом другого, как 100 и 1001.
Можно ли продолжить готовый лист ещё двумя ветвями?
Только если снять с него букву. Известные коды менять нельзя, поэтому под готовым кодом из условия новые буквы не размещаем.
Минимальная сумма всегда получается у кодов одной длины?
Нет. Всё зависит от свободных ветвей и числа букв. Для трёх букв в одной свободной области кратчайшие добавочные пути могут быть 0, 10 и 11: их длины различаются. В примере с четырьмя буквами под 10 оптимальны четыре пути одинаковой длины.
Можно ли перепутать 01 и 1?
Нет: это разные пути и разная длина. В поле ответа вводи код целиком, включая все начальные нули.
Как декодировать сообщение по дереву?
Начни от корня, читай биты по одному и двигайся по рёбрам. Дошёл до буквы — выпиши её и вернись в корень для следующего бита. При условии Фано готовая буква не будет началом другой.
Закрепи двоичные коды в учебнике
Теорию кодирования и полный разбор задания 4 ЕГЭ можно найти в учебнике на сайте. После тренажёра переходи к самостоятельным задачам в практике.