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

4. Алгоритм Хаффмена для побудови оптимального коду

Метод побудови оптимального префіксного коду, який завжди дає однозначний результат, запропонував у 1952 році американський учений Девід Хаффмен (1925-1999). Це дуже ефективний спосіб пошуку оптимального вектора Крафта l для вектора частот p, тобто такого l, для якого сума L(m)=(l1*p1+l2*p2+…+lk*pk) є мінімальною. Одержаний з використанням оптимального вектора Крафта l, (коли нерівність (3.7) перетворюється в строгу нерівність) префіксальний код для p є оптимальним кодом Хаффмена.

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

  1. Виписати в рядок усі символи алфавіту джерела в порядку спадання ймовірностей їх появи в тексті.

  2. Послідовно об’єднувати два символи з найменшими ймовірностями в новий символ, ймовірність появи якого як такого, що дорівнює сумі ймовірностей його складових.

  3. Вказівку 2 виконувати до тих пір, доки не будуть об’єднані всі символи (із сумою ймовірностей 1).

  4. Побудувати кодове дерево, кожний вузол якого має сумарну ймовірність усіх вузлів, розміщених нижче від нього.

  5. Простежити шлях до кожної вершини дерева, помічаючи напрям до кожного вузла (ліворуч – 0, праворуч – 1). Одержана послідовність нулів та одиниць дає кодове слово, що відповідає кожному символові алфавіту джерела повідомлень.

Приклад. Побудувати код Хаффмена для джерела повідомлень з алфавітом

=

  1. Розташовуємо букви алфавіту в порядку спадання їхніх ймовірностей

  1. Виконуючи вказівки 2, 3 алгоритму послідовно одержуємо

1

  1. За вказівкою 4 будуємо кодове дерево (рис. 5)

Рис. 5

  1. В ідповідно до вказівки (5) алгоритму одержуємо:

Для обчислення середнього числа символів l, що припадають на одну букву джерела повідомлення скористаємося формулою (3.4)

Ентропію джерела обчислюємо за формулою (3.1)

Отже,

За співвідношенням (3.7) обчислюємо значення вектора Крафта.

2-3+2-2+2-2+2-3+2-2= +

Отже, побудований код Хаффмена є близьким дооптимального. Зазначимо, що в деяких випадках результати двійкового кодування за алгоритмами Шенона—Фано та Хаффмена схожі в тому розумінні, до довжини відповідних кодових слів в обох випадках збігаються.

Має місце твердження: Якщо ймовірності джерела є степенями двійки, то довжини відповідних кодових слів У кодах Шенона—Фано і Хаффмена збігаються.

5. Оптимальні нерівномірні коди і проблеми стискування інформації

Стискування даних забезпечує більш ефективне використання ємності дискової пам’яті. Наприклад, для відеоінформації, де відтворення кадра (фрейма) реалізується з швидкістю 30 разів за секунду, необхідне стискування у 100 і більше разів.

Дуже корисним є стискування для передавання інформації в будь-яких системах зв’язку. Стискування інформації в цьому випадку дозволяє передавати значно менші (як правило, в декілька разів) обсяги даних, що вимагає значно менших ресурсів пропускної здатності каналів для передачі тієї ж інформації. Виграш може бути і в скороченні часу завантаження каналу, що приводить до значної економії коштів.

Для характеристики досягнутого ступеня стискування на практиці застосовують так званий коефіцієнт стискування: відношення початкового розміру до розміру в стиснутому вигляді.

Відомі методи стискування спрямовані на зниження надмірності, яка викликана як нерівною апріорною імовірністю символів, так і залежністю між порядком надходження символів. У першому випадку для кодування початкових (вихідних) символів використовують нерівномірні коди.

Усунення надмірності, яка обумовлена кореляцією між символами, засноване на переході від кодування окремих символів до кодування груп цих символів.

Отже, процес усунення надмірності джерела повідомлень зводиться до двох операцій — декореляції (укрупнення алфавіту) й кодування оптимальними нерівномірними кодами.

Усі алгоритми стискування поділяють на дві великі групи: алгоритми з втратами й алгоритми без втрат.

Стискування з втратами дозволяє досягнути значно більшого ступеня стискування (до і менше від початкового обсягу). Наприклад, відеофільм, що займає в неупаковому вигляді 30 Гбайт, вдається записати на CD ROM. Але алгоритми стискування з втратами приводять до деяких змін самих даних. Тому застосувати такі алгоритми можна тільки до тих даних, для яких невеликі спотворення не є істотними: відео, фотозображення (алгоритми JPEG), звук (алгоритми МРЗ).

Стискування без втрат є менш ефективним ніж стискування з втратами. Тут ступінь стискування ефективно залежить від конкретних даних. Але дані, стиснуті за методом без втрат, після розпакування цілком ідентичні вихідним, що є абсолютно необхідним для текстових даних, програмного коду.

Більшість алгоритмів стискування без втрат поділяють на дві групи: словникові й статистичні методи.

Словникові методи характеризуються високою швидкістю стискування-розпаковки, але дещо гіршим стискуванням. Ефективні словарні алгоритми стискування інформації розробили ізраїльські вчені Якайба Зіва та Абрахма Лемпеля (алгоритм Lempel Ziv, скорочено LZ) на основі методу словників.

На основі алгоритмів LZ фірми розробники програмного забезпечення створили програмні засоби, які широко використовуються для стискування (компресії) та відновлення (декомпресії) даних, що забезпечує значну економію пам’яті на рухомих носіях (зовнішньої пам’яті).

Статистичні методи — це ймовірнісні методи стискування — алгоритми Шенона—Фано і Хаффмена, які детально розглянуті в п. 3.3 і п. 3.4.

Є два види імовірнісних методів. Їх основною відмінністю є способи визначення появи кожного символу.

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

2. Динамічні, чи адаптивні, методи, в яких частота появи символів весь час змінюється і в міру зчитування блоку даних відбувається перерахунок початкових значень частот.

Статистичні методи характеризуються хорошою швидкодією і не вимагають значних ресурсів пам’яті. Вони широко застосовуються в багаточисленних програмах-архіваторах, наприклад, ARK, PKZIP та інших.

Динамічні методи мають меншу швидкодію і вимагають більших обсягів пам’яті.

Для стискування даних, що передаються модемами, використовують так зване арифметичне кодування ([10, п. 2.4]).

Принципи арифметичного кодування були розроблені наприкінці 70-х років ХХ століття. У результаті арифметичного кодування рядок символів замінюється дійсним числом х (0<х<1). Арифметичне кодування дозволяє забезпечити високий ступінь стискування, особливо в тих випадках, коли стискуються дані, де частота появи різних символів дуже змінюється.

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