Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритм Шеннона - Фано.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
92.46 Кб
Скачать
  1. 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. Во второй группе теоретически возможны два способа деления на подгруппы:

  1. (Е) и (А, С, F)

  2. (E, A) и (C, F)

  3. (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 в коде не существует.

  • Алгоритм Шеннона - Фано использует коды переменной длины: часто встречающийся символ кодируется кодом меньшей длины, редко встречающийся - кодом большей длины.

  • Коды Шеннона - Фано префиксные, то есть никакое кодовое слово не является префиксом любого другого.

  • Коды Шеннона – Фано в настоящее время являются не практичными.