Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Teoria_informatsii_Gordeev_5sem.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
758.94 Кб
Скачать
      1. Кодирование натурального ряда.

Здесь мы будем рассматривать алфавиты А =(0,1,…,9) и B= (0,1).

Задача кодирования натуральных чисел битовыми последовательностями актуальна, так как часто необходимо хранить и передавать информацию в бинарном виде. Особенно остро она встала в 50-е годы прошлого века в связи с распространением компьютеров.

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

Простой переход к двоичной записи не обеспечивает префиксности, а, следовательно, и декодируемости этой битовой последовательности.

Приведем примеры кодов, которые это обеспечивают.

Пусть n > 1, двоичную запись числа n обозначим BIN(n) = α1αn, αi {0, 1}. (Например, BIN(30) = 11110, BIN(75) = 1001011). Заметим, что k = |BIN(n)| = [log n] + 1. Пусть B(n) – двоичная запись n без первого символа. (Например, B(30) = 1110, B(75) = 001011). Тогда |B(n)| = [log n].

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

TK(n)= 0…0BIN(n),

Где число нулей префиксе равно [log n] + 1. Длина такого кода 2[log n] + 2. Следующие два примера дают более экономное кодирование.

        1. Код Элайеса.

Код Элайеса неотрицательного целого числа n обозначим через El (n). Положим El (0) = 10, El (1) = 11.

Пусть n > 1. В этом случае длина слова BIN(n) больше единицы. Код Элайеса состоит из трех фрагментов. Вначале идет некоторое количество нулей, подсчитав которые, мы найдем число символов в двоичной записи |BIN(n)|. Для экономии, учитывая предыдущее замечание можно взять количество нулей на единицу меньшее числа символов в двоичной записи |BIN(n)|. (Так как любая двочная запись начинается с единицы, то мы всегда знаем, где заканчивается наша цепочка нулей). Теперь мы это количество символов записи |BIN(n)| отсчитываем после последнего нуля, а затем полученный врагмент из нулей и единиц переводим в десятичную запись и получаем длину закодированного слова. Зная эту длину, мы отсчитываем нужное нам число символов, а полученный фрагмент и будет двоичной записью закодированного натурального числа. Опять же для экономии первую единицу данного фрагмента можно в коде опустить.

Тогда El (n)= 00…0 BIN([log n]+1) B(n), где 00…0 – маркер, необходимый для того, чтобы знать, сколько последующих за 0 символов может задавать длину записи числа. Поэтому в данном коде количество нулей перед BIN([log n]+1) равно |BIN([log n]+1)|-1.

Примеры (пробелы стоят только для иллюстрации):

El(5) = 0 11 01.

El(75) = 00 111 001011.

Утверждение. Длина |El(n)| не превосходит log n + 2 log (log n) + 3.

Утверждение. Код Элайеса – префиксный.

Доказательство: Рассмотрим El (n) и El (m). Если хотя бы одно из этих слов начинается с 1, то это либо 0, либо 1. Утверждение доказано. Пусть n, m больше 1, вспомним теорему о дешифруемости кода: El(n) = α1αk, El(m) = β1βS (для определенности ks). Пусть количество 0, с которых начинается α, совпадает с количеством 0, с которых начинается β. (В противном случае сразу следует свойство префиксности кода.) Далее рассмотрим вторые подслова слов El (n) и El (m). Если они не совпадают, то префиксность кода доказана. Если совпадают, то переходим к окончаниям слов. Если они совпадают, то m=n. В противном случае n не равно m. Таким образом, при m≠n выполняется соотношение B(n) ≠B(m).

Утверждение доказано.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]