- •«Засоби архівації та стиснення даних»
- •1. Методи архівації і стиснення даних Поняття технології стиснення даних
- •Основні формати упаковки даних
- •Методи стиснення даних
- •Алгоритм Шеннона-Фано
- •Алгоритм Хаффмана
- •2. Прийоми роботи з програмами-архіваторами Огляд сучасних архіваторів
- •Робота з програмою-архіватором WinZip
- •1. Перегляд архівного файлу у форматі .Zip
- •2. Витягання файлів з zip-архіву
- •3. Створення zip-архіву
- •4. Захист zip-архіву
- •5. Створення саморозпакувального zip-архіву
- •6. Дослідження ефективності алгоритмів стиснення архіватора WinZip
- •Робота з програмою-архіватором WinRar
- •Дослідження алгоритмів стиснення програми WinRar
- •Висновки
- •Контрольні питання
- •Завдання на самостійну роботу
Алгоритм Шеннона-Фано
Алгоритм Шеннона–Фано — один з перших алгоритмів стиснення, який уперше сформулювали американські учені Шеннон і Фано в 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 рази.