Теория: кодирование, декодирование и условие Фано
Кодирование — это перевод информации с одного языка на другой (например, с «человеческого» на двоичный).
Декодирование — обратный процесс. Один символ исходного текста может соответствовать одному или нескольким символам в коде, и наоборот.
Равномерный и неравномерный код
- Равномерный код — все символы имеют одинаковую длину кода.
- Неравномерный код — длины кодовых слов разные, что делает передачу информации более эффективной, но требует дополнительного условия для однозначной расшифровки.
Условие Фано
Никакое кодовое слово не является началом другого кодового слова.
Если это условие выполняется, сообщение можно расшифровать однозначно, двигаясь слева направо по последовательности битов.
Условие Фано — достаточное, но не обязательное для однозначного декодирования.
Чтобы проверить его, удобно построить дерево кодирования.
(начало)
/ \
0 1
/ \ / \
00 01 10 11
В листьях дерева (узлы без продолжений) располагаются коды символов. Если все используемые коды — листья дерева, условие Фано выполняется.
Простое задание: выбор кода по условию Фано
Условие:
Для кодирования букв Л, М, Н, П, Р используется неравномерный двоичный код, удовлетворяющий условию, что никакое кодовое слово не является началом другого.
Известно:
Л — 00, М — 01, Н — 11.
Нужно выбрать кратчайший возможный код для буквы П, чтобы условие Фано сохранялось.
Если таких кодов несколько — выбрать код с наименьшим числовым значением.
Пошаговое решение
1. Построим дерево по имеющимся кодам:
(начало)
/ \
0 1
/ \ \
00 01 11
Л М Н
Коды 00, 01 и 11 заняты. Свободна ветка 10 — она пока не используется.
2. Поскольку нам нужно добавить две буквы (П и Р), «навешиваем» их на ветку 10, создавая два подуровня:
(начало)
/ \
0 1
/ \ / \
00 01 10 11
Л М / \
100 101
П Р
3. Таким образом, оба новых слова (100 и 101) не пересекаются с другими.
Ответ: 100 — кратчайший возможный код с наименьшим числовым значением.
Комментарий: если попробовать короче (например, «10»), нарушится условие Фано, ведь «10» будет началом для кодов «100» и «101» — а значит, однозначное декодирование станет невозможным.
Задание посложнее: подсчёт количества возможных кодов
Условие:
Все заглавные буквы русского алфавита закодированы неравномерным двоичным кодом, где никакое кодовое слово не является началом другого (условие Фано).
Известные коды:
И — 110
Н — 011
Ф — 00
О — 1111
Р — 11100
М — 11101
А — 1001
Т — 101
К — 1000
Сколько существует способов назначить для буквы Ю код длиной ≤ 6 бит, чтобы условие Фано сохранялось?
1. Строим дерево кодов
(начало)
/ \
0 1
/ \ / \
00 01 10 11
Ф Н / \ / \
(конец) ... ...
Наносим все известные коды; «занятые» узлы — это листья, на которых уже размещены буквы:
Ф — 00 А — 1001
Н — 011 К — 1000
И — 110 Т — 101
О — 1111 Р — 11100
М — 11101
Промежуточное дерево (занятые листья отмечены ✦):
(начало)
/ \
0 1
/ \ / \
00✦ 01✦ 10✦ 11
/ | | \
100✦101✦110✦111
/ \
1110✦1111✦
Узлы, помеченные ✦, заняты. Новые коды могут размещаться только там, где ветвь ещё свободна.
2. Свободные ветви
- Из ветви «0»: после 00 и 01 свободно — ничего (всё занято).
- Из ветви «1»: свободных мест нет на глубинах ≤ 5, кроме подветвей, не ведущих к занятым листьям.
Чтобы не нарушить условие Фано, новый код не должен быть ни началом, ни продолжением уже имеющегося кода.
Проверив все возможные сочетания длиной ≤ 6 бит, получаем 14 возможных вариантов.
Ответ: 14
Пояснение подсчёта
Методически можно записать все коды длиной ≤ 6, затем исключить:
- те, что начинаются с уже существующих кодов (например, 00*, 01*, 100*, 101*, 110*, 11100*, 11101*, 1111*);
- и те, которые являются префиксами существующих кодов.
Оставшиеся 14 — допустимые.
Мини-практика для учеников
- Постройте дерево для кодов из первого примера самостоятельно. Проверьте, где появляются листья, а где — внутренние узлы.
- Попробуйте добавить новую букву С, выбрав для неё код, который не нарушает условие Фано.
- Для второго примера создайте таблицу всех допустимых кодов длиной ≤ 6, вычеркнув запрещённые префиксы, чтобы убедиться, что остаётся ровно 14 вариантов.
🧩 Проверь себя: контрольные вопросы и мини-задания
Закрепи теорию по теме «Кодирование информации и условие Фано» перед решением заданий ЕГЭ № 4.
🧠 Вопросы по теории
- Что такое кодирование и декодирование информации?
Объясните, зачем переводить данные с «человеческого языка» на двоичный код. - Чем отличается равномерное кодирование от неравномерного?
Приведите пример алфавита из трёх символов и покажите различие. - Что означает условие Фано и какую проблему оно решает?
Почему без этого условия возможна неоднозначная расшифровка? - Можно ли составить неравномерный код без выполнения условия Фано, но при этом допускающий однозначное декодирование?
(Подумайте, в каких случаях это возможно.) - Как проверить выполнение условия Фано?
Опишите пошагово, что нужно сравнивать между кодами.
🧩 Мини-задания для тренировки
- Построение дерева:
Постройте дерево кодирования для символов:
А — 0, Б — 10, В — 110, Г — 111.
Проверяется ли условие Фано? - Поиск ошибки:
Даны коды X — 0, Y — 10, Z — 101.
Нарушено ли условие Фано? Как можно исправить? - Мини-расшифровка:
Алфавит: A — 0, B — 10, C — 11.
Расшифруйте сообщение:0110110. - Дополни код:
Для букв К, Л, М заданы коды 00, 01, 10.
Подберите коды для Н и П так, чтобы выполнялось условие Фано. - Оптимизация длины:
Почему часто выгодно давать короткие коды символам, встречающимся чаще?
Придумайте пример пяти символов с разной частотой и подходящими длинами кодов.
Совет: проверяя условие Фано, рисуйте дерево кодирования.
Если каждая буква — в отдельном «листке» дерева, значит, код однозначно декодируется.
Задания на закрепление
Простой уровень
- https://kompege.ru/task?id=3
- https://kompege.ru/task?id=48 Смотреть разбор
- https://kompege.ru/task?id=109
- https://kompege.ru/task?id=112
- https://kompege.ru/task?id=114 Смотреть разбор Вариант2
Средний уровень
- https://inf-ege.sdamgia.ru/problem?id=75241
- https://inf-ege.sdamgia.ru/problem?id=76701
- https://inf-ege.sdamgia.ru/problem?id=76219 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=11341 Смотреть разбор
Сложный уровень
- https://kompege.ru/task?id=2697
- https://kompege.ru/task?id=712
- https://kompege.ru/task?id=296
- https://kompege.ru/task?id=19408
- https://kompege.ru/task?id=18944
- https://kompege.ru/task?id=18914
- https://kompege.ru/task?id=18360
- https://kompege.ru/task?id=18259
- https://kompege.ru/task?id=18161
- https://kompege.ru/task?id=18129
- https://kompege.ru/task?id=16251
- https://kompege.ru/task?id=14322
- https://kompege.ru/task?id=13819
- https://kompege.ru/task?id=12093
- https://inf-ege.sdamgia.ru/problem?id=75241
- https://inf-ege.sdamgia.ru/problem?id=76701
- https://inf-ege.sdamgia.ru/problem?id=76219
- https://education.yandex.ru/ege/task/296001ef-6ea0-4cee-b6b8-61e662fd9ed0
