ЕГЭ · Информатикаподготовка по заданиям
Задание 4 из 27Теория

Теоретические основы информатики · 1 балл

Коды и условие Фано

Декодирование сообщений

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

Теория целое число

Что проверяет

Двоичное кодирование, равномерные и неравномерные коды, условие Фано, дерево кодов.

Основание: проект спецификации и кодификатора КИМ 2027. Открыть документы

Теория

Что нужно знать

Задание 4 проверяет умение работать с двоичными кодами: проверять однозначность декодирования, строить дерево кодов и находить кратчайший допустимый код. В 2027 году формат прежний: 1 первичный балл, раздел «Теоретические основы информатики».

Минимум для задания 4

  • чем равномерный код отличается от неравномерного
  • прямое условие Фано и его проверку
  • обратное условие Фано и его проверку
  • правило «код — лист дерева»
  • как находить свободные кодовые слова
  • как считать длину закодированного слова
  • что коды нужны всем буквам алфавита, а не только слову
  • дополнительные ограничения: длина, чётность, числовое значение
  • как проверить код, исправляющий одну ошибку
  • формат ответа: число или код без пробелов

Код и декодирование

Кодирование сопоставляет каждому символу двоичное слово. При равномерном коде все слова одной длины, при неравномерном — разной. Неравномерный код короче, но требует однозначной расшифровки.

  • Кодовое слово — двоичная запись одного символа.
  • Сообщение — конкатенация кодовых слов, обычно без разделителей.
  • Однозначное декодирование — у любой двоичной строки не больше одного разбора на символы.
  • Равномерный код декодируется однозначно, если известны длины слов.
  • Для неравномерного кода нужна дополнительная проверка.

Условие Фано

Прямое условие Фано: никакое кодовое слово не является началом (префиксом) другого кодового слова. Этого достаточно, чтобы сообщение декодировалось однозначно слева направо.

  • Если код A — начало кода B, строка AB читается двумя способами.
  • Проверка: для каждой пары слов A и B выражение B.startswith(A) должно быть ложным.
  • Короткое слово запрещает все свои продолжения.
  • Проверять нужно все пары, а не только слова соседней длины.
A ≠ prefix(B) для всех A, Bпрефиксный код ⇒ однозначное декодирование

Обратное условие Фано

Обратное условие: никакое кодовое слово не является окончанием (суффиксом) другого. Такой код тоже декодируется однозначно, но удобнее читать сообщение с конца.

  • Проверка: для каждой пары A и B выражение B.endswith(A) должно быть ложным.
  • Удобный приём: перевернуть все коды и проверить обычное условие Фано.
  • Прямое и обратное условия независимы: набор может удовлетворять одному и нарушать другое.
  • В условии задачи всегда смотрите, какое именно условие указано.
A ≠ suffix(B) для всех A, Breverse(код) → прямое условие

Дерево кодирования

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

  • Корень — пустое слово.
  • Кодовое слово — отмеченный лист; ниже него других кодов быть не может.
  • Если слово занято, все его продолжения запрещены.
  • Полное дерево: у каждой внутренней вершины ровно два потомка.
  • Замена листа двумя потомками увеличивает число кодов на 1.
Σ 2^(−l_i) ≤ 1 — неравенство Крафта

Свободные коды

Свободная вершина — слово, которое само не является кодом и у которого нет кодового слова ни среди предков, ни среди потомков. Именно из свободных вершин выбирают новые коды.

  • Отметьте все известные коды.
  • Вычеркните все продолжения известных кодов.
  • Вычеркните предков известных кодов: они не могут быть кодами.
  • Оставшиеся вершины — кандидаты; самый короткий код имеет минимальную глубину.
  • Если нужен не один код, проверьте, что в поддереве хватает листьев.
  • Лист на глубине d при ограничении L даёт до 2^(L−d) кодов длины L.
N(L) = 2^(L−d)

Длина слова и частоты

Длина закодированного слова — сумма длин кодов его букв. Чтобы получить минимум, частые буквы кодируют короче, редкие — длиннее. Но сначала проверяют, какие свободные коды вообще допустимы.

  • Посчитайте частоту каждой буквы в слове.
  • Отсортируйте свободные коды по длине.
  • Назначьте самые короткие коды самым частым буквам.
  • Учитывайте буквы алфавита, которых нет в слове: им тоже нужны коды.
  • Если короткий код лишает места другим буквам, его использовать нельзя.
  • Итог: сумма произведений «частота × длина кода».
|word| = Σ f(c) · len(code(c))

Если алфавит задан целиком

В формулировках «передаются все буквы русского алфавита» или «алфавит состоит из букв …» код нужен каждому символу. Свободных коротких ветвей может не хватить, поэтому их резервируют под остальные буквы.

  • Посчитайте, сколько символов в алфавите и сколько кодов уже известно.
  • Оцените число свободных листьев на допустимой глубине.
  • Не занимайте единственную короткую ветвь, если она нужна нескольким буквам.
  • Буквы, которых нет в слове, всё равно должны получить коды.
  • Для всего русского алфавита удобно считать дерево от 33 листьев.

Дополнительные ограничения

В задании 4 добавляют условия на длину, чётность, числовое значение или помехоустойчивость. Они сужают список допустимых кодов, но не отменяют условие Фано.

  • «не более 4 знаков» — не спускайтесь ниже 4-го уровня дерева.
  • «чётное число единиц» — оставьте коды с чётным весом.
  • «наибольшее числовое значение» — сравнивайте int(code, 2).
  • «код исправляет одну ошибку» — расстояние Хэмминга не меньше 3.
  • «слово закодировано как …» — разбейте строку на коды известных букв.
  • После фильтра снова проверьте, что осталось место для остальных букв.

Разбор примера

Учебный пример: дерево кодов и слово ПОЗИЦИЯ

Известны коды П = 00, О = 1000, З = 1010, Ц = 01, Я = 110. Нужно найти минимальную длину слова ПОЗИЦИЯ, если код буквы И содержит чётное число единиц.

П Ц Я О З ? ? ? 00 01 110 111 1000 1001 1010 1011
  1. Строим дерево по известным кодам: 00 и 01 — листья, 1000, 1010 и 110 — тоже листья.
  2. Свободные вершины: 111, 1001 и 1011. Вершины 0, 1, 10, 11, 100 и 101 — внутренние, поэтому кодами быть не могут.
  3. Самая короткая свободная вершина — 111 (3 бита), но в ней три единицы, а нужно чётное число. Не подходит.
  4. Из оставшихся 1001 и 1011 чётное число единиц только у 1001: две единицы. Значит, И = 1001.
  5. Считаем длину: П 2 + О 4 + З 4 + И 4 + Ц 2 + И 4 + Я 3 = 23.

Ответ23

Способы решения

Выберите метод под формулировку

Методы собраны по решениям задания 4 из базы Kompege. Начните с того, что именно нужно найти в условии.

01

когда известны коды нескольких букв

Дерево кодов и свободные вершины

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

  1. Нарисуйте дерево и разведите известные коды по ветвям 0 и 1.
  2. Отметьте кодовые слова как листья.
  3. Запретите все продолжения этих слов.
  4. Выпишите свободные вершины по возрастанию длины.
  5. Отбросьте кандидатов, которые не подходят под дополнительные условия.
  6. Выберите самый короткий код и проверьте, что он не ломает коды остальных букв.

Пример

Коды А = 0, Б = 10, В = 110. Ветвь 0 занята, в ветви 1 свободна только вершина 111. Значит, следующий код — 111. Если нужны две новые буквы, 111 разбивают на 1110 и 1111.

Ответ111; для двух букв — 1110 и 1111.

По мотивам задач № 16677 и № 10917.

02

когда нужно закодировать слово целиком

Частоты букв и минимальная длина

Когда использовать: Даны известные коды, нужно найти минимальную длину заданного слова.

  1. Выпишите известные коды и их длины.
  2. Посчитайте частоты букв в слове.
  3. Найдите все свободные коды, которые можно использовать.
  4. Отсортируйте их по длине.
  5. Назначьте короткие коды частым буквам, длинные — редким и отсутствующим в слове.
  6. Проверьте, что для всех букв алфавита хватает кодов.
  7. Сложите частоты, умноженные на длины кодов.

Пример

В задаче № 10917 известны коды Ш = 1100, Л = 001, Д = 0000, Р = 101, Е = 1001; слово ШАКАЛ. Свободные коды: 01 (2 бита), 111 (3 бита), 0001, 1000 и 1101 (по 4 бита). Буква А встречается дважды, поэтому получает 01; К — 111; О, которой нет в слове, — 0001. Длина: 4 + 2 + 3 + 2 + 3 = 14.

Ответ14

По мотивам задачи № 10917 (база Kompege).

03

когда нужно проверить набор кодов

Проверка условия Фано

Когда использовать: Дан набор кодов, нужно понять, можно ли его использовать и какие слова конфликтуют.

  1. Выпишите все коды.
  2. Для каждой пары проверьте, не является ли одно слово началом другого.
  3. Если да — код не префиксный, однозначность не гарантирована.
  4. Проверьте обратное условие, если оно указано в задаче.
  5. При добавлении нового кода проверьте его со всеми старыми.
  6. Помните: занятое слово запрещает все свои продолжения.

Пример

Коды 0, 10, 110 и 111 условие Фано выполняют: ни одно из слов не является началом другого. А код 11 добавить нельзя: 11 — начало слов 110 и 111.

ОтветКод 11 недопустим.

По мотивам задачи № 16677.

04

когда сказано «обратное условие»

Обратное условие Фано

Когда использовать: В задаче явно указано обратное условие Фано или код нужно читать с конца.

  1. Выпишите известные коды.
  2. Переверните каждое кодовое слово.
  3. Постройте дерево для перевёрнутых слов.
  4. Найдите свободные ветви и подберите код.
  5. Переверните выбранный код обратно.
  6. Проверьте, что ни один код не является окончанием другого.

Пример

Коды А = 0, Б = 01, В = 011 удовлетворяют обратному условию. После переворота получаем 0, 10, 110; свободна вершина 111. Чтобы добавить две буквы, разбиваем 111 на 1110 и 1111 и переворачиваем обратно: 0111 и 1111.

ОтветГ = 0111, Д = 1111.

По мотивам задачи № 25756.

05

когда в условии есть дополнительное правило

Ограничения: длина, чётность, числовое значение

Когда использовать: Сказано «не более N знаков», «чётное число единиц», «наибольшее числовое значение» и т. п.

  1. Постройте дерево и найдите свободные вершины.
  2. Отбросьте вершины глубже разрешённой длины.
  3. Если нужно несколько кодов, посчитайте листья в поддереве: 2^(L−d).
  4. Примените дополнительное условие к каждому кандидату.
  5. Для числового значения сравните int(code, 2).
  6. Проверьте, что выбранный код не лишает остальные буквы кодов.

Пример

В задаче № 12678 код А = 0, Б = 10, длина кода не больше 4. Свободна ветвь 11; на глубине 2 она даёт до 2^(4−2) = 4 кода длины 4. Значит, добавить можно максимум 4 буквы.

Ответ4

По мотивам задачи № 12678 (база Kompege).

06

универсальный способ

Перебор на Python

Когда использовать: Много свободных ветвей или несколько ограничений — вручную легко запутаться.

  1. Запишите известные коды в словарь.
  2. Напишите проверку: новый код не является началом и не имеет начала среди известных.
  3. Переберите слова нужной длины через product("01", repeat=L).
  4. Отфильтруйте кандидатов по дополнительным условиям.
  5. Для каждого кандидата посчитайте длину слова.
  6. Выведите минимум и сам код.

Пример

Тот же учебный пример: находим код буквы И с чётным числом единиц.

from itertools import product

codes = {"П": "00", "О": "1000", "З": "1010", "Ц": "01", "Я": "110"}
word = "ПОЗИЦИЯ"

def ok(code):
    return all(not c.startswith(code) and not code.startswith(c) for c in codes.values())

best = None
for L in range(1, 7):
    for p in product("01", repeat=L):
        code = "".join(p)
        if not ok(code) or code.count("1") % 2:
            continue
        total = sum(len(codes.get(ch, code)) for ch in word)
        if best is None or total < best[0]:
            best = (total, code)

print(best)  # (23, '1001')

Ответ23, код И = 1001.

Шаблон по мотивам решений задач № 14299, 22485 и 25756.

07

когда считают расстояние Хэмминга

Код, исправляющий одну ошибку

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

  1. Выпишите известные кодовые слова.
  2. Для каждой пары посчитайте число позиций, в которых они различаются.
  3. Чтобы исправлять одну ошибку, расстояние должно быть не меньше 3.
  4. Переберите кандидатов нужной длины.
  5. Оставьте те, что отличаются от каждого известного слова не менее чем в 3 позициях.
  6. Если кандидатов несколько, выберите с минимальным числовым значением.

Пример

В задаче № 17084 известны коды 11010, 00110 и 10101. Для пятибитового кода единственный кандидат — 01001: он отличается от известных слов в 3, 4 и 3 позициях соответственно.

Ответ01001 (числовое значение 9).

По мотивам задачи № 17084 (база Kompege).

Шпаргалка: формулировка → метод

В условииЧто делать
«какое количество двоичных знаков для слова»сумма «частота × длина кода»
«найдите код для буквы»дерево и свободные вершины
«оставшиеся буквы / суммарная длина»не забыть про все буквы алфавита
«условие Фано»ни один код не является началом другого
«обратное условие Фано»перевернуть коды и проверить как обычное
«не более N знаков»ограничить глубину; лист даёт 2^(N−d) кодов
«чётное число единиц»фильтр по количеству единиц
«наибольшее/наименьшее числовое значение»сравнить int(code, 2)
«исправляет одну ошибку»расстояние Хэмминга ≥ 3
«слово закодировано как …»разбить строку на коды известных букв

По базе Kompege: 1 032 задачи, 27 решений (25 текстовых и 2 программных) и 228 видеоразборов по заданию 4. При подготовке методов использованы решения задач № 10917, 12678, 14299, 16677, 17084 и 25756; примеры переработаны в учебные.

Разборы из видео

Задачи, которые разбирают в курсе

Условия и код показаны в кадре в конце соответствующего фрагмента. Источники задач — КомпЕГЭ, сайт К. Полякова, ФИПИ и другие.

№ 110

разбор из видео · 2025

Минимальная общая длина кодовых слов

Передаются сообщения из семи букв: А, Б, В, Г, Д, Е, Ж. Код удовлетворяет условию Фано. Для А используется код 1, для Б — 01. Найдите минимальную общую длину кодовых слов для всех семи букв.

Ответ25

Полный архив

Все фрагменты видеоразборов

По одному пункту на каждую главу: условие или код из кадра, ответ и ссылка. Источники задач — КомпЕГЭ, сайт К. Полякова, ФИПИ и другие; номер берётся из кадра. Текст с экрана распознан автоматически, служебные строки и артефакты удалены; если текст нечитаем, остаются название, таймкод и ссылка.

Показать все фрагменты (12)
2025 · 00:00 Приветствие

В этом фрагменте — теория или пояснение; решение показано в видео.

2025 · 02:05 Про неравномерное кодирование

В этом фрагменте — теория или пояснение; решение показано в видео.

2025 · 16:30 Поиск кратчайшего кодового слова I

118) Для кодирования некоторой последовательности, состоящей из букв А, Б, В, Г, Д, Е, Ж решили использовать неравномерный двоичный код, удовлетворяющий условию Фано. Для букв А, Б, В, Г использовали соответственно кодовые слова 000, 1, 010, 011. Укажите кратчайшее возможное кодовое слово для буквы Д, при котором код будет допускать однозначное декодирование. Если таких кодов несколько, укажите код с наименьшим числовым значением.

2025 · 24:50 Поиск кратчайшего кодового слова II

118) Для кодирования некоторой последовательности, состоящей из букв А, Б, В, Г, Д, Е, Ж решили использовать неравномерный двоичный код, удовлетворяющий условию Фано. Для букв А, Б, В, Г использовали соответственно кодовые слова 000, 1, 010, 011. Укажите кратчайшее возможное кодовое слово для буквы Д, при котором код будет допускать однозначное декодирование. Если таких кодов несколько, укажите код с наименьшим числовым значением.

2025 · 30:10 Минимальная длина кодовых слов I

В этом фрагменте — теория или пояснение; решение показано в видео.

2025 · 36:15 Поиск кратчайшего кодового слова III (весь алфавит)

В этом фрагменте — теория или пояснение; решение показано в видео.

2025 · 42:10 Минимальная длина кодовых слов II

В этом фрагменте — теория или пояснение; решение показано в видео.

2025 · 46:20 Минимальная длина слова I

В этом фрагменте — теория или пояснение; решение показано в видео.

2025 · 54:30 Минимальная длина слова II

В этом фрагменте — теория или пояснение; решение показано в видео.

2025 · 1:00:50 Подбор кодовых слов I

В этом фрагменте — теория или пояснение; решение показано в видео.

2025 · 1:04:30 Подбор кодовых слов II

В этом фрагменте — теория или пояснение; решение показано в видео.

2025 · 1:10:30 Окончание и напутствия

В этом фрагменте — теория или пояснение; решение показано в видео.

Типичные ошибки

  • нарушается префиксность
  • забывается обратное условие
  • рассматриваются не все свободные ветви
  • путаются код и сообщение

Ключевые формулы

  • A ≠ prefix(B) — прямое условие Фано
  • A ≠ suffix(B) — обратное условие Фано
  • |word| = Σ f(c) · len(code(c))
  • Σ 2^(−l_i) ≤ 1 — неравенство Крафта

Практика

Навигатор и методические рекомендации опубликованы в 2026 году: номера заданий в них могут отличаться от нумерации 2027 года. Ориентируйтесь на тему.