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

Код Шеннона-Фэно для букв русского алфавита

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

Рассмотрим эту задачу на примере русского алфавита. Предположим, что перед нами поставлена задача: закодировать двоичным кодом буквы алфавита, так, чтобы каждой букве соответствовала определённая комбинация символов 0 и 1 и чтобы среднее число этих символов на букву текста было минимальным.

Рассмотрим 32 буквы русского алфавита: а, б, в, г, д, е, ж, з, и, й, к, л, м, н, о, п, р, с, т, у, ф, х, ч, ш, щ, ъ, ы, ь, э, ю, я плюс пробел (промежуток между словами), который мы будем обозначать «». Если не различать букв ъ и ь, то получится вместе с пробелом 32 буквы.

Первое, что приходит в голову – это, не меняя порядка букв, занумеровать их подряд, приписав им номера от 0 до 31, и затем перевести нумерацию в двоичную систему счисления. например

Вспомним, что в двоичной системе счисления единицы разных разрядов представляют собой разные степени двух. Например, 1210=1*23+1*22+0*21+0*20=11002.

(2510=110012).

Каждое из чисел 0,1,2, …, 31 может быть изображено пятизначным двоичным числом. Тогда получим следующий код: а ~ 00000; б ~00001; в ~00010; ….; я~ 11110; «» ~ 11111.

В

том коде на изображение каждой буквы тратится ровно 5 элементарных символов.

Возникает вопрос, является ли этот простейший код оптимальным и нельзя ли составить другой код, в котором на одну букву будет в среднем приходиться меньше элементарных символов?

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

Приведём таблицу частотности букв в порядке убывания частот (Ветцель Е.С. Теория вероятностей, стр.504, 1999 г. ).

Таблица 1 Частоты букв русского алфавита

Буква

Частота

Буква

Частота

Буква

Частота

Буква

Частота

«»

0,145

р

0,041

я

0,019

х

0,009

о

0,095

в

0,039

ы

0,016

ж

0,008

е

0,074

л

0,036

з

0,015

ю

0,007

а

0,064

к

0,029

ъ ь

0,015

ш

0,006

и

0,064

м

0,026

б

0,015

ц

0,004

т

0,056

д

0,026

г

0,014

щ

0,003

н

0,056

п

0,024

ч

0,013

э

0,003

с

0,047

у

0,021

й

0,010

ф

0,002

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

Рассмотрим элементарный символ (т.е. изображающий его сигнал) как физическую систему с двумя возможными состояниями: 0 и 1.

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

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

Подобную задачу хорошо решает способ построения кода известный под названием «код Шеннона-Фено».

Идея его состоит в том, что кодируемые символы (буквы или комбинации букв) разделяются на две приблизительно равновероятные группы: для первой группы символов на первом месте комбинации элементарных символов ставится 0 (первый знак двоичного числа, изображающего символ); для второй группы – 1. Далее каждая группа снова делится на две приблизительно равновероятные подгруппы; для символов первой подгруппы на втором месте ставится нуль; для второй подгруппы – единица и т.д.

Продемонстрируем принцип построения Шеннона-Фэно на материале русского алфавита.

Первые 6 букв (от «» до «т») в таблице 1 дают сумму частот=0,498. На все остальные буквы (от «н» до «ф») приходится приблизительно такое значение суммы (=0,502). На первом месте кодового слова для букв первой группы будет стоять двоичный знак 0; для букв второй группы – 1. Повторим эту процедуру для первой и второй групп несколько раз, разбивая буквы на равновероятные группы и приписывая 0 для первой и 1 для второй в соответствующем разряде. Механизм построения кода показан в таблице 2.

Таблица 2 Механизмпостроения кода Шеннона-Фэно

Двоичные знаки

Буквы

1й

2й

3й

4й

5й

6й

7й

8й

9й

-

0

о

е

а

и

т

н

1

с

р

в

л

к

м

д

п

у

я

ы

з

ъь

б

г

ч

й

х

ж

ю

ш

ц

щ

э

ф

Таблица 3 Код Шеннона-Фэно

Буква

Код. слово

Буква

Код. слово

Буква

Код. слово

«-»

000

к

10111

ч

111100

о

001

м

11000

й

1111010

е

0100

д

110010

х

1111011

а

0101

п

110011

ж

1111100

и

0110

у

110100

ю

1111101

т

0111

я

110110

ш

11111100

н

1000

ы

110111

ц

11111101

с

1001

з

111000

щ

11111110

р

10100

ъь

111001

э

111111110

в

10101

б

111010

ф

111111111

л

10110

г

111011

С помощью созданного кода можно однозначно закодировать и декодировать любое сообщение. Код является моментальным. Ни одно кодовое слово не является префиксом для другого кодового слова

Пример: 01110100001101000110110110000

0110100011111111100110100

1100001011111110101100110

Фраза «теория информации».

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

Возникает вопрос: а является ли составленный код действительно оптимальным?

  1. Найдём среднюю информацию, приходящуюся на одну букву, т.е энтропию.

  2. Найдём среднее число элементарных символов на букву

  3. Найдём информацию, приходящуюся на элементарный символ (0 или 1).

  4. Сравним её с максимально возможной информацией, которая равна одной двоичной единице.

Средняя информация, содержащаяся в одной букве передаваемого текста, т.е. энтропию на одну букву:

Среднее число элементарных символов на букву

nср=3*0,145+3*0,095+4*0,074+…+9*0,003+9*0?002=4,45

Деля энтропию H(б) на nср, получаем информацию на один элементарный символ

I1c=4,42/4,45  0,994 бит.

Таким образом, информация на один символ весьма близка к своему верхнему пределу 1, а выбранный нами код весьма близок к оптимальному.

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

I1c=4,42/5,0 = 0,884 бит,

т.е заметно меньше, чем при оптимальном буквенном кодировании.

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