Опубликован: 08.04.2009 | Доступ: платный | Студентов: 18 / 0 | Длительность: 17:26:00
Специальности: Программист
Лекция 12:

Оптимальное кодирование

< Лекция 11 || Лекция 12: 1234 || Лекция 13 >

12.1. Коды

Имея 2^n символов, мы можем кодировать каждый из них n битами, поскольку существует 2^n комбинаций из n битов. Например, можно закодировать 4=2^2 символа А, Г, Т, Ц (используемые при записи геномов) двухбитовыми комбинациями 00, 01, 10 и 11. Другой пример: последовательностями из 8 битов (байтами) можно закодировать 256 символов (и этого хватает на латинские и русские буквы, знаки препинания и др.).

Более формально: пусть нам дан алфавит, то есть конечное множество, элементы которого называются символами или буквами этого алфавита. Кодом для алфавита A называется функция (таблица) \alpha, которая для каждого символа a из A указывает двоичное слово \alpha(a), называемое кодовым словом, или просто кодом этого символа. ( Двоичное слово - конечная последовательность нулей и единиц.) Не требуется, чтобы коды всех символов имели равные длины.

Мы допускаем, чтобы разные символы имели одинаковые коды. Согласно нашему определению, разрешается все буквы алфавита закодировать словом 0 (и даже пустым словом) - но, конечно, такой код будет бесполезен. Хороший код должен позволять декодирование (восстановление последовательности символов по ее коду).

Формально это определяется так. Пусть фиксирован алфавит A и код \alpha для этого алфавита. Для каждого слова P в алфавите A (то есть для любой конечной последовательности букв алфавита A ) рассмотрим двоичное слово \alpha(P), которое получается, если записать подряд коды всех букв из P (без каких-либо разделителей). Код \alpha называется однозначным, если коды различных слов различны: \alpha(P)\ne \alpha(P') при P\ne P'.

12.1.1. Рассмотрим трехбуквенный алфавит \{a,b,c\} и код \alpha(a)=0, \alpha(b)=01 и \alpha(c)=00. Будет ли этот код однозначным?

Решение. Нет, поскольку слова aa и c кодируются одинаково.

12.1.2. Для того же алфавита рассмотрим код \alpha(a)=0, \alpha(b)=10 и \alpha(c)=11. Будет ли этот код однозначным?

Решение. Будет. Чтобы доказать это, достаточно объяснить, как можно восстановить слово P по его коду \alpha(P). Если \alpha(P) начинается с нуля, то ясно, что слово P начинается с a. Если \alpha(P) начинается с единицы, то слово P начинается с b или с c - чтобы узнать, с чего именно, достаточно посмотреть на второй бит слова \alpha(P). Восстановив первую букву слова A, мы забываем о ней и о ее коде, и продолжаем все сначала.

Верно и более общее утверждение. Назовем код префиксным, если коды букв не являются началами друг друга (слово \alpha(p) не является началом слова \alpha(q), если буквы p и q различны).

12.1.3. Доказать, что любой префиксный код является однозначным.

Решение. Декодирование можно вести слева направо. Первая буква восстанавливается однозначно: если для двух букв p и q слова \alpha(p) и \alpha(q) являются началами кода, то одно из слов \alpha(p) и \alpha(q) является началом другого, что невозможно для префиксного кода. И так далее.

12.1.4. Привести пример однозначного кода, не являющегося префиксным.

Указание. Пусть \alpha(a)=0, \alpha(b)=01, \alpha(c)=11. Этот код является "суффиксным", но не префиксным.

12.1.5. Найти таблицу для азбуки Морзе. Объяснить, почему ее можно использовать на практике, хотя она не является ни префиксным, ни даже однозначным кодом.

< Лекция 11 || Лекция 12: 1234 || Лекция 13 >