Вы находитесь на странице: 1из 8

Лабораторная работа № 2

Оптимальное кодирование
1. Основные сведения об оптимальном кодировании
Кодированием информации называется операция преобразования
сообщений, состоящих из символов первичного алфавита, в определенную
последовательность символов вторичного алфавита (элементарных
символов). Обратная операция, восстанавливающая исходное сообщение по
элементарным символам называется декодированием. Любому дискретному
сообщению можно приписать некоторое число – его код. Тогда передача
сообщений сводится к передаче кодов. Очевидно, что для восстановления по
кодам сообщений они должны быть однозначно декодируемыми. Таким
свойством обладают префиксные коды.
Префиксные коды – это такие коды, в которых ни одна более короткая
комбинация не является началом более длинной комбинации, что позволяет
производить однозначное декодирование, даже если последовательность
кодов не содержит разделителей между кодами.
Для произвольного кода V, состоящего из различных слов, можно
построить кодовое дерево. Это ориентированный граф, не содержащий
циклов, в котором вершина β1 соединена с вершиной β2 ребром,
направленным от β1 к β2, тогда и только тогда, когда β2 = β1b,
где b ∈ B = {0, 1, D – 1}, D ≥ 2. Для префиксных кодов (и только для них)
множество кодовых слов совпадает с множеством концевых вершин
(вершин, из которых не исходят ребра) кодового дерева.
Для существования однозначно декодируемого (разделимого) кода,
содержащего N кодовых слов в множестве {0, 1, D – 1} с длинами n1, n2, …,
nN, необходимо и достаточно, чтобы выполнялось неравенство Крафта
N
∑D −n i
≤1 .
i =1

Дискретный источник сообщений, который описывается моделью с


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

10
без памяти. Для любого дискретного источника без памяти X с конечным
алфавитом и энтропией H(X) существует D-ичный префиксный код, в
котором средняя длина кодового слова n удовлетворяет неравенству
H (X ) H (X )
≤n ≤ +1,
log 2 D log 2 D

т.е. средняя длина кодового слова не может быть меньше энтропии


источника сообщений. Кроме того, доказано, что для блока длины L
существует D-ичный префиксный код, в котором средняя длина кодового
слова на один символ n удовлетворяет неравенству
HL(X ) H (X ) 1
≤n ≤ L + ,
log 2 D log 2 D L
1
где HL (X ) = H ( X 1 , X 2 ,..., X L ) . Последнее неравенство позволяет
L

утверждать, что существуют такие способы кодирования для достаточно


длинного сообщения, что средняя длина кодового слова может быть сделана

H (X )
сколь угодно близкой к величине log D .
2

Так как минимально достижимой длиной кодового слова на символ

H
является величина log 2 D
, то при D = 2 избыточность кода можно

n −H H
определить по формуле =1 − .
n n

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


Оптимальным считается такой код, при котором на передачу сообщений
затрачивается минимальное время. Если при этом на передачу каждого
элементарного символа кода (0 или 1) тратиться одно и то же время, то
оптимальным будет код, имеющий минимально возможную длину.
Принципы построения оптимальных кодов:
1. каждый элементарный символ должен переносить максимальное
количество информации, для этого необходимо, чтобы элементарные
символы (0 и 1) в закодированном тексте встречались в среднем одинаково
часто (энтропия в этом случае будет максимальной);
11
2. необходимо буквам первичного алфавита, имеющим большую
вероятность, присваивать более короткие кодовые слова вторичного
алфавита.
При равномерном распределении вероятностей символов в сообщении
оптимальным будет равномерный код. При равномерном кодировании
каждому символу алфавита сообщений присваивается код, состоящий из ]
log2n[ двоичных значений (0 или 1), где n – число различных символов
первичного алфавита. Это можно сделать, сопоставив каждому символу
число от 0 до n – 1 в двоичной системе счисления.
Одним из первых способов оптимального кодирования является метод
Шеннона-Фано. Для построения кода Шеннона-Фано все символы алфавита
сообщений записывают в порядке убывания вероятностей их появления.
Полученную ранжированную (упорядоченную) последовательность
символов разбивают на две группы так, чтобы суммы вероятностей групп
были примерно одинаковыми. Для символов первой группы в качестве
первого кодового символа присваивают 0, а для символов второй группы – 1.
Полученные группы символов сообщений опять разбивают таким же образом
на две подгруппы и опять кодируют. Это продолжается до тех пор, пока в
последних подгруппах не останется по одному символу сообщений. Пусть,
например, имеется алфавит сообщений
X = (x1, x2, x3, x4, x5, x6, x7, x8)
с распределением вероятностей появления символов
1 1 1 1 1 1 1 1 
P =  , , , , , , , .
 4 4 8 8 16 16 16 16 

Процесс кодирования по методу Шеннона-Фано показан в таблице 1.


Средняя длина полученного кода будет равна
8 1 1 1
n = ∑ ni pi = 2 ⋅ 2 ⋅ + 2 ⋅ 3 ⋅ + 4 ⋅ 4 ⋅ = 2.75 ,
i =1 4 8 16

что совпадает со значением энтропии:


8 1 1 1 1 1 1
H ( X ) = −∑ pi log 2 pi = −2 ⋅ log 2 − 2 ⋅ log 2 − 4 ⋅ log 2 = 2.75 .
i =1 4 4 8 8 16 16

12
Таблица 1
Кодирование Шеннона-Фано
X P Шаг Коды
1 2 3 4
x1 1/4 0 0   00
x2 1/4 1   01
x3, 1/8 0 0  100
x4 1/8 1  101
x5 1/16 1 0 0 1100
x6 1/16 1 1 1101
x7 1/16 1 0 1110
x8 1/16 1 1111

Еще одним способом построения оптимальных кодов является метод


Хаффмена. Код Хаффмана строится следующим образом: буквы располагают
в порядке убывания их вероятностей. Складывают вероятности двух
последних букв и из них образуют новую (составную) букву с вероятностью,
равной получившейся сумме. Затем ряд переписывают снова с учетом того,
что вместо двух букв появилась одна новая со своей вероятностью. Далее
повторяют операцию, пока не останется всего одна буква с вероятностью 1.
После этого выполняют приписывание компонентам составных букв
символов 0 и 1: первой букве всегда приписывают 0, а второй – 1. Для
примера ниже показан процесс построения кодов Хаффмена для алфавита
сообщений
X = (x1, x2, x3, x4, x5, x6, x7, x8)
с распределением вероятностей появления символов
1 1 1 1 1 1 1 1 
P =  , , , , , , , .
 4 4 8 8 16 16 16 16 

1. Исходный список букв X = {x1, x2, x3, x4, x5, x6, x7, x8} уже упорядочен,

1 1 1 1 1 1 1 1 
так как P =  , , , , , , , .
 4 4 8 8 16 16 16 16 
1
2. Объединим буквы x7 и x8 в одну букву x1 с вероятностью 8
и

переупорядочим список:

13
1 1 1 1 1 1 1 
P1 =  , , , , , ,  , X1 = {x1, x2, x3, x4, x1, x5, x6}.
 4 4 8 8 8 16 16 

3. Повторим шаг 2 до тех пор, пока не останется одна буква в списке:


1 1 1 1 1 1 
P 2 =  , , , , , , X2 = {x1, x2, x3, x4, x1, x2};
4 4 8 8 8 8

1 1 1 1 1
P3 =  , , , ,  , X3 = {x1, x2, x3, x3, x4};
4 4 4 8 8

1 1 1 1 
P4 = , , , , X4 = {x1, x2, x3, x4};
4 4 4 4

1 1 1 
P5 =  , ,  , X5 = {x5, x1, x2};
2 4 4

1 1
P6 =  , , X6 = {x5, x6};
2 2

P 7 = (1) , X7 = {x7}.
4. Присвоим двоичные коды символам:
x7: x5 = 0, x6 = 1;
x6: x1 = 10, x2 = 11;
x5: x3 = 00, x4 = 01;
x4: x3 = 010, x4 = 011;
x3: x1 = 000, x2 = 001;
x2: x5 = 0010, x6 = 0011;
x1: x7 = 0000, x8 = 0001.
Таким образом, получены следующие коды исходных символов:
x1 = 10, x2 = 11, x3 = 010, x4 = 011, x5 = 0010, x6 = 0011, x7 = 0000, x8 = 0001.
Средняя длина кода равна
8 1 1 1
n = ∑ ni pi = 2 ⋅ 2 ⋅ + 2 ⋅ 3 ⋅ + 4 ⋅ 4 ⋅ = 2.75 ,
i =1 4 8 16

что совпадает со средней длиной кода Шеннона-Фано и с энтропией.


Способом добиться наименьшей средней длины кода на один символ
является блочное кодирование. При блочном кодировании коды
присваиваются не отдельным символам сообщений, а их сочетаниям. При
увеличении числа символов в сочетании средняя длина кода на один символ
приближается к энтропии. Например, пусть имеются две буквы алфавита – A
14
и B, с вероятностями появления 0.9 и 0.1 соответственно. Закодировать их
можно, присвоив 0 одному символу и 1 – другому:
A = 0, B = 1.
Средняя длина кода в этом случае будет равна 1 биту:
n = 1 ⋅ 0.9 + 1 ⋅ 0.1 = 1 .

А энтропия равна H ( X ) = −0.9 ⋅ log 2 0.9 − 0.1 ⋅ log 2 0.1 ≈ 0.47 . Избыточность
составляет около 53%. Если же закодировать двухбуквенные сочетания XiXj,
Xi, Xj ∈ {A, B} с вероятностями p(XiXj) =pipj, то по методу Шеннона-Фано
можно получить коды, представленные в таблице 2.
Таблица 2
Блочное кодирование Шеннона-Фано
XiXj pipj Шаг Код

1 2 3

AA 0.81 0   0
AB 0.09 0  10
BA 0.09 1 1 0 110
BB 0.01 1 111
Тогда средняя длина кода двухбуквенного блока будет равна n2 ≈1.29 , а на
одну букву будет приходиться n1 ≈ 0.645 . Избыточность в этом случае будет
составлять уже только около 17%. Если мы возьмем сочетания из трех букв,
то получим еще лучший результат и т.д. Увеличивая длину блоков можно
как угодно близко приблизиться к оптимальному значению энтропии.

2. Порядок выполнения лабораторной работы


1. Ознакомиться с основными сведениями об оптимальном кодировании.
2. Получить задание на выполнение лабораторной работы.
3. Выполнить необходимые расчеты с помощью программы Microsoft Excel.
4. Написать и отладить программы необходимых расчетов на языке C++ в
среде Microsoft Visual Studio.
5. Сделать выводы о свойствах кодов.
6. Оформить отчет о выполнении лабораторной работы.
7. Ответить на контрольные вопросы.
15
3. Контрольные вопросы
1. В чем заключается кодирование и декодирование сообщений?
2. Что такое префиксные коды?
3. В чем заключается неравенство Крафта?
4. Как определить нижний предел средней длины кода?
5. Каковы условия построения оптимальных кодов?
6. Каковы принципы построения оптимальных кодов?
7. При каком условии равномерный код будет оптимальным?
8. Как построить коды Шеннона-Фано?
9. Как построить коды Хаффмена?
10. В чем заключается блочное кодирование?

4. Задания на лабораторную работу


1. Определить вероятности появления символов заданного источника с
алфавитом A = {a, b, c, d} из таблицы 3 (использовать частоты символов).
2. Определить энтропию сообщения.
3. Построить коды Шеннона-Фано и Хаффмана для отдельных символов
сообщения и для двух- и трехбуквенных сочетаний символов.
4. Выполнить декодирование полученных кодов.
5. Определить среднюю длину и избыточность для всех кодов.
6. Определить наиболее оптимальное кодирование для источника сообщений.
Таблица 3
Сообщения дискретного источника
№ Сообщение
1 abcaaaabacabbacbbaccbbaccbbddadadaa
2 bcabbcdabacbbacbbddcbbaccbbdbdadaac
3 aaabacabbacbbaccabcabbaccbbddadadaa
4 abcaaaaabbacbaacccabaccbbaccbbddadd
5 aaddaddabacabbacbbaccbbaccbbddadada
6 cccaddabbbaccaabcaaaabacabbacbbacbb

16
7 dbdaadabacabbacbbaccbbaccbbddadadac
8 bbbbbaabacabbacbbaccbbacdbbddadadac
9 aacabaaaacdbbacbddccbbaccbbddadadbb
1 dddaadabbbabbacbbaccbbaccbbddadddaa
0
1 abcccccbacabbacbbaddbdaccbbddadadcc
1
1 abcbbbbbacabbacddacdbbaccbbadadaddd
2

17

Вам также может понравиться