Россия, Пошатово |
Оптимальное кодирование
12.1. Коды
Имея символов, мы можем кодировать каждый из них
битами, поскольку существует
комбинаций
из
битов. Например, можно закодировать
символа А, Г, Т, Ц (используемые при записи геномов) двухбитовыми
комбинациями
,
,
и
. Другой пример:
последовательностями из
битов (байтами) можно
закодировать
символов (и этого хватает на латинские
и русские буквы, знаки препинания и др.).
Более формально: пусть нам дан алфавит,
то есть конечное множество, элементы которого называются символами или буквами этого алфавита. Кодом для алфавита называется функция (таблица)
,
которая для каждого символа
из
указывает двоичное
слово
, называемое кодовым словом, или просто кодом
этого символа. ( Двоичное слово - конечная
последовательность нулей и единиц.)
Не требуется, чтобы коды всех символов имели равные длины.
Мы допускаем, чтобы разные символы имели одинаковые коды.
Согласно нашему определению, разрешается все буквы алфавита
закодировать словом (и даже пустым словом) - но,
конечно, такой код будет бесполезен. Хороший код должен
позволять декодирование (восстановление последовательности
символов по ее коду).
Формально это определяется так. Пусть фиксирован алфавит и код
для этого алфавита. Для каждого слова
в алфавите
(то есть для любой конечной
последовательности букв алфавита
) рассмотрим двоичное слово
, которое получается, если записать подряд коды всех букв из
(без каких-либо разделителей). Код
называется однозначным,
если коды различных слов различны:
при
.
12.1.1.
Рассмотрим трехбуквенный алфавит и код
,
и
. Будет ли
этот код однозначным?
Решение. Нет, поскольку слова и
кодируются одинаково.
12.1.2.
Для того же алфавита рассмотрим код ,
и
. Будет ли этот код однозначным?
Решение. Будет. Чтобы доказать это, достаточно объяснить, как
можно восстановить слово по его коду
.
Если
начинается с нуля, то ясно, что слово
начинается
с
. Если
начинается с единицы, то
слово
начинается с
или с
- чтобы узнать, с чего именно,
достаточно посмотреть на второй бит слова
.
Восстановив первую букву слова
, мы забываем о ней и о ее
коде, и продолжаем все сначала.
Верно и более общее утверждение. Назовем код префиксным,
если коды букв не являются началами друг
друга (слово не является началом слова
, если буквы
и
различны).
12.1.3. Доказать, что любой префиксный код является однозначным.
Решение. Декодирование можно вести слева направо. Первая буква восстанавливается однозначно: если для двух
букв и
слова
и
являются началами кода, то
одно из слов
и
является началом другого, что невозможно для префиксного кода. И так далее.
12.1.4. Привести пример однозначного кода, не являющегося префиксным.
Указание.
Пусть ,
,
.
Этот код является "суффиксным", но не префиксным.
12.1.5. Найти таблицу для азбуки Морзе. Объяснить, почему ее можно использовать на практике, хотя она не является ни префиксным, ни даже однозначным кодом.