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

Алгоритм Шеннона-Фано

Алгоритм Шеннона–Фано — один з перших алгоритмів стиснення, який уперше сформулювали американські учені Шеннон і Фано в 1948 р. Алгоритм реалізує імовірнісний метод стиснення і використає коди змінної довжини: символ, що часто зустрічається, кодується кодом меншої довжини, що рідко зустрічається — кодом більшої довжини. Код Шеннона–Фано є префіксним, тобто ніяке кодове слово не є префіксом будь-якого іншого. Ця властивість дозволяє однозначно декодувати будь-яку послідовність кодових слів.

Код Шеннона-Фано будується за допомогою двійкового дерева. Побудова цього дерева починається від кореня. Уся множина кодованих елементів відповідає кореню дерева.

1) Підрахувати, як часто зустрічаються різні символи в початковому повідомленні.

2) Впорядкувати початкову множину символів по не зростанню їх частот.

3) Поділити список символів на дві частини (назвемо їх першою і другою частими) так, щоб суми частот обох частин були точно або приблизно рівні. У разі, коли точної рівності досягти не вдається, різниця між сумами має бути мінімальна.

4) Кодовим комбінаціям першої частини дописується 0, кодовим комбінаціям другої частини дописується 1.

5) Аналізують першу частину: якщо вона містить тільки один символ, робота з нею закінчується, - вважається, що код для її символів побудований, і виконується перехід до кроку 6) для побудови коду другої частини. Якщо символів більше одного, переходять до кроку 3) і процедура повторюється з першою частиною як з самостійним впорядкованим списком.

6) Аналізують другу частину: якщо вона містить тільки один символ, робота з нею закінчується і виконується звернення до списку (крок 7), що залишився. Якщо символів більше одного, переходять до кроку 3) і процедура повторюється з другою частиною як з самостійним списком.

7) Аналізується список, що залишився: якщо він порожній – код побудований, робота закінчується. Якщо ні, – виконується крок 3).

8) Кодування символів починається з кореня дерева.

ЗАВДАННЯ № 1. Кодування методом Шеннона-Фано

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

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

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

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

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

Таблиця 1. Частота символі, які зустрічаються в початковому повідомленні

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

Як часто зустрічається символ в початковому повідомленні

Позначення при кодуванні

Б

2

Б2

Н

2

Н2

О

7

О7

П

1

П1

Р

1

Р1

С

3

С3

Т

1

Т1

Ь

1

Ь1

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

Рис. 2. Дерево кодування Шеннона-Фано

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

Таблиця 2. Кодування символів алгоритмом Шеннона-Фано

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

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

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

Б

100

E2(16) = 1110 0010

Н

101

EE(16) = 1110 1110

О

00

EF(16) = 1110 1111

П

1100

F0(16) = 1111 0000

Р

1101

F2(16) =1111 0010

С

01

F3(16) = 1111 0011

Т

1110

F4(16) = 1111 0100

Ь

1111

F8(16) = 1111 1000

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

О

Б

О

Р

О

Н

О

С

П

О

С

О

Б

Н

О

С

Т

Ь

00

100

00

1101

00

101

00

01

1100

00

01

00

100

101

00

01

1110

1111

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

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