Символов

aa 0,81

ab 0,09

ba 0,09

bb 0,01

Построение кода сведем в таблицу:

Блоки исходных символов Частоты блоков Этапы построения кода
первый второй третий
aa 0,81   код построен
ab 0,09     код построен
ba 0,09      
bb 0,01      

Таким образом, получены коды:

aa - 1;

ab - 01;

ba - 001;

bb - 000.

Определим эффективность построенного кода. Для этого рассчитаем сначала показатель эффективности для блока символов:

lср блока = 0,81*1 + 0,09*2 + 0,09*3 + 0,01*3 = 1,28.

Поскольку в блоке 2 символа (n=2), для одного символа lср = lср блока /2 = 1,28/2 = 0,64.

При посимвольном кодировании для эффективного кода потребуется по одному двоичному разряду. В самом деле, применение метода Шеннона-Фано дает результат, представленный в таблице:

Исходные символы Частоты символов Построение кода
a 0,9  
b 0,1  

Таким образом, при блочном кодировании выигрыш составил 1 - 0,64 = 0,36 двоичных разрядов на один кодируемый символ в среднем.

Эффективность блочного кодирования тем выше, чем больше символов включается в блок.

Декодирование эффективных кодов

Особенностью эффективных кодов является переменное число двоичных разрядов в получаемых кодовых комбинациях. Это затрудняет процесс декодирования.

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

Пусть кодовая таблица имеет вид:

Исходные символы Двоичные коды
a  
b  
c  
d  

а закодированное сообщение - 001000011101.

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

Тогда имеем:

00 10 00 10 11 01

a c a b d b

Таким образом, в исходном сообщении содержится текст acabdb. Декодирование выполнено.

Для декодирования кодов переменной длины рассмотренный подход не годится. Тем не менее закодированные сообщения могут декодироваться благодаря свойству префиксности эффективных кодов: ни одна более короткая кодовая комбинация не является началом более длинной кодовой комбинации.

Для раскрытия данного тезиса воспользуемся построенными ранее эффективными кодами:

a - 1;

b - 01;

c - 001;

d - 000.

Здесь самым коротким кодом является код для символа a со значением 1. Как видно, ни один другой код (более длинный) не имеет в начале символ 1.

Второй по длине код для символа b имеет значение 01 и, как показывает анализ, не является началом ни для кода 001, ни для кода 000. Таким образом, данный код является префиксным.

Свойство префиксности позволяет декодировать сообщения, закодированные эффективными кодами.

Пусть получено сообщение 1010010001, составленное из кодов

a - 1;

b - 01;

c - 001;

d - 000.

Выполним его декодирование.

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

Итак, имеем (направление просмотра цепочки слева направо):

                   
a - - - a
b - -
   
    c d

Здесь знак «-» означает, что попытка декодирования не удалась.

Таким образом, при декодировании получили строку abcda.

Отметим, что методы Шеннона-Фано и Хаффмена строят префиксные коды.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: