
- •«Засоби архівації та стиснення даних»
- •1. Методи архівації і стиснення даних Поняття технології стиснення даних
- •Основні формати упаковки даних
- •Методи стиснення даних
- •Алгоритм Шеннона-Фано
- •Алгоритм Хаффмана
- •2. Прийоми роботи з програмами-архіваторами Огляд сучасних архіваторів
- •Робота з програмою-архіватором WinZip
- •1. Перегляд архівного файлу у форматі .Zip
- •2. Витягання файлів з zip-архіву
- •3. Створення zip-архіву
- •4. Захист zip-архіву
- •5. Створення саморозпакувального zip-архіву
- •6. Дослідження ефективності алгоритмів стиснення архіватора WinZip
- •Робота з програмою-архіватором WinRar
- •Дослідження алгоритмів стиснення програми WinRar
- •Висновки
- •Контрольні питання
- •Завдання на самостійну роботу
Методи стиснення даних
Методи стиснення текстової інформації мають досить довгу історію. У основі алгоритмів стиснення подібної інформації лежить принцип мінімізації надлишку. Фундаментальна теорема Шеннона про кодування джерел говорить про те, що вартість кодування завжди не менше ентропії джерела, хоча може бути скільки завгодно близька до неї*. Це твердження встановлює теоретичні межі стиснення даних.
Основним поняттям теорії інформації є ентропія, яку можна неформально розглядати як міру кількості інформації в повідомленні. Під вартістю кодування розуміється середня довжина кодового слова (у бітах), що доводиться на один символ початкового тексту. Тоді надлишок кодування дорівнює різниці між вартістю кодування і ентропією початкового повідомлення в перерахунку на один символ.
Кодування має справу з потоком символів в деякому алфавіті, причому частоти появи символів різні. Метою кодування є перетворення потоку символів в потік бітів мінімальної довжини. Це досягається за рахунок зменшення надлишку вихідного потоку шляхом обліку частоти появи символів на вході: довжина коду має бути пропорційна інформації, що міститься у вхідному потоці.
Якщо розподіл частот символів відомий, то можна побудувати оптимальне кодування. Завдання ускладнюється, якщо цей розподіл заздалегідь невідомий. В цьому випадку існує два різні підходи:
1) проглянути вхідний потік і побудувати кодування на основі зібраної статистики (при цьому знадобиться два проходи по файлу). У вихідний потік у такому разі має бути записана схема застосованого кодування, яка буде використана потім декодером. Прикладом такого кодування є статичне кодування Хаффмена;
2) використовувати адаптивний кодер. Ідея полягає в тому, щоб міняти схему кодування залежно від початкових даних. Такий алгоритм однопрохідний і не вимагає передачі інформації про використане кодування в явному виді. Замість цього декодер, який читає кодований потік, синхронно з кодером змінює схему кодування. Адаптивне кодування дає велику міру стиснення, оскільки враховуються локальні зміни частот. Прикладом є динамічне кодування Хаффмена.
Статистичне кодування Хаффмена перетворює вхідні символи, які закодовані 8-бітовими двійковими послідовностями, у вихідні символи, закодовані послідовностями 0 і 1 змінної довжини. Довжина коду для символу пропорційна двійковому логарифму його частоти з негативним знаком. Кодування Хаффмена є префіксним, що дозволяє його декодувати однопрохідним алгоритмом.
Префіксний код — це код зі словом змінної довжини, що має таку властивість: якщо в код входить слово a, то для будь-якого непорожнього рядка b слова ab в коді не існує. Хоча префіксний код складається зі слів різної довжини, ці слова можна записувати без розділового символу. Наприклад, код, що складається з слів 0, 10 і 11, є префіксним, і повідомлення 01001101110 можна розбити на слова єдиним чином: 0 10 0 11 0 11 10. Навпаки, код, що складається з слів 0, 10, 11 і 100, префіксним не є, і те саме повідомлення можна трактувати декількома способами.
Префіксний код зручно представляти у вигляді двійкового дерева, у якого символи знаходяться в листі, а дуги помічені 0 або 1. Тоді код символу можна задати як шлях від кореня дерева до листа, що містить цей символ.
Розглянемо два алгоритму, які реалізують ефективне кодування.