Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОТЦС_Ч1_2008.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
4.62 Mб
Скачать

2.3.3. Алгоритм Шеннона–Фано

Другим, очень похожим на алгоритм Хаффмена, способом статистического кодирования является кодирование по методу Шеннона–Фано. Кодирование в соответствии с этим алгоритмом производится следующим образом:

1. Сначала все буквы из алфавита сообщения записывают в порядке убывания их вероятностей.

2. Затем всю совокупность букв разбивают на две примерно равные по сумме вероятностей группы; одной из них (в группе может быть любое число символов, в том числе один) присваивают символ “1”, другой – “0”;

3. Каждую из этих групп снова разбивают (если это возможно) на две части и каждой из частей присваивают “1” и “0” и т.д.

Пример процедуры кодирования по методу Шеннона–Фано приведен в табл. 2.3.

Таблица 2.3

Буква

Р(i )

I

II

III

IV

V

Kод

ni Pi

А

0.6

1

1

0.6

Б

0.2

0

1

1

011

0.6

В

0.1

0

010

0.3

Г

0.04

0

1

001

0.12

Д

0.025

0

1

0001

0.1

Е

0.015

0

00001

0.075

Ж

0.01

1

000001

0.06

З

0.01

0

000000

0.06

Средняя длина кодов при использовании метода Шеннона–Фано получается немного большей, а степень сжатия – меньшей, чем при использовании алгоритма Хаффмена.

2.3.4. Блочные коды

Для увеличения эффективности кодирования и получения большей степени сжатия процедура кодирования Хаффмена может применяться не к отдельным символам, а к их блокам. В этом случае вектор данных разбивается на блоки заданной длины и затем каждый блок заменяют кодовым словом из префиксного множества двоичных слов. Полученную последовательность кодовых слов объединяют в выходную двоичную последовательность.

В качестве примера сожмем вектор данных X = (0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1), используя блочный код второго порядка (порядок кода – это размер блоков, на которые разбивается последовательность).

Сначала разобьем вектор X на блоки длины 2: 01, 10, 10, 01, 11, 10, 01, 01.

Будем рассматривать эти блоки как элементы нового “гипералфавита” {01, 10, 11}. Чтобы определить, какой код назначить какому символу этого нового алфавита, найдем вектор частот появлений блоков. Получим вектор частот (4, 3, 1), то есть наиболее часто встречающийся блок 01 появляется четыре раза, следующий по частоте встречаемости блок 10  три раза и наименее часто встречающийся блок 11  лишь один раз.

В качестве таблицы кодирования для алфавита из трех символов с таким вектором частот можно выбрать префиксное множество S1 (см. подразд. 2.3.1) (табл. 2.4).

Таблица 2.4

Таблица кодера

Блок

Кодовое слово

01

0

10

10

11

11

Заменяя каждый блок присвоенным ему кодовым словом из таблицы кодера, получим последовательность кодовых слов:

0, 10, 10, 0, 11, 10, 0, 0.

Объединяя эти кодовые слова вместе, имеем выходную последовательность кодера:

B(X) = (0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0).

Длина полученной последовательности составляет 12 бит, против 16 бит исходной последовательности, а скорость кода R = 12/16 = 0.75 бит на символ (в исходной последовательности – 1 бит/символ).