
1.5 Примеры решения задач
Код Шеннона - Фано строится с помощью дерева или таблицы. Построение этого дерева начинается от корня. Всё множество кодируемых элементов соответствует корню дерева. Оно разбивается на два подмножества с примерно одинаковыми суммарными вероятностями. Эти подмножества соответствуют двум вершинам второго уровня, которые соединяются с корнем. Далее каждое из этих подмножеств разбивается на два подмножества с примерно одинаковыми суммарными вероятностями. Им соответствуют вершины третьего уровня. Если подмножество содержит единственный элемент, то ему соответствует концевая вершина кодового дерева; такое подмножество разбиению не подлежит. Подобным образом поступаем до тех пор, пока не получим все концевые вершины. Ветви кодового дерева размечаем символами 1 и 0.
При построении кода Шеннона - Фано разбиение множества элементов может быть произведено, вообще говоря, несколькими способами. Выбор разбиения на уровне n может ухудшить варианты разбиения на следующем уровне и привести к неоптимальности кода в целом. Другими словами, оптимальное поведение на каждом шаге пути ещё не гарантирует оптимальности всей совокупности действий. Поэтому код Шеннона - Фано не является оптимальным в общем смысле, хотя и дает оптимальные результаты при некоторых распределениях вероятностей. Для одного и того же распределения вероятностей можно построить, вообще говоря, несколько кодов Шеннон - Фано, и все они могут дать различные результаты. Если построить все возможные коды Шеннона - Фано для данного распределения вероятностей, то среди них будут находиться и все коды Хаффмана, то есть оптимальные коды.
Пример кодового дерева.
Исходные символы: A,B,C,D,E,F
ABCDEF (215)
1
0
1
ABC(107)
DEF(108)
1
0
0
A(50)
BC(57)
EF(59)
D(49)
1
1
0
0
C(18)
F(24)
E(35)
B(39)
Полученный код: A-11, B-101, C-100, D-00, E-011, F-010
Задача №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.
Для построения кода целесообразно построить таблицу следующего вида (таблица «2»):
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 |
|
|
|
|
|
таблица «2».
Далее, следуя алгоритму, начинаем заполнять оставшиеся ячейки таблицы (таблица «3»)
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 |
Таблица «3».
Полученные коды: 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. Расположим эти символы в таблице 1 в порядке убывания их вероятностей.
Первичный алфавит |
D |
B |
E |
A |
C |
F |
Вероятность появления |
0,3 |
0,2 |
0,2 |
0,15 |
0,1 |
0,05 |
Таблица «1»
Кодирование осуществляется следующим образом. Все символы делятся на две группы с сохранением порядка следования (по убыванию вероятностей появления), так чтобы суммы вероятностей в каждой группе были приблизительно равны 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) образуют вторую группу. Далее по имеющемуся алгоритму распределим нули и единицы в соответствующие знаки кода каждой подгруппы.
Осуществляем деление на подгруппы по той же схеме до тех пор, пока не получим группы, состоящие из одного элемента. Процедура деления изображена в нижеприведенной таблице (символ «-» означает, что данный знак кода отсутствует).
Первичный алфавит |
Вероятности появления символов |
Знаки кода символа |
Код символа |
Длина кода |
|||
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 |
Полученный код удовлетворяет условию Фано, следовательно, он является префиксным. Средняя длина этого кода равна:
Среднее количество информации на один символ первичного алфавита равно:
Теперь, найдем избыточность нашего алфавита:
То есть избыточность кода Шеннона-Фано для нашего шестибуквенного алфавита составляет всего около 1,7 %. Для русского алфавита избыточность кодирования кодом Шеннона-Фано составила бы примерно 1,47%.
Задача №3.
Даны
символы a, b, c, d с частотами
;fb
=0.25;
;
.
Построить эффективный код методом
Шеннона-Фано.
Сведем исходные данные в таблицу, упорядочив их по невозрастанию частот:
Исходные символы |
Частоты символов |
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.
Определим эффективность построенного кода по формуле:
Icp = 0,5*1 + 0,25*2 + 0,125*3 + 0,125*3 = 1,75.
Поскольку при кодировании четырех символов кодом постоянной длины требуется два двоичных разряда, сэкономлено 0,25 двоичного разряда в среднем на один символ.
Кодирование Шеннона - Фано является достаточно старым методом сжатия, и на сегодняшний день оно не представляет особого практического интереса. В большинстве случаев, длина последовательности, сжатой по данному методу, равна длине сжатой последовательности с использованием кодирования Хаффмана. Но на некоторых последовательностях могут сформироваться неоптимальные коды Шеннона - Фано, поэтому более эффективным считается сжатие методом Хаффмана.
Выводы по первой главе:
Кодирование информации является сложным, но необходимым процессом.
Сжатие информации представляет собой операцию, в результате которой данному коду или сообщению ставится в соответствие более короткий код или сообщение.
Алгоритмы сжатия информации бывают обратимыми и необратимыми.
Префиксный код - код со словом переменной длины, имеющий такое свойство: если в код входит слово a, то для любой непустой строки b слова ab в коде не существует.
Алгоритм использует коды переменной длины: часто встречающийся символ кодируется кодом меньшей длины, редко встречающийся -кодом большей длины.
Коды Шеннона-Фано префиксные, то есть никакое кодовое слово не является префиксом любого другого.
Для более подробного изучения и рассмотрения на практике алгоритма Шеннона-Фано необходимо разработать проект.