Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
480
Добавлен:
19.02.2016
Размер:
1.17 Mб
Скачать

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

Алгоритм Хаффмана — адаптивний алгоритм оптимального префіксного кодування алфавіту з мінімальною надлишкою, який був розроблений в 1952 р. аспірантом Массачусетського технологічного інституту Д.Хаффманом.

Цей алгоритм кодування складається з двох основних етапів:

1) побудова оптимального кодового дерева;

2) побудова відображення код-символ на основі побудованого дерева.

Ідея алгоритму полягає в наступному: якщо відомі ймовірності символів в повідомленні, то можна описати процедуру побудови кодів змінної довжини бітів. Символам з більшою ймовірністю ставляться у відповідність коротші коди.

Класичний алгоритм Хаффмана на вході отримує таблицю частот символів (як часто вони зустрічаються в повідомленні). Далі на підставі цієї таблиці будується дерево кодування Хаффмана (Н-дерево):

1. Символи вхідного алфавіту утворюють список вільних вузлів. Кожен лист має вагу, яка може дорівнювати або ймовірності, або кількості входжень символу в повідомлення.

2. Вибираються два вільні вузли дерева з найменшими вагами.

3. Створюється їх «батько» з вагою, що рівною їх сумарній вазі.

4. «Батько» додається в список вільних вузлів, а двоє його «дітей» (нащадків) видаляються з цього списку.

5. Одній дузі, що виходить з «батька», ставиться у відповідність 1, інший — 0.

6. Кроки, починаючи з другого, повторюються до тих пір, поки в списку вільних вузлів не залишиться тільки один вільний вузол. Він і вважатиметься коренем дерева.

Цей метод застосовується при стисненні фото- і відеозображень (JPEG, стандарти стиснення MPEG), в архіваторах (PKZIP, LZH та інш.), в протоколах передачі даних MNP5 і MNP7.

ЗАВДАННЯ № 2. Кодування методом Хаффмана

1. Кодом Хаффмана закодувати повідомлення:

ОБОРОНОСПОСОБНОСТЬ.

2. Визначити коефіцієнт стиснення.

ТЕХНОЛОГІЯ РОБОТИ

1. Кодування повідомлення. Повідомлення містить 18 символів (букв). Статистика появи букв в повідомленні приведена в табл. 1.

Розташовуємо букви в порядку убування частоти. Отримуємо наступну послідовність: О7 С3 Б2 Н2 П1 Р1 Т1 Ь1. Згідно з алгоритмом Хаффмана побудуємо кодове дерево, яке приведене на рис. 3.

Рис. 3. Послідовність та дерево кодування Хаффмана

Кодова послідовність кожного символу приведена у табл. 3.

Таблиця 3. Кодування символів алгоритмом Хаффмана

Символ початкового повідомлення

Кодування алгоритмом Шеннона-Фано

Кодування KOI8-U

Б

0000

E2(16) = 1110 0010

Н

1000

EE(16) = 1110 1110

О

1

EF(16) = 1110 1111

П

0110

F0(16) = 1111 0000

Р

1110

F2(16) =1111 0010

С

100

F3(16) = 1111 0011

Т

0010

F4(16) = 1111 0100

Ь

1010

F8(16) = 1111 1000

Таким чином, отримана наступна кодова послідовність повідомлення:

О

Б

О

Р

О

Н

О

С

П

О

С

О

Б

Н

О

С

Т

Ь

1

0000

1

1110

1

1000

1

100

0110

1

100

1

0000

1000

1

100

0010

1010

Довжина закодованого повідомлення становить VC = 48 біт.

2. Визначення коефіцієнту стиснення. Якщо закодувати повідомлення рівномірним кодом KOI8-U (кожний символ кодується 8 бітами – див. табл.. 7.3), то довжина повідомлення складе VП = 144 біта. Таким чином, коефіцієнт стиску дорівнює , тобто досягнуто стиск в 3 рази.