решай.ai · шпаргалка
Задание 4: Кодирование и декодирование информации
ЕГЭ Информатика
Как выглядит
Типовая формулировка: «По каналу связи передаются сообщения, содержащие только N букв. Для передачи используется двоичный код, удовлетворяющий условию Фано. Известны кодовые слова для нескольких букв. Какое наименьшее количество двоичных знаков потребуется для кодирования слова …?» В конце обычно даётся примечание: условие Фано означает, что ни одно кодовое слово не является началом (префиксом) другого. Задание оценивается в 1 первичный балл, относится к базовому уровню сложности, но требует аккуратной работы с деревом кодов и внимательного подсчёта — обычно на него уходит 3–5 минут.
Что нужно знать
- Условие Фано (префиксность): код называется удовлетворяющим условию Фано, если ни одно кодовое слово не является началом другого кодового слова. Это гарантирует, что закодированное сообщение можно однозначно разбить на буквы без разделителей.
- Кодовое дерево: множество всех двоичных слов длины удобно представлять как вершины двоичного дерева на глубине ; всего таких вершин .
- Если вершина стала «листом» (кодовым словом), то все вершины на пути от неё к корню не могут быть отдельными кодовыми словами, и всё поддерево под ней недоступно для новых кодовых слов.
- Неравенство Крафта: для префиксного кода с длинами слов должно выполняться . Если распределить коды так, что сумма превышает 1, дерево «не вмещает» такие длины и нужно увеличивать глубину.
- Длина сообщения: если буква встречается в кодируемом слове раз и имеет код длиной , то общая длина сообщения .
- Чтобы длина была минимальной, самые короткие из доступных кодов нужно отдавать буквам, которые встречаются в слове чаще всего (а лучше — которые встречаются вообще, в отличие от букв, отсутствующих в слове).
Алгоритм
- Выписать полный алфавит и известные кодовые слова с их длинами.
- Построить (хотя бы мысленно) кодовое дерево до глубины, равной максимальной длине среди известных кодов.
- Отметить все вершины этой и меньших глубин, которые заняты известными кодами или являются их предками — эти вершины недоступны.
- Найти все свободные вершины (не заняты и не являются предками занятых), начиная с самой малой глубины — это кандидаты на новые самые короткие коды.
- Сравнить количество свободных вершин с количеством ещё не закодированных букв. Если не хватает, расщепить часть свободных вершин на следующую глубину (одна вершина глубины даёт две вершины глубины ), повторять до точного совпадения количества.
- Определить частоту каждой ранее незакодированной буквы в целевом слове (сколько раз она встречается). …
Ловушки
- Считать, что все короткие двоичные комбинации свободны, не проверяя, не являются ли они префиксами уже известных кодов (и наоборот).
- Не учитывать, что часть ветви дерева может быть «полностью занята» — например, если оба потомка вершины уже листья, сама вершина и вся её поддерево недоступны для новых кодов.
- Забывать расщеплять вершины, если свободных мест на нужной глубине не хватает для оставшихся букв, и брать заведомо слишком маленькую (неверную) длину.
- Раздавать короткие коды буквам без учёта их частоты в кодируемом слове — это увеличивает итоговую длину сообщения.
- Забывать умножать длину кода на количество вхождений буквы в слово, если буква повторяется несколько раз.
- Путать условие Фано (неравномерный, но однозначно декодируемый код) с равномерным кодом, где у всех букв одна и та же длина. …
reshay.ai/ege/informatika/zadanie-4 — задачи с разборами и тренажёр