
5 Примеры решения задач
Задача №1.
Пусть алфавит состоит из восьми символов, виды символов и их вероятности следующие: x1→1/4, x2→1/4,x3→1/8,x4→1/8, x5→1/16,x6→1/16, x7→1/16,x8→1/16.
Для построения кода целесообразно построить таблицу «1» следующего вида:
x |
P |
|
|
|
|
код |
x1 |
1/4 |
|
|
|
|
|
x2 |
1/4 |
|
|
|
|
|
x3 |
1/8 |
|
|
|
|
|
x4 |
1/8 |
|
|
|
|
|
x5 |
1/16 |
|
|
|
|
|
x6 |
1/16 |
|
|
|
|
|
x7 |
1/16 |
|
|
|
|
|
x8 |
1/16 |
|
|
|
|
|
таблица «1».
Далее, следуя алгоритму, начинаем заполнять оставшиеся ячейки таблицы (таблица «2»)
x |
P |
|
|
|
|
код |
x1 |
¼ |
0 |
0 |
|
|
00 |
x2 |
¼ |
0 |
1 |
|
|
01 |
x 3 |
1/8 |
1 |
0 |
0 |
|
100 |
x4 |
1/8 |
1 |
0 |
1 |
|
101 |
x 5 |
1/16 |
1 |
1 |
0 |
0 |
1100 |
x6 |
1/16 |
1 |
1 |
0 |
1 |
1101 |
x7 |
1/16 |
1 |
1 |
1 |
0 |
1110 |
x8 |
1/16 |
1 |
1 |
1 |
1 |
1111 |
Таблица «2».
Полученные коды: x1→00
x1→01
x1→100
x1→101
x1→1100
x1→1101
x1→1110
x1→1111
Задача №2.
Пусть имеется первичный алфавит, состоящий из шести символов: {A; B; C; D; E; F}, также известны вероятности появления этих символов в сообщении, они равнысоответственно 0,15; 0,2; 0,1; 0,3; 0,2; 0,05. Расположим эти символы в таблице «3»в порядке убывания их вероятностей.
Первичный алфавит |
D |
B |
E |
A |
C |
F |
Вероятность появления |
0,3 |
0,2 |
0,2 |
0,15 |
0,1 |
0,05 |
Таблица «3»
Кодирование осуществляется следующим образом. Все символы делятся на две группы с сохранением порядка следования (по убыванию вероятностей появления), так чтобы суммы вероятностей в каждой группе были приблизительно равны 38, а, следовательно, абсолютные разности суммарных
вероятностей каждой группы близки к нулю.
В нашем примере в первую группу попадают символы D и B, их суммарная вероятность использования равна 0,5; все остальные буквы, также имеющие суммарную вероятность появления 0,5 попадают во вторую группу. Поставим ноль в первый знак кодов для всех символов из первой группы, а первый знак кодов символов второй группы установим равным единице. Продолжим деление каждой группы. В первой группе два элемента, и деление на подгруппы здесь однозначно: в первой подгруппе будет символ D, а во второй - символ B. Во второй группе теоретически возможны два способа деления на подгруппы:
(Е) и (А, С, F)
(E, A) и (C, F)
(E, A, C) и (F)
В первом случае абсолютная разность суммарных вероятностей будет
Во втором и третьем варианте деления аналогичные величины будут 0,2 и 0,4 соответственно.
Согласно алгоритму необходимо выбрать тот способ деления, при котором суммы вероятностей в каждой подгруппе были примерно одинаковыми, а, следовательно, вычисленная разность минимальна. Соответственно наилучшим способом деления будет следующий вариант: символ (E) остается в первой подгруппе, а символы (A, C, F) образуют вторую группу. Далее по имеющемуся алгоритму распределим нули и единицы в соответствующие знаки кода каждой подгруппы.
Осуществляем деление на подгруппы по той же схеме до тех пор, пока не получим группы, состоящие из одногоэлемента. Процедура деления изображена в таблице «4» (символ «-» означает, что данный знак кода отсутствует)
Первичный алфавит |
Вероятности появления символов |
Знаки кода символа |
Код символа |
Длина кода |
|||
I |
II |
III |
IV |
||||
D |
0.3 |
0 |
0 |
- |
- |
00 |
2 |
B |
0.2 |
0 |
1 |
- |
- |
01 |
2 |
E |
0.2 |
1 |
0 |
- |
- |
10 |
2 |
A |
0.15 |
1 |
1 |
0 |
- |
110 |
3 |
C |
0.1 |
1 |
1 |
1 |
0 |
1110 |
4 |
F |
0.05 |
1 |
1 |
1 |
1 |
1111 |
4 |
Таблица «4»
Полученный код удовлетворяет условию Фано, следовательно, он является префиксным. Средняя длина этого кода равна:
Среднее количество информации на один символ первичного алфавита равно:
Теперь, найдем избыточность нашего алфавита:
То есть избыточность кода Шеннона - Фано для нашего шестибуквенного алфавита составляет всего около 1,7 %. Для русского алфавита избыточность кодирования кодом Шеннона - Фано составила бы примерно 1,47%.
Задача №3.
Даны
символы a, b, c, d с частотами
.
Построить эффективный код методом
Шеннона-Фано.
Сведем исходные данные в таблицу, упорядочив их по невозрастанию частот:
Исходные символы |
Частоты символов |
a |
0.5 |
b |
0.25 |
c |
0.125 |
d |
0.125 |
Первая линия деления проходит под символом a: соответствующие суммы Σ1 и Σ2 равны между собой и равны 0,5. Тогда формируемым кодовым комбинациям дописывается 1 для верхней (первой) части и 0 для нижней (второй) части. Поскольку это первый шаг формирования кода, двоичные цифры не дописываются, а только начинают формировать код.
Исходные символы |
Частоты символов |
Формируемый код |
a |
0.5 |
1 |
b |
0.25 |
0 |
c |
0.125 |
0 |
d |
0.125 |
0 |
В силу того, что верхняя часть списка содержит только один элемент (символ а), работа с ней заканчивается, а эффективный код для этого символа считается сформированным (в таблице, приведенной выше, эта часть списка частот символов выделена полужирным шрифтом).
Второе деление выполняется под символом b: суммы частот Σ1 и Σ2 вновь равны между собой и равны 0,25. Тогда кодовой комбинации символов верхней части дописывается 1, а нижней части – 0. Таким образом, к полученным на первом шаге фрагментам кода, равным 0, добавляются новые символы:
Исходные символы |
Частоты символов |
Формируемый код |
a |
0.5 |
1 |
b |
0.25 |
01 |
c |
0.125 |
00 |
d |
0.125 |
00 |
Поскольку верхняя часть нового списка содержит только один символ (b), формирование кода для него закончено (соответствующая строка таблицы вновь выделена полужирным шрифтом). Третье деление проходит между символами c и d: к кодовой комбинации символа c приписывается 1, коду символа d приписывается 0:
Исходные символы |
Частоты символов |
Формируемый код |
a |
0.5 |
1 |
b |
0.25 |
01 |
c |
0.125 |
001 |
d |
0.125 |
000 |
Поскольку обе оставшиеся половины исходного списка содержат по одному элементу, работа со списком в целом заканчивается.
Таким образом, получили коды:
а - 1, b - 01, c - 001, d - 000.
Определим эффективность построенного кода по формуле 1:
(1)
Поскольку при кодировании четырех символов кодом постоянной длины требуется два двоичных разряда, сэкономлено 0,25 двоичного разряда в среднем на один символ.
Кодирование Шеннона - Фано является достаточно старым методом сжатия, и на сегодняшний день оно не представляет особого практического интереса. В большинстве случаев, длина последовательности, сжатой по данному методу, равна длине сжатой последовательности с использованием кодирования Хаффмана. Но на некоторых последовательностях могут сформироваться неоптимальные коды Шеннона - Фано, поэтому более эффективным считается сжатие методом Хаффмана.
Выводы:
Кодирование информации является сложным, но необходимым процессом.
Префиксный код - код со словом переменной длины, имеющий такое свойство: если в код входит слово a, то для любой непустой строки b слова ab в коде не существует.
Алгоритм Шеннона - Фано использует коды переменной длины: часто встречающийся символ кодируется кодом меньшей длины, редко встречающийся - кодом большей длины.
Коды Шеннона - Фано префиксные, то есть никакое кодовое слово не является префиксом любого другого.
Коды Шеннона – Фано в настоящее время являются не практичными.