Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика.doc
Скачиваний:
46
Добавлен:
12.02.2015
Размер:
578.56 Кб
Скачать

Основные принципы эффективного кодирования:

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

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

  3. Ни одна из кодовых комбинаций не должна получаться из другой, более короткой путем добавления новых символов. Коды, удовлетворяющие этому свойству, называются префиксными, т. к. ни одно кодовое слово не является начальной частью (префиксом) другого слова.

Пример. Пусть алфавит X содержит 6 букв, передаваемых независимо друг от друга, .

p(А) = 0.4

p(Б) = 0.3

p(В) = 0.1

p(Г) = 0.08

p(Д) = 0.07

p(Е) = 0.05

.

Чтобы закодировать буквы равномерным двоичным кодом необходимо затратить на каждую 3 символа. В соответствии с первой теоремой Шеннона эти буквы можно закодировать двоичными символами так, чтобы в среднем на каждую затрачивалось 2.16 бит. Попробуем сделать это, не задумываясь пока над однозначностью декодирования. Присвоим наиболее вероятным буквам самые короткие блоки в соответствии со 2-м принципом эффективного кодирования, делая код неравномерным.

Код

А 0

Б 1

В 00

Г 01

Д 10

Е 11

Таким образом, для передачи букв А и Б, имеющих суммарную вероятность 0.7, используется один символ. Для передачи остальных букв, имеющих суммарную вероятность 0.3, используется два символа. В результате средняя длина кодового слова равна:

= 0.7*1 + 0.3*2 = 1.3 < 2.16.

Получилось, что буквы закодированы еще более экономично, чем позволяет теореме Шеннона. Парадокс объясняется тем, что выбранный код не пригоден для передачи сообщений, т. к. он не обеспечивает однозначного декодирования. В самом деле, принятую последовательность: 00110100011110…, можно декодировать:

ААББАБАААБ…

ВЕГВАЕБД…

АГДБВГББД…

В принципе, используя предложенный код, можно обеспечить однозначность декодирования, если после каждой буквы передавать некоторый разделительный символ (запятую, маркер), разделяющий эти буквы. Тогда это будет не двоичный код, а троичный. Таким образом поступил, например, Морзе, в коде которого кроме точки и тире используется пробел.

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

Существует несколько алгоритмов построения неравномерных кодов с префиксным свойством. Среди них оптимальным (позволяющим лучше всего приблизиться к границе, определяемой энтропией) является метод Хаффмана. Более простым и несколько худшим является метод Шеннона - Фано.