К содержанию

Задание 4

Кодирование и декодирование информации

Как подобрать коды букв по условию Фано с помощью кодового дерева — самые короткие или так, чтобы сообщение вышло короче.

4 подтемы · 35 задач · базовый · ≈ 2 мин

Подтема 1 из 4

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

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

Как устроена тема

В задании 4 буквам дают коды из нулей и единиц разной длины. Часть кодов известна, остальные нужно подобрать — самые короткие или так, чтобы сообщение получилось короче. Вот задача, которую мы будем решать всю тему:

«По каналу связи передаются сообщения из букв А, Б, В, Г, Д. Используется двоичный код, удовлетворяющий условию Фано; известны коды А — 0, Б — 10, В — 110. Укажи кратчайший код буквы Г, если код буквы Д тоже должен существовать».

Все такие задачи решаются одним рисунком — деревом кодов: на нём видно, какие коды заняты и где осталось место. Сначала разберём, что сказано в условии:

В условииЧто это значит
сообщения из букв А, Б, В, Г, Дв алфавите пять букв, код нужен каждой
двоичный кодкоды — строки из нулей и единиц
условие Фанони один код не совпадает с началом другого
известны коды А, Б, Втри кода уже заняты
кратчайший код Г, код Д тоже должен существоватьГ — как можно короче, но так, чтобы осталось место для Д

Почти всё время будем кодировать четыре буквы А, Б, В, Г одной таблицей: А — 0, Б — 10, В — 110, Г — 111. Тема состоит из четырёх подтем — у каждой своя страница. Идём по ним по порядку:

  1. Код и условие Фано — ты сейчас здесь.
  2. Кодовое дерево и кратчайший код — как найти самый короткий свободный код.
  3. Место для всех букв и сумма длин — почему нужно оставить место всем буквам, и ответ задачи темы: 1110.
  4. Длина закодированного слова — как сделать закодированное сообщение короче.

Код буквы

Код сопоставляет каждой букве алфавита последовательность знаков. Представим, что нужно передавать сообщения из четырёх букв: А, Б, В, Г. Этот набор разрешённых символов называется алфавитом сообщения. Здесь слово «алфавит» означает просто набор символов, которые могут встречаться: это могут быть буквы, цифры, цвета или условные сигналы.

Пусть устройство передаёт только два знака: 0 и 1. Тогда каждой букве нужно сопоставить некоторую последовательность этих знаков. Например:

БукваЕё код
А0
Б10
В110
Г111

Такая таблица задаёт правило кодирования. Кодовое слово — последовательность знаков, которая обозначает один символ исходного алфавита. Например, 110 — кодовое слово буквы В.

Здесь важно различать обычное слово, например БАВ, и кодовое слово одной буквы, например 110. Чтобы закодировать обычное слово, заменяем каждую букву её кодом и соединяем результаты:

БАВ → 10 | 0 | 110 → 100110.

Вертикальные черты стоят только для объяснения. Обычно в передаваемой последовательности разделителей между кодами нет. Декодирование — обратная операция: по последовательности 100110 нужно восстановить БАВ.

Длина кодового слова

Длина кодового слова — количество знаков в нём, а сам код — последовательность, а не число. У 0 длина 1, у 10 — 2, у 110 — 3, у 00101 — 5.

Поскольку используются два знака, код называется двоичным. Один двоичный знак в такой записи занимает один бит. Поэтому «длина 5 двоичных знаков» и «длина 5 бит» в этих задачах означают одно и то же.

Несколько важных договорённостей:

  • одна и та же буква во всех местах сообщения имеет один и тот же код;
  • разные буквы должны иметь разные коды;
  • кодовые слова непустые;
  • заданные в условии коды менять нельзя.

Ещё одна тонкость: кодовое слово — прежде всего последовательность знаков, а не число. Записи 1, 01 и 001 как двоичные записи чисел обозначают одно и то же значение — единицу. Но как кодовые слова это три разные последовательности разной длины. Ведущие нули в кодах удалять нельзя.

Равномерный и неравномерный код

Равномерный код режут на куски одной длины, неравномерный так прочитать нельзя. Если все кодовые слова имеют одинаковую длину, код называется равномерным. Например, А — 00, Б — 01, В — 10, Г — 11. Получив 011011, мы просто разбиваем его на группы по два знака: 01 | 10 | 11 — и получаем БВГ. Границы кодовых слов известны заранее: через каждые два знака начинается следующая буква.

Если длины различаются, код называется неравномерным. Такова наша таблица А — 0, Б — 10, В — 110, Г — 111. Теперь разрезать сообщение на равные части нельзя: нужно другое правило, которое позволит находить границы букв.

Зачем вообще использовать разные длины? Чтобы частые символы передавать короткими кодами и тем самым уменьшать длину сообщения. Это разберём в подтеме 4.

Неоднозначное чтение

Разных кодов у букв ещё недостаточно: одну строку можно разрезать по-разному. Рассмотрим таблицу А — 0, Б — 01, В — 1. Все три кода различаются. Но что означает последовательность 01?

Одна и та же полученная строка 01 режется на коды таблицы двумя способами: целиком это Б, а по одному знаку — АВ.

Одному переданному сообщению соответствуют два разных исходных. Получатель не может определить, какое из них было отправлено.

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

В задании 4 обычно используется удобное требование, которое гарантирует однозначность, — условие Фано.

Условие Фано

Условие Фано: ни одно кодовое слово не должно быть началом другого кодового слова. Последовательность 01 является началом последовательности 0110, потому что первые два знака 0110 — это именно 01.

При проверке двух кодовых слов нас интересует один случай: более короткое полностью совпадает с началом более длинного.

Слова выровнены по левому краю. В первых двух парах короткое слово целиком совпадает с началом длинного — так нельзя. Коды 010 и 011 начинаются одинаково, но расходятся в третьем знаке. 010 стоит в конце 0010, а не в начале.

Последняя пара особенно важна. Последовательность 010 находится в конце 0010, но условие Фано запрещает именно совпадение с началом.

Ещё одна тонкость: общие начальные знаки разрешены. Коды 010 и 011 оба начинаются с 01. Это не нарушает условие Фано, потому что 01 не является отдельным кодом какой-либо буквы. Запрещено не «иметь общее начало», а целиком совпадать с началом другого кодового слова.

Чтение слева направо

Условие Фано позволяет читать сообщение слева направо, не заглядывая вперёд. Вернёмся к таблице А — 0, Б — 10, В — 110, Г — 111. Читаем сообщение слева направо и накапливаем знаки.

  1. Если накопилось 0, мы сразу узнаём А. Ждать продолжения не нужно: никакая другая буква не имеет кода, начинающегося с 0.
  2. Если накопилось 1, буква ещё не определена: такого кодового слова в таблице нет. Читаем дальше.
  3. Если получилось 10, узнаём Б. Продолжения, которое превратило бы 10 в код другой буквы, быть не может.

Так происходит после каждой буквы: первое совпавшее кодовое слово уже и есть буква.

Тонкости:почему два прочтения невозможны

Предположим, что у сообщения есть два разных разбиения на кодовые слова. Рассмотрим первое место, где эти разбиения различаются. Один из выбранных кодов должен закончиться раньше другого. Тогда он окажется началом более длинного кода — вопреки условию Фано.

Проверка в обе стороны

Новый код проверяют в обе стороны. Пусть уже существует код А — 010. Нельзя добавить код Б — 01: новый код является началом существующего 010. Но нельзя добавить и 0101: существующий код 010 является началом нового.

Поэтому для каждого нового кандидата нужно задать два вопроса:

  1. Не является ли новый код началом какого-нибудь существующего?
  2. Не является ли какой-нибудь существующий код началом нового?

Проверка только одного направления — распространённая ошибка. При этом код 011 добавить можно: у 010 и 011 общие первые два знака, но затем они расходятся. А одинаковый код 010 второй букве назначить нельзя: две буквы стали бы неразличимыми.

Итого

  • Кодовое словопоследовательность 0 и 1 для одной буквы; ведущие нули — её часть
  • Длина кодачисло знаков в кодовом слове
  • Неравномерный кододну запись можно разрезать на коды по-разному
  • Условие Фанони один код не начало другого; общее начало и совпадение с концом разрешены
  • Новый кодпроверяют в обе стороны: не начало ли он чужого и не начинается ли с чужого

Проверьте себя

Ответь сначала сам, потом открой ответ.

Вопрос 1
Какие пары кодов нарушают условие Фано: 11 и 110; 01 и 101; 100 и 10; 0110 и 011?
ОтветСкрыть ответ
Ответ
Нарушают первая, третья и четвёртая пары: 11 — начало 110, 10 — начало 100, 011 — начало 0110. В паре 01 и 101 код 01 стоит в конце, а не в начале.
Вопрос 2
Для кодов А — 1, Б — 10, В — 0 найди последовательность из трёх знаков, которую можно прочитать двумя способами.
ОтветСкрыть ответ
Ответ
100: целиком 10 | 0 — БВ, по знакам 1 | 0 | 0 — АВВ.
Вопрос 3
Выполняется ли условие Фано для кодов А — 01, Б — 10, В — 0, Г — 11? Если нет, назови пару, которая его нарушает.
ОтветСкрыть ответ
Ответ
Нет: 0 — начало 01.
Вопрос 4
К кодам А — 01 и Б — 100 добавляют код В. Какие из кандидатов 0, 10, 011, 1000, 11 подходят? Для каждого неподходящего назови, какая из двух проверок не пройдена.
ОтветСкрыть ответ
Ответ
Подходит только 11. Кандидаты 0 и 10 — начала существующих 01 и 100 (первая проверка); существующие 01 и 100 — начала кандидатов 011 и 1000 (вторая проверка).
Вопрос 5
Для четырёх букв предложены наборы кодов: 1) 0, 10, 110, 111; 2) 0, 01, 11, 101; 3) 00, 01, 10, 1; 4) 1, 01, 001, 000. В каких наборах выполняется условие Фано?
ОтветСкрыть ответ
Ответ
В наборах 1 и 4. В наборе 2 0 — начало 01, в наборе 3 1 — начало 10.

Практика

Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.

Закодировать слово ВАГА

По таблице А — 0, Б — 10, В — 110, Г — 111 закодируй слово ВАГА.

Введите запись слова из 0 и 1.

Какой код можно добавить

Заданы коды А — 10 и Б — 001. Какой из кандидатов 1, 00, 101, 11, 0011 можно назначить букве В, чтобы выполнялось условие Фано?

Введите кодовое слово (последовательность из 0 и 1).

Декодировать по таблице

По таблице А — 00, Б — 010, В — 011, Г — 1 декодируй 010100011.

Введите слово заглавными буквами.