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

Алгоритм Хаффмена применяется не к самим буквам а к их блокам Тогда теорема Шеннона распространяется уже не буквы, а на блоки. В качестве вероятности блока берется произведение вероятностей, входящих в него букв. Если стоимость блока поделить на количество букв в нем, то «получим стоимость кодирования на одну букву».

Пример.

Пусть случайный источник генерирует 0 с вероятностью 0,25 и единицу с вероятностью 0,75. Стоимость кодирования равна 1 при энтропии 0,81.

Если поток из 0 и 1 будем интерпретировать как пары (блоки из двух букв), то это будет равносильно необходимости передавать четыре буквы с вероятностями:

a

00

1/16

000

b

01

3/16

001

c

10

3/16

01

d

11

9/16

1

Применяем алгоритм Хаффмена:

(a, b, c, d) → ((a, b), c, d) → (a, b, c), d)

Стоимость на блок l (xx) = pi li = 3/16 + 9/16 + 6/16 + 9/16 = 27/16.

Стоимость на одну букву l(x) = 27/32 = 0, 844.

Если перейти теперь к блокам длины три, то получим:

a 000 1/64 00000

b 001 3/64 00001

c 010 3/64 00010

d 011 9/64 010

e 100 3/64 00011

f 101 9/64 001

g 110 9/64 001

h 111 27/64 1

Алгоритм Хаффмена:

(a, b, c, D, e, f, g, H) → ((a, b), c, D, e, f, g, H) → ((a, b), (c, e), D, f, g, H) → ((a, b, c, e), D, f, g, H) → ((a, b, c, e), (D, f), g, H) → ((a, b, c, e, g), (D, f), H) → ((a, b, c, D, e, f, g), H)

1

f

h

d

b

0

(a,b,c,d,e,f,g)

(d,f)

e

g

c

(a,b,c,e,g)

(c,e)

(a,b)

(a,b,c,e)

a

Стоимость кодирования на блок l(xxx) = 5/64 + 15/64 + 15/64 + 15/64 +28/64 + 15/64 +27/64 +27/64 +27/64 = 50/64 +108/64 = 158/64 = 2,46875.

В переводе на одну букву получаем l(x)=0,823.

Процесс можно продолжать.

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

    1. Алгоритм арифметического кодирования

Появление этого алгоритма было связано с попыткой обойти сложности кодирования (декодирования) блочного алгоритма. Однако сравнивать его с предыдущими алгоритмами математически некорректно. Дело в том, что блочное кодирование не дает префиксного кода и, вообще, оно не переводит двоичные слова в двоичные слова. В нем используется третий символ – разделитель (обозначим его *). Уже на канальном уровне приемник различает его от 0 и 1.

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

Единственная почва для сравнения – считать, что разделитель , с точки зрения стоимости, эквивалентен биту.

Принципы арифметического кодирования заключаются в следующем:

  1. - кодовое слово. Ему ставится в соответствие точка

  2. Строится разбиение отрезка на совокупность отрезков:

  3. Длина отрезка пропорциональна «вероятности» слова, закодированной точкой этого отрезка.

  4. Точка имеет вид

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

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

Декодирование.

Шаг 1: Определяем интервал, содержащий текущий код. По нему определяем 1 символ исходящего сообщения. Если этот маркер кодирование заканчивает.

Шаг 2: Из текущего кода вычитается нижняя граница содержащего его интервала, и полученная разность делится на длину интервала. Получаем новое число. Находим интервал для него и т.д.

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