ОГЭ · Информатика · Кодирование и измерение информации (задания 1, 2)
Задание 2: префиксный код и условие Фано
Второе задание — декодирование двоичной последовательности по префиксному коду. Ключ к однозначности — условие Фано.
- ⚠Разбивают цепочку наугад, а не слева направо по кодовым словам
- ⚠Не проверяют, что код префиксный (иначе разбиение неоднозначно)
- ⚠Теряют или добавляют один бит при переписывании последовательности
Префиксные коды
Определение
Префиксный код — код, в котором ни одно кодовое слово не является началом (префиксом) другого. Благодаря этому двоичную последовательность можно декодировать однозначно
Определение
Условие Фано — достаточное условие однозначного декодирования: ни один код не совпадает с началом другого кода. Если оно выполнено — разбиение всегда одно
Как работать с кодом
- • идём слева направо
- • накапливаем биты, пока не совпадут с кодом буквы
- • выписываем букву, обнуляем накопитель
- • повторяем до конца строки
- • выписываем все кодовые слова
- • проверяем: ни один не начинает другой
- • если да — код префиксный, декод однозначен
Различай прямое и обратное условие Фано. Прямое: ни один код не является началом другого. Обратное: ни один код не является окончанием другого — оно тоже гарантирует однозначность.
Условие Фано и почему код читается однозначно
Задание 2 всегда про префиксный код: ни одно кодовое слово не является началом другого. Смысл этого требования виден только на примере. Если бы А = 0, а Б = 01, то, встретив в потоке «01», нельзя было бы сказать, прочитали мы Б или А и начало чего-то ещё. Условие Фано запрещает такие пары, и тогда декодировать можно слева направо без возвратов: читаешь биты по одному, и как только набранная цепочка совпала с каким-то кодовым словом, это точно оно, дальше можно не сомневаться. Отсюда и рабочий приём: не пытайся угадать разбиение целиком, а иди по одному биту, каждый раз сверяясь с таблицей. Обратная задача — построить код — решается тем же правилом: если короткое слово уже занято (например, 0), все остальные обязаны начинаться с 1. Поэтому у префиксных кодов часто получается «лестница»: 0, 10, 110, 1110, 1111. Такой набор удобно проверять кодовым деревом: буквы висят только на листьях, и ни одна не сидит в развилке.
Разбор примера
Задание 2: декодировать последовательность
По каналу связи передаются сообщения, содержащие только заглавные русские буквы. Для кодирования используется двоичный префиксный код: А — 0, Б — 10, В — 110, Г — 1110, Д — 1111. Расшифруйте последовательность 1110011010 01111, зная, что в ней шесть букв. Пробелы поставлены для удобства чтения.
Показать решение по шагам
- 1. Склеиваем поток без пробелов: 111001101001111. Читаем слева направо по одному биту.
- 2. 1 — нет такой буквы; 11 — нет; 111 — нет; 1110 = Г. Остаток: 01101001111.
- 3. 0 = А. Остаток: 1101001111. Далее 1 — нет; 11 — нет; 110 = В. Остаток: 1001111.
- 4. 10 = Б. Остаток: 01111. 0 = А. Остаток: 1111 = Д.
- 5. Получилось ГАВБАД — ровно шесть букв, как обещано в условии. Совпадение числа букв — главная проверка: если букв вышло больше или меньше, где-то отрезан не тот кусок.
Ответ: ГАВБАД
Разбор примера
Задание 2: достроить код так, чтобы условие Фано выполнялось
Для кодирования букв А, Б, В, Г используется неравномерный двоичный код. Известно: А — 0, Б — 10, В — 110. Какое из кодовых слов можно взять для буквы Г, чтобы код остался префиксным: 1) 11; 2) 1100; 3) 111; 4) 0110?
Показать решение по шагам
- 1. Проверяем каждый вариант на условие Фано: кодовое слово не должно быть началом другого и другие не должны быть его началом.
- 2. 1) 11 — является началом слова В (110). Нельзя.
- 3. 2) 1100 — начинается со 110, то есть В является его началом. Нельзя.
- 4. 3) 111 — сравниваем с 0, 10, 110: ни одно из них не начинается с 111, и 111 не начинается ни с одного из них (после 1 идёт 1, а у Б после 1 идёт 0; у В третий бит 0, а здесь 1). Подходит.
- 5. 4) 0110 — начинается с 0, а это код буквы А. Нельзя.
- 6. Ответ 3. Приём: проверяй пары в обе стороны, иначе легко пропустить случай, где новое слово длиннее старого.
Ответ: 3
Разбор примера
Задание 2: сколько битов нужно на сообщение
Буквы кодируются префиксным кодом: А — 0, Б — 10, В — 110, Г — 111. Сколько битов займёт закодированное сообщение БАГАВ?
Показать решение по шагам
- 1. Выписываем код каждой буквы по порядку: Б = 10, А = 0, Г = 111, А = 0, В = 110.
- 2. Склеиваем: 10 + 0 + 111 + 0 + 110 = 1001110110.
- 3. Считаем длину: 2 + 1 + 3 + 1 + 3 = 10 бит.
- 4. Смысл неравномерного кода: при равномерном кодировании четырёх букв нужно по 2 бита на каждую, то есть 10 бит на пять букв — столько же. Выигрыш появляется, когда частые буквы получают короткие коды: в тексте, где А встречается вдвое чаще остальных, такой код будет экономнее равномерного.
Ответ: 10
Разбор примера
Файл-ответ decode.py (формат задания 16): программа, которая декодирует сама
Соберите программу, которая по таблице префиксного кода расшифровывает двоичную последовательность. Файл сохраняется как decode.py — в задании 16 сдают именно файл с текстом программы, язык любой.
Показать решение по шагам
- 1. Замысел: идём по потоку слева направо, копим биты в буфер; как только буфер совпал с каким-то кодовым словом, выводим букву и очищаем буфер. Так работает свойство префиксного кода — возвращаться назад не нужно.
- 2. Код целиком (Python):
code = {'0': 'А', '10': 'Б', '110': 'В', '1110': 'Г', '1111': 'Д'}/s = input()/buf = ''/res = ''/for bit in s:/buf = buf + bit/if buf in code:/res = res + code[buf]/buf = ''/print(res). - 3. Трассировка на входе 111001101001111: buf растёт 1 → 11 → 111 → 1110 (совпало, res = «Г», buf пуст) → 0 (совпало, res = «ГА») → 1 → 11 → 110 (совпало, «ГАВ») → 1 → 10 (совпало, «ГАВБ») → 0 (совпало, «ГАВБА») → 1 → 11 → 111 → 1111 (совпало, «ГАВБАД»).
- 4. Что проверить перед сдачей: после цикла буфер обязан оказаться пустым. Если в нём что-то осталось, поток декодирован не до конца — значит, либо в последовательности ошибка, либо таблица кода неполная. Полезно добавить строку
if buf: print('остаток:', buf)для себя, но в сдаваемом файле оставить один итоговый вывод, как требует задание 16. - 5. Как сохранять: обычный текстовый файл с расширением .py; эксперт читает текст программы, а не запускает её, поэтому важнее всего, чтобы алгоритм читался однозначно.
Ответ: decode.py: буфер битов, сверка со словарём кода, вывод одной строки
ℹ️ Спецификация КИМ ОГЭ-2026 по информатике: «Решением каждого задания части 2 является отдельный файл, подготовленный в соответствующей программе (текстовом редакторе или электронной таблице)». Линии 13–16 дают 9 баллов из 21 и забирают 105 минут из 150, а проверяет их человек. Поэтому в каждом уроке есть готовый файл-ответ: не описание словами, а то, что можно набрать и запустить.
Задание №2 в формате экзамена
Ответить и проверить себя — после бесплатной регистрации.
Задание №2 в формате экзамена
Ответить и проверить себя — после бесплатной регистрации.
Задание №2 в формате экзамена
Ответить и проверить себя — после бесплатной регистрации.
Линия 2 спрашивает в три стороны
Три разбора выше — декодирование: дана цепочка нулей и единиц, нужно получить слово. Но та же таблица кодов используется в банке ещё в двух направлениях: закодировать заданное слово и посчитать длину будущего сообщения, не выписывая его целиком. Таблица одна, приёмы разные.
Задание №2 в формате экзамена
Ответить и проверить себя — после бесплатной регистрации.
Задание №2 в формате экзамена
Ответить и проверить себя — после бесплатной регистрации.
Задание №2 в формате экзамена
Ответить и проверить себя — после бесплатной регистрации.