Понятие однозначного декодирования
Вы любите шпионов? А готовы почувствовать себя в их шкуре?
Нам нужно передать секретное сообщение на базу, а раз оно секретное, никто не должен понять, что мы передаем. Для этого надо представить наше сообщение в каком-то новом виде, который на первый взгляд будет бессмысленным, но мы будем знать, как его расшифровать.
Главное — чтобы расшифровать было возможно.
Мы уже знаем, что для компьютера информацию надо представить в двоичномкоде — подробнее об этом рассказано в статье «Основные понятия об информации». Но сам процесс кодирования информации — не такая простая вещь. Есть несколько факторов, которые нужно соблюсти, чтобы кодирование прошло хорошо.
Но чтобы научиться делать что-то правильно, сначала надо разобраться, как сделать неправильно. Давайте попробуем произвольным образом закодировать буквы К, У, Р, Л, Ы, чтобы составлять из них сообщения.
Каждой букве в табличке сопоставлено несколько символов, в нашем случае цифр. Эти символы — кодовое слово буквы, позволяющее отличить ее от других букв в закодированном сообщении.
С помощью кодовых слов каждой отдельной буквы закодируем сообщение КУРЛЫК, для этого на место каждой буквы будем подставлять соответствующее ей кодовое слово:
С проблемой мы столкнемся при попытке расшифровать сообщение. Чтобы это сделать, надо выделить в коде сообщения отдельные кодовые слова и подставить на их место соответствующие буквы. Но при расшифровке этого кода можно получить другой вариант:
Как закодировать сообщение КУРЛЫК правильно? |
Равномерное кодирование
Но как можно соблюдать это условие? Или еще круче — как строить кодовые слова, которые заранее будут этому условию удовлетворять?
Что такое равномерное кодирование? |
И такой подход действительно спасает ситуацию. Если каждое кодовое слово будет иметь одинаковую длину, и при этом все они будут различны, выделять в зашифрованном сообщении отдельные кодовые слова не составит труда, как и сопоставлять их с соответствующими им буквами.
Кодируем сообщение КУРЛЫК:
И при попытке декодирования, поочередно выделяя кодовые слова одинаковой длины, мы не имеем никаких проблем с сопоставлением и получаем исходное сообщение без альтернативных вариантов.
Такой метод действительно прост и в освоении, и при составлении кодовых слов, и при расшифровке. Но есть один минус — он не всегда эффективен.
Выбирая длину одного кодового слова, мы можем заранее определить количество возможных кодов: так как на каждой позиции может быть либо 0, либо 1, количество возможных кодов N длины i будет равно
\(N = 2^i\).
Выбрав длину 3 для наших кодовых слов, мы имеем 8 различных кодов, хотя кодируем всего 5 букв.
В других ситуациях потери могут быть плачевнее: для кодирования, например, 33 букв русского алфавита длина кодового слова должна быть не меньше 6 (если выберем 5, получим максимум 25 = 32 кодового слова, но тогда 1 буква останется незакодированной).
Но имея 26 = 64 кодовых слова для 33-х букв алфавита, мы явно взяли кодов больше, чем нужно.
Почему это плохо? Рассмотрим
следующую ситуацию.
Вася собирает вещи для переезда и ему надо упаковать какой-то набор вещей в
коробку. Если в ней много свободного места — это плохо, потому что Вася может
взять коробку поменьше и ему будет легче нести маленькую коробку. Также и
здесь, если в нашей кодировке много неиспользованных кодов — это плохо, потому
что можно оптимальнее перекодировать необходимый набор символов, и
зашифрованные сообщения станут занимать меньше места на компьютере или быстрее
передаваться по интернету.
Естественно, равномерное кодирование — все еще возможный вариант, при котором код будет однозначно декодируемым, но нет ли более рационального подхода?
Условие Фано и дерево вариантов
Так
как кодировать сообщения максимально эффективно? |
Условие Фано гласит: «ни одно кодовое слово не должно быть началом другого кодового слова».
В составленных нами в самом начале статьи кодовых словах это условие нарушалось — код буквы К (010) начинался с кода буквы У (01), а код Ы (001) — с кода Р (00). Из-за этого мы не могли быть точно уверены, где закончилось кодовое слово, а где оно продолжается.
Очень просто строить код, который будет удовлетворять условию Фано, с помощью дерева вариантов — структуры, в нашем случае помогающей получить кодовые слова максимально просто и понятно. Принцип работы дерева состоит в том, что в его узлах будут находиться кодовые слова, а из узла могут выходить два ребра, соответствующие добавлению в конец кодового слова 0 и 1, таким образом заменяя одно кодовое слово на два новых, которые длиннее на один символ.
Алгоритм
построения дерева вариантов |
Давайте попробуем таким образом получить ровно 5 кодовых слов, чтобы закодировать наши буквы К, У, Р, Л, Ы.
В итоге мы имеем 5 конечных узлов В них находятся кодовые слова, которые можно распределить любым удобным или необходимым способом между кодируемыми буквами. Например, так:
Такой код будет однозначно декодируемым, так как ни одно слово не заканчивается посередине другого, и мы всегда можем быть уверены, что одно кодовое слово закончилось и началось новое.
Так, код 010110010011010 мы можем однозначно декодировать, читая его слева направо:
Существует
также обратное условие Фано. |
И код 010110001110010 будет читаться уже в другую сторону – из конца в начало:
Практика
В жизни чаще всего используются равномерные кодировки в силу многих причин, таких как:
Представим, что мы передаем слово КУРЛЫК разными вариантами, но при передаче допускаем ошибку в четвертом бите (в четвертом символе нашего кода). Посмотрим, что получится в итоге.
Выводы:
Таким образом, мы видим большую устойчивость равномерного кодирования.
2. Простота расширения.
Мы обсуждали, что проблема равномерного кодирования — в большом количестве «пустых мест». Но эти пустые места могут быть полезны. Например, захочет разработчик добавить в код несколько новых эмодзи. У него как раз есть незанятые коды для этих символов. Согласитесь, это удобнее, чем переписывать всю кодировку целиком.
Неравномерные же кодировки часто применялись еще до появления компьютеров. Например, одной из самых известных неравномерных кодировок являлась азбука Морзе, применявшаяся в работе телеграфов, передаче радиосигналов и других способах передачи информации.
Также применение неравномерной кодировки есть в 4 задаче ЕГЭ и во 2 задаче ОГЭ.
Разберем задачу №4 ЕГЭ:
По каналу связи передаются закодированные сообщения о состоянии системы, состоящие из пяти символов: A, B, C, D, E. При передаче сообщений используется двоичный код, при этом он допускает однозначное декодирование. Для символов A, B, C используются эти кодовые слова: 1, 010 и 001 (соответственно).
В ответе нужно указать наименьшее по длине кодовое слово для буквы D. Если таких кодов несколько, то в ответе укажите наименьший по значению.
Решение.
Шаг 1. Построим дерево вариантов кодовых слов и отметим на нем уже известные коды букв:
Шаг 2. Заметим, что раз для символа A кодовое слово 1, то в дальнейшем нам не подойдут любые коды, начинающиеся с 1, так как для них и символа A не будет выполняться условие однозначного декодирования.
Шаг 3. Начнем разбирать по возрастанию кодовые слова, начинающиеся с 0:
Шаг 4. Получаем два недостающих кодовых слова равной длины: 000 и 011. Значит, можем использовать их для букв Е и D, при этом сохранив однозначное декодирование. Для D нужно слово, меньшее по значению, тогда верным ответом будет 000.
Ответ: 000
В этой статье мы познакомились с условием Фано и научились правильно кодировать
и декодировать сообщения. Но различные виды информации требуют собственных
уникальных подходов. Приглашаем вас продолжить изучение темы в статьях «Кодирование
изображения» и «Кодирование
звука».
Фактчек
Проверь себя
Задание 1.
Для чего необходимо условие однозначного декодирования?
Задание 2.
Выберите верные утверждения:
Задание 3.
Выберите наборы кодовых слов, которые удовлетворяют условию однозначного
декодирования по любому из критериев, описанных в статье:
Задание 4.
Для передачи сообщений используются буквы А, Б, В, Г, Д. Известны некоторые
кодовые слова: А = 01, Б = 111, В = 00, Г = 110. Какое кодовое слово может
соответствовать кодовому слову для буквы Д, чтобы весь код удовлетворял условию
Фано?
Ответы: 1. — 3; 2. — 1, 5; 3. — 2, 3, 4, 5; 4. — 3
Скачано с www.znanio.ru
© ООО «Знанио»
С вами с 2009 года.