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

Материал из Викиконспекты
Версия от 15:50, 18 декабря 2011; Nechaev (обсуждение | вклад) (Недостатки префиксных кодов)
Перейти к: навигация, поиск
Определение:
Кодирование информации — отображение данных на кодовые слова.

Обычно в процессе кодирования информация преобразуется из формы, удобной для непосредственного использования, в форму, удобную для передачи, хранения или автоматической обработки. В более узком смысле кодированием информации называют представление информации в виде кода. Средством кодирования служит таблица соответствия знаковых систем, которая устанавливает взаимно однозначное соответствие между знаками или группами знаков двух различных знаковых систем.

Код

Определение:
Код — правило (алгоритм) сопоставления каждому конкретному сообщению строго определённой комбинации символов (знаков или сигналов). Кодом также называется отдельная комбинация таких символов (знаков) — слово. Для различия этих терминов, код в последнем значении ещё называется кодовым словом.
Пусть [math]U[/math] — множество исходных символов, [math]Z[/math] — кодовый алфавит, [math]Z^*[/math] — строчки из [math]Z[/math]. 
Код — отображение [math]c : U \rightarrow Z^*[/math]. [math]c^* : U^* \rightarrow Z^*[/math]. [math]c^*(x_1 x_2 ... x_n) = c(x_1)c(x_2)..c(x_n)[/math]

Виды кодов

  • Код фиксированной длины (fixed-length code) — кодирование каждого символа производится с помощью строк одинаковой длины. Также он называется равномерным или блоковым кодом.
  • Код переменной длины (variable-length code) — кодирование производится с помощью строк переменной длины. Также называется неравномерным кодом.
  • Разделимый код (однозначно декодируемый) — код, в котором никаким двум словам кодируемого алфавита не может быть сопоставлен один и тот же код.

Примеры кодов

  • Азбука Морзе
  • ASCII

Однозначно декодируемый код

Определение:
Однозначно декодируемый код — код, в котором любое слово составленное из кодовых слов можно декодировать только единственным способом.
Пусть есть код заданный следующей кодовой таблицей.
[math]a_1 \rightarrow b_1[/math]; [math]a_2 \rightarrow b_2[/math]; ... [math]a_k \rightarrow b_k[/math];
Составим слово из кодов с использование операции конкатенации:
[math]b_{i_1} b_{i_2} ... b_{i_n} = b_{j_1} b_{j_2} ... b_{j_m}[/math]
В этом случае, если код однозначно декодируемый, то [math]n = m[/math] и выполняется равенство:
[math]b_{i_1} = b_{j_1}[/math]; [math]b_{i_2} = b_{j_2}[/math]; ... [math]b_{i_n} = b_{j_m}[/math]; 

Заметим, что если среди кодовых слов будут одинаковые, то однозначно декодировать этот код мы уже не сможем.

Теорема:
Для любого однозначно декодируемого кода выполняется Неравенство Крафта[1]
Теорема:
Зная кодовые слова, мы может определить можно ли составить из них однозначно декодируемый код[2]

Не префиксный и не постфиксный однозначно декодируемый код

Пример:

[math]U = \mathcal {f} a, b, c \mathcal {g}[/math]; [math]Z = \mathcal {f} 1, 2, 3 \mathcal {g}[/math];
[math]c(a) = 1; c(b) = 12; c(c) = 31;[/math]
Возьмём кодовую строку: [math]Z^* = (11212311)[/math]
Мы можем ее однозначно декодировать, т.к. знаем, что слева от двойки и справа от тройки всегда стоит единица.

Алгоритм декодировки:

1. Найдем в кодовой строке все двойки и заменим последовательность [math]Z^*(12)[/math] на символ [math]b[/math]
2. Найдем в кодовой строке все тройки и заменим последовательность [math]Z^*(31)[/math] на символ [math]c[/math]
3. Все оставшиеся единички декодируем как символ [math]a[/math]

В таком случае получаем:

[math]abbca[/math]

Но, такой код используется очень редко, потому что для его декодировки нужно получить все сообщение целиком.

Префиксный код

Определение:
Префиксный код — код, в котором никакое кодовое слово не является префиксом какого-то другого кодового слова.

Любой префиксный код является однозначно декодируемым и разделимым. Также префиксный код иногда называют мгновенным кодом[3].

Предпочтение префиксным кодам отдается из-за того, что они упрощают декодирование. Поскольку никакое кодовое слово не выступает в роли префикса другого, кодовое слово, с которого начинается файл, определяется однозначно, как и все последующие кодовые слова. Поэтому можно декодировать сообщение не получая его целиком, а по мере его поступления. Благодаря этому, префиксный код еще называют мгновенно декодируемым.

Использование префиксного кода очень выгодно для кодирования больших аудио/видео файлов, в этом случае мы сможем слушать/смотреть файл по мере скачивания.

Пример:

[math]U = \mathcal {f} a, b, c \mathcal {g}[/math]; [math]Z = \mathcal {f} 0, 1 \mathcal {g}[/math]
[math]c(a) = 00; c(b) = 01; c(c) = 1;[/math]
Закодируем строку: [math]abacaba[/math]
[math]c^*(abacaba) = 0001001000100[/math]

Такой код можно однозначно разбить на слова:

[math]00\ 01\ 00\ 1\ 00\ 01\ 00[/math]

поэтому он является префиксным.

Недостатки префиксных кодов

  • Так как префиксные коды являются кодами переменной длины, а данные, в основном, считываются блочно, код приходится считывать побитово, что значительно замедляет скорость считывания данных
  • При появлении ошибок в кодовой комбинации, при определенных обстоятельствах, может привести к неправильному декодированию не только данной, но и последующей кодовой комбинации, в отличии от равномерных кодов, где ошибка в кодовой комбинации приводит к неправильному декодированию только ее.
Предположим, что предыдущая последовательность передалась неверно и стала:
[math]0001001'1'00100[/math]
Разобьем ее согласно словарю:
[math]00\ 01\ 00\ 1\ 1\ 00\ 1\ 00[/math]
[math]a\quad b\quad a\ c\ c\quad a\ c\ a[/math]

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

  • Необходимость хранить словарь декодировки символов.

Примеры префиксных кодов

См. также

Примечания

  1. Новиков Ф.А. "Дискретная математика для программистов"
  2. Яблонский С.В "Введение в дискретную математику".
  3. Джеймс Андерсон. "Дискретная математика и комбинаторика", 2004г. Глава 18. Теория кодов. стр. 754

Литература

  • Томас Кормен, Чарльз Лейзерсон, Рональд Ривест, Клиффорд Штайн. Алгоритмы. Построение и анализ — Издательство: «Вильямс», 2011 г. - 1296 стр. — ISBN 978-5-8459-0857-5, 5-8459-0857-4, 0-07-013151-1
  • Джеймс Андерсон. Дискретная математика и комбинаторика — Издательство: «Вильямс», 2004 г. - 960 стр. — ISBN 978-0-13-086998-2
  • Новиков. Ф.А. Дискретная математика для программистов — Издательство: «Питер», 2001 г. - 304 стр. — ISBN 5-94723-741-5 978-5-94723-741-2