Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Garbage / Информатика / 2.1.2 - Кодирование информации

.pdf
Скачиваний:
40
Добавлен:
21.05.2015
Размер:
139.95 Кб
Скачать
log2 n

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

Пусть объектом кодирования являются тексты, записанные на некотором (естественном или искусственном) языке, причем число букв в алфавите этого языка, включая (если есть такая необходимость) некоторые знаки препинания, знак пробела и т.п., равно п. Пусть далее, l - наименьшее натуральное число, удовлетворяющее условию l . Тогда можно пользоваться простейшим из

различных методов побуквенного кодирования, сводящимся к установлению взаимно однозначного соответствия между различными буквами исходного текста и различными кодовыми наборами двоичных символов фиксированной длины, равной l. Например, если речь идет о текстах, записанных на русском языке, где число букв алфавита, включая знак пробела, n = 34, то, поскольку имеет место неравенство 5 < log234 < 6, можно осуществить побуквенное кодирование, установив следующее соответствие:

Буква русского

Шестисимвольный

Десятичная

языка

кодовый набор

запись

(пробел)

000000

0

а

000001

1

б

000010

2

.

………

.

л

001101

13

.

……….

.

я

100001

33

.

……….

.

.

111111

63

Декодирование при этом осуществляется очень просто: последовательность двоичных символов - закодированный текст - делится на блоки из шести символов и каждый блок заменяется соответствующей буквой алфавита исходного текста. Невооруженным глазом видно, что, будучи очень привлекательным по своей простоте, рассмотренный метод кодирования грешит определенной "расточительностью" (избыточностью). Об этом свидетельствует хотя бы то обстоятельство, что шестью двоичными символами мы смогли бы выразить не п = 34, а целых п = 26 = 64 букв алфавита. Чтобы улучшить положение, можно было, например, пойти на некоторую уступку, а именно, согласиться с тем, чтобы при кодировании и декодировании текстов пары букв "е"-"ё" и "ь"-"ъ" оказались "неразличимыми". Ведь люди, владеющие русским языком, все равно смогли бы восстановить это различие при работе с уже декодированным текстом. При наличии такого согласия число букв в алфавите русского языка (включая знак пробела) оказалось бы равным п = 32, и поэтому можно было бы обойтись кодовыми наборами постоянной длины, равной l =

log232 = 5. Тем самым, из каждых шести двоичных символов один символ можно было сэкономить. Из этого примера легко сделать вывод, что при побуквенном кодировании букв исходного текста кодовыми наборами постоянной длины наиболее компактное (экономное) кодирование удается осуществить тогда, когда число букв в алфавите можно представить как целую степень двойки:

n = 2l ( l = 1,2, ...,).

(2.1)

Нарушение этого условия при указанном методе кодирования непременно приводит к некоторой избыточности. Возникает вопрос, а имеются ли резервы для дальнейшего сокращения среднего числа двоичных символов, отводимых под одну букву? Оказывается, что такие резервы имеются, и даже тогда, когда п удовлетворяет условию (2.1), возможны варианты, когда кодирование можно осуществить таким образом, чтобы среднее число двоичных символов, отводимых

под одну букву, оказалось меньше l = log2п.

Пусть алфавит исходного текста состоит из восьми букв А, В, С, D, Е, F, G, Н. Поскольку п = 8 = 23, т.е. l = 1оg2n = 3, то при рассмотренном только что методе кодирования каждой букве ставился бы в соответствие кодовый набор постоянной длины, равной трем.

Пусть нам известны значения вероятностей того, что наугад взятая буква из текстов этого языка окажется буквой А, В, С, D, Е, F, G или Н:

р (А) = 0,08

р (Е) = 0,08

р (В) = 0,44

р (F) = 0,08

р (С) = 0,08

р (G) = 0,08

р (D) = 0,08

р (Н) = 0,08

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

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

Пусть п - число букв в алфавите, nkчисло букв, кодовые наборы которых состоят из k двоичных символов, li - число двоичных символов в кодовом наборе i-й буквы алфавита, L = max (li).

L

Тогда, очевидно, n = nk , а для произвольного фиксированного значения k k=1

имеет место nk 2k . Если же нам заданы значения n1,n2 ,...,nk 1 , то, очевидно,

будет иметь место неравенство

nk 2k 2 nk 1 ... 2k 1 n1

т.е. k 2k j nj 2k

j=1

или, после деления обеих частей неравенства на 2k,

k

2j nj 1

j =1

Поскольку выбор значения k произвольный, то примем k = L. и тогда будем иметь:

L

2j nj 1

j =1

Отсюда непосредственно следует

n

 

2li 1

(2.2)

i=1

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

Неравенство Крафта, собственно, и лимитирует наше желание оперировать как можно меньшими значениями li. Пусть, например, n = 10 и уже известны значения l1 = 2, l2 = l3 =...= l6 = 3. Тогда. очевидно, значения l7 ÷ l10 должны удовлетворить неравенству

10

2

3

 

1

 

2 li 1 2

5 2

=

 

 

8

 

i=7

 

 

 

 

 

Пусть, например, мы хотим, чтобы имело место

 

l7=l8=l9=l10=l.

 

удовлетворить неравенству

Тогда получим, что значение

l

должно

 

4 2l 1/ 8 , т.е. оно не может быть меньше пяти.

Префиксный код называется полным, если добавление к нему любого нового кодового набора нарушает свойство префиксности. Пусть, например, буквам А, В и С поставлены в соответствии кодовые наборы 00, 01 и 1. Тогда очевидно, что любая попытка закодировать еще хоть одну букву привела бы к нарушению свойства префиксности. Значит, код 00, 01, 1 является полным. Если же буквам А. В и С были поставлены в соответствие кодовые наборы 00, 01 и 10, то через ветвь

11... мы смогли бы, не нарушая свойство префиксности, закодировать сколько угодно новых букв. Мы также смогли бы без нарушения свойства префиксности через ветвь 01... закодировать сколько угодно новых букв, если бы буквам А, В и С были поставлены в соответствие кодовые наборы 000, 001 и 1. Значит, коды 00, 01, 10 и 000, 001, 1 являются неполными. Для полных префиксных кодов и только для них неравенство Крафта превращается в равенство. Естественно, что на практике наибольший интерес представляют полные коды, так как при прочих равных условиях средняя длина кодовых наборов у полных кодов получается меньше, чем у неполных.

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