Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
toi.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
99.65 Кб
Скачать

Лекция2.Оптимальное кодирование.Критерий оптимальности Оптимальное кодирование.Критерий оптимальности Оптимальное кодирование

 

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

Вопрос существования таких кодов составляет суть одной из основных теорем теории информации - теоремы кодирования, доказанной К. Шенноном. Приведем одну из эквивалентных формулировок данной теоремы.

Теорема кодирования. Сообщения произвольного источника информации Z с энтропией H(Z) всегда можно закодировать последовательностями в алфавите B, состоящем из M символов, так, что средняя длина кодового слова lcp будет сколь угодно близка к величине lmin = H(Z)/log2M, но не меньше нее.

Доказательство этой теоремы в силу его сложности не рассматривается. Теорема утверждает, что разность (lcp - lmin ) можно сделать как угодно малой. В этом и заключается задача методов оптимального кодирования.

Вернемся к рассмотрению алфавитного источника информации, генерирующего сообщения в символах алфавита А. Поскольку избыточность кода L задается формулой

очевидно, что чем меньше lcp , тем оптимальнее код. Для уменьшения lcp следует кодировать часто встречающиеся символы более короткими словами и наоборот. На соблюдении этого требования основаны все методы оптимального кодирования. Кроме того, для обеспечения декодирования неравномерного кода важно соблюдать принцип префиксности: никакое кодовое слово не должно являться началом другого кодового слова.

Приведем два наиболее известных метода оптимального побуквенного кодирования. Для простоты изложения возьмем двоичный алфавит B = {0,1} в качестве кодового.

Метод Шеннона - Фано

Шаг 1. Упорядочиваем символы исходного алфавита в порядке невозрастания их вероятностей. (Записываем их в строку.)

Шаг 2. Не меняя порядка символов, делим их на две группы так, чтобы суммарные вероятности символов в группах были по возможности равны.

Шаг 3. Приписываем группе слева "0", а группе справа "1" в качестве элементов их кодов.

Шаг 4. Просматриваем группы. Если число элементов в группе более одного, идем на Шаг 2. Если в группе один элемент, построение кода для него завершено.

Рассмотрим работу описанного алгоритма на примере кодирования алфавита A = {a1,a2, a3, a4, a5, a6}, символы которого встречаются с вероятностями (0,25; 0,05; 0,25; 0,1; 0,25; 0,1) соответственно. Результат кодирования изображен на рис. 5.1.

Очевидно, что процесс построения кода в общем случае содержит неоднозначность, так как мы не всегда можем поделить последовательность на два равновероятных подмножества. Либо слева, либо справа сумма вероятностей будет больше. Критерием лучшего варианта является меньшая избыточность кода. Заметим также, что правильное считывание кода - от корня дерева к символу - обеспечит его префиксность.

Метод Хаффмана

Шаг 1. Упорядочиваем символы исходного алфавита в порядке невозрастания их вероятностей. (Записываем их в столбец.)

Шаг 2. Объединяем два символа с наименьшими вероятностями. Символу с большей вероятностью приписываем "1", символу с меньшей - "0" в качестве элементов их кодов.

Шаг 3. Считаем объединение символов за один символ с вероятностью, равной сумме вероятностей объединенных символов.

Шаг 4. Возвращаемся на Шаг 2 до тех пор, пока все символы не будут объединены в один с вероятностью, равной единице.

Считывание кода идет от корня двоичного дерева к его вершинам с обозначением символов. Это обеспечивает префиксность кода. Метод Хаффмана также содержит неоднозначность, поскольку в алфавите могут оказаться несколько символов с одинаковой вероятностью, и код будет зависет от того, какие символы мы будем объединять в первую очередь. Мы видим, что код Шеннона - Фано и код Хаффмана для заданного алфавита отличаются. На вопрос, какой из них лучше, даст ответ проверка на оптимальность.

 Описанные методы легко применить не только для двоичного кодирования, но и для кодирования алфавитом, содержащим произвольное число символов M. В этом случае в методе Шеннона - Фано идет разбиение последовательности символов на M равновероятных групп, в методе Хаффмана - объединение в группы по M символов.

Проверка кода на оптимальность. Для оценивания оптимальности кода используют разные критерии. Основным показателем является коэффициент относительной оптимальности копт, вычисляемый по формуле

Из теоремы кодирования следует, что эта величина не превышает единицы. И чем меньше она отличается от единицы, тем более эффективным считается код.

Следующая характеристика оптимальности кода обусловлена оценкой распределения символов кодового алфавита: код тем ближе к оптимальному, чем меньше различаются вероятности появления различных символов кодового алфавита в закодированном сообщении. Среднее число появлений b-го (j = 1, ..., M) символа кодового алфавита можно оценить по формуле

где N - объем кодового алфавита;

mij - число bj-х символов в коде а-го символа исходного алфавита;

pi - вероятность появления а-го символа.

Рассмотрим эти оценки оптимальности применительно к двоичному кодированию, как наиболее распространенному. Признаки оптимальности двоичного кода вытекают из предыдущих формул при условии, что кодовый алфавит равновероятен, т. е. H(B) = 1.

Признак 1. Средняя длина кодового слова должна быть приблизительно равна энтропии кодируемого алфавита:       

 Признак 2. Среднее число нулей и единиц в кодовой последовательности должно быть приблизительно одинаково:

Здесь n0i - число нулей в коде i -го символа;

n1i - число единиц в коде i -го символа;

Pi - вероятность i -го символа;

N - число символов в исходном алфавите.

Термин "приблизительно" условимся понимать как с точностью до 10%.

Выполним проверку на оптимальность двоичного кода, полученного методом Шеннона - Фано для алфавита A = {a1,a2, a3, a4, a5, a6} с вероятностями появления отдельных символов (0,25 - 0,3 - 0,15 - 0,2 - 0,05 - 0,05) соответственно. Для проверки занесем все необходимые данные в таблицу, расположив в ней для удобства символы в порядке невозрастания вероятностей.

a,i

Pi

Код

li

n0i

n1i

a2

0,3

0 0

2

2

0

a1

0,25

0 1

2

1

1

a4

0,2

1 0

2

1

1

a3

0,15

1 1 0

3

1

2

a5

0,05

1 1 1 0

4

1

3

a6

0,05

1 1 1 1

4

0

4

Блочное кодирование, в отличие от побуквенного, формирует коды для буквосочетаний составленных из m символов исходного алфавита.

Буквосочетания можно рассматривать как новый, расширенный алфавит объемом K = Nm, где N - объем исходного алфавита; m - число символов в буквосочетании.

Блочное кодирование применяется к алфавитам, в которых вероятность появления одной какой-то буквы значительно превышает вероятность появления других букв. Например алфавит {a, b, с} с вероятностями pa = 0,7; pb = 0,2; pc = 0,1. Методы побуквенного кодирования здесь не будут эффективными, так как невозможно обеспечить разбиение на равновероятные подгруппы и объединение равноценных групп элементов. Расширенный алфавит имеет более сглаженную разницу в вероятностях буквосочетаний, что и позволяет добиться большей оптимальности при его кодировании.

Из теории вероятностей известно, что если буквы появляются независимо одна от другой, то вероятность появления некоторой последовательности букв равна произведению вероятностей входящих в нее букв. Исходя из этого, рассчитываем вероятности для буквосочетаний и кодируем их одним из методов побуквенного оптимального кодирования (т. е. методами Шеннона - Фано или Хаффмана).

Рассмотрим это для приведенного выше алфавита и убедимся в большей эффективности блочного кодирования в подобных ситуациях.

Буква

Pi

Код

li

Pili

a

0,7

0

1

0,7

b

0,2

1 0

2

0,4

с

0,1

1 1

2

0,2

 

Энтропия данного алфавита равна

 Нср = -0,7 • log2 0,7 - 0,2 • log2 0,2 - 0,1 • log2 0,1 1,157 бит/симв ;

средняя длина кодового слова lcp= 0,7 + 2 • 0,2 + 2 • 0,1 = 1,3 дв. симв;

 избыточность кода L1 = 1,3 -1,157 = 0,143 дв. симв.

Теперь составим таблицу сочетаний из 2 букв:

 

Сочетание

Pi

Код Ш - Ф

li

Pi/i

Aa

0,49

00

1

0,49

Ab

0,14

    100

3

0,42

Ba

0,14

101

3

0,42

ac

0,07

    1100

4

0,28

Ca

0,07

1101

4

0,28

Bb

0,04

1110

4

0,16

bc

0,02

11110

5

0,10

Cb

0,02

111110

6

0,12

cc

0,01

111111

6

0,06

 

L2 = 1,165 – 1,157 = 0,008 дв. симв.

При сравнивании результатов кодирования очевидно, что применение блочного кодирования позволило снизить избыточность кода почти в 20 раз.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]