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

Теоретичні відомості

Оптимальним кодуванням називається процедура перетворення символів первинного алфавіту А в кодові слова у вторинному алфавіті В, при якій середня довжина повідомлень у вторинному алфавіті має мінімально можливу для даного алфавіту В довжину.

Тобто, метою оптимального кодування є перетворення потоку символів на потік бітів мінімальної довжини. Це досягається завдяки зменшенню надмірності вхідного потоку з врахуванням частоти появи символів на вході та довжини коду, яка має бути пропорційною інформації, що міститься у вхідному потоці даних. Такі способи ґрунтуються на використанні оптимального кодування. Якщо розподіл імовірностей появи символів у вхідному потоці даних наперед невідомий, то можна скористатися одним із двох підходів. Згідно з першим підходом слід переглянути вхідний потік даних і побудувати оптимальний код (наприклад, код Хаффмена), ґрунтуючись на наявній статистиці. При цьому дістають вихідний потік даних, закодований оптимальним кодом. Як приклад, використання такого підходу можна назвати статистичним кодуванням Хаффмена. У цьому разі із вхідними символами, поданими послідовностями бітів однакової довжини, зіставляються послідовності бітів змінної довжини. Довжина коду для символу пропорційна (з округленням до цілого) двійковому логарифму частоти його появи, що береться з оберненим знаком.

У повідомленнях, складених з кодових слів оптимального коду, статистична надмірність зведена до мінімуму, в ідеальному випадку - до нуля.

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

З властивостей оптимальних кодів випливають принципи їх побудови.

1 - вибір кожного кодового слова необхідно проводити так, щоб кількість інформації, яка міститься в ньому, була максимальною;

2 - літерам первинного алфавіту, які мають велику ймовірність, присвоюються коротші кодові слова у вторинному алфавіті.

Принципи оптимального кодування визначають методи побудови. Розглянемо ці методи.

Код Хаффмена

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

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

Отже, в основі алгоритму кодування Хаффмена лежить простий принцип: символи заміняються кодовими послідовностями різної довжини. Чим частіше використовується символ, тим коротше відповідна послідовність. Наприклад, для англійського тексту символам e, t, a можна поставити відповідні 3-бітові послідовності, а j, z, q — 8-бітові. В одних варіантах алгоритму Хаффмена використовуються готові кодові таблиці, в інших — кодова таблиця будується на основі статистичного аналізу умісту файла. Застосування коду Хаффмена гарантує можливість декодування. Це важливо, тому що "упаковані" кодові послідовності мають різну довжину, на відміну від звичайних, довжина яких постійна і дорівнює 8 біт на символ.

Застосування алгоритму коду Хаффмана полягає в наступному. Літери вихідного алфавіту виписуються в стовпець в порядку зменшення їх ймовірностей. Останні дві літери стовпця об'єднуються в одну - допоміжну літеру, якої приписується сумарна ймовірність. Потім формується наступний стовпець з урахуванням нової літери за принципом зменшення ймовірностей.

Процес повторюється і продовжується до тих пір, поки залишиться одна літера з імовірністю, рівною 1. Кодові комбінації можна легко отримати, побудувавши кодове дерево. Вершиною дерева є остання літера, процес розгалуження проводиться з урахуванням отриманої таблиці, рухаючись у зворотному напрямку. Кожному з двох ребер, що беруть участь в об'єднанні, приписується кодовий символ: ребру з більшою ймовірністю - «1», з меншою - «0». Рухаючись від вершини дерева до однієї з літер алфавіту по відповідним ребрах, отримуємо її кодову комбінацію.

Приклад 4.1. Проведемо кодування за методом Хаффмена. Вихідний алфавіт складається з шести літер із заданими ймовірностями. Складемо таблицю.

Ai p(Ai) Допоміжні стовпці

A1

0.4

0.4

0.4

0.4

0.4

1.0

A2

0.25

0.25

0.25

0.25

0.6

A3

0.15

0.15

0.15

0.35

A4

0.10

0.10

0.20

A5

0.06

0.10

A6

0.04

Складемо таблицю кодування.

Ai p(Ai) Допоміжні стовпці

A1

0.4 0

0.4 0

0.4 0

0.4 0

0.4 0

1.0

A2

0.25 10

0.25 10

0.25 10

0.25 10

0.6 1

A3

0.15 110

0.15 110

0.15 110

0.35 11

A4

0.10 1110

0.10 1110

0.20 111

A5

0.06 11110

0.10 1111

A6

0.04 11111

Отриманий код:

A1

A2

A3

A4

A5

A6

0

10

110

1110

11110

11111

Код Шеннона-Фано

Алгоритм коду Шеннона-Фано полягає в наступному: літери вихідного алфавіту повідомлення виписуються в стовпець в порядку зменшення їх ймовірностей; проводиться розбиття на дві групи з рівною по можливості сумарною ймовірністю, всім літерам верхньої групи в якості першого символу кодової комбінації приписується «1», а нижній - «0»; потім виконують такі розбиття до тих пір, поки в кожній підгрупі не залишиться одна літера (при кожному розбитті з'являється новий символ кодової комбінації за правилами, викладеними вище).

При побудові коду Шеннона-Фано розбиття безлічі елементів може бути проведено, взагалі кажучи, декількома способами. Вибір розбиття на рівні N може погіршити варіанти розбиття на наступному рівні (n + 1) і призвести до неоптимальності коду в цілому. Іншими словами, оптимальна поведінка на кожному кроці шляху ще не гарантує оптимальності всієї сукупності дій. Тому код Шеннона-Фано не є оптимальним в загальному сенсі, хоча і дає оптимальні результати при деяких розподілах ймовірностей. Для одного і того ж розподілу ймовірностей можна побудувати, взагалі кажучи, дещо кодів Шеннона-Фано, і всі вони можуть дати різні результати. Якщо побудувати всі можливі коди Шеннона-Фано для даного розподілу ймовірностей, то серед них будуть знаходитися і всі коди Хаффмана, тобто оптимальні коди. Код Шеннона-Фано називають економічним.

Розглянемо приклад побудови коду Шеннона-Фано для попереднього прикладу.

Ai p(Ai) Допоміжні стовпці

A1

0.4

0.4

A2

0.25

0.6

0.25

A3

0.15

0.35

0.15

A4

0.10

0.20

0.10

A5

0.06

0.10

0.6

A6

0.04

0.4

Складемо таблицю кодування.

Ai p(Ai) Допоміжні стовпці

A1

0.4

0.4 0

A2

0.25

0.6 1

0.25 10

A3

0.15

0.35 11

0.15 110

A4

0.10

0.20 111

0.10 1110

A5

0.06

0.10 1111

0.6 11110

A6

0.04

0.4 11111

Отриманий код:

A1

A2

A3

A4

A5

A6

0

10

110

1110

11110

11111

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

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

Перевірка оптимальності коду

Перевірка оптимальності коду здійснюється шляхом порівняння ентропії

кодованого (первинного) алфавіту з середньою довжиною кодового слова у вторинному алфавіті.

Ентропія джерела повідомлень дорівнює

(4.1)

Середня довжина кодового слова у вторинному алфавіті

, (4.2)

де l(i)  довжина i-й кодовой комбінації;

pi  ймовірність появи і-го символу комбінації довжиною l(i).

Оптимальності коду дорівнює

(4.3)

Приклад 4.2. Проведемо кодування методом Шеннона-Фано і розрахуємо характеристики коду. Нехай первинний алфавіт складається з восьми букв і задані їх ймовірності. Проведемо розбиття по алгоритму Шеннона-Фано і складемо кодові комбінації.

Літера

Ймовірність появи літери

Кодові комбінації

A1

0.25

1 1

A2

0.20

1 0

A3

0.15

0 1 1

A4

0.10

0 1 0

A5

0.10

0 0 1 1

A6

0.10

0 0 1 0

A7

0.06

0 0 0 1

A

0.04

0 0 0 0

Обчислимо ентропію за формулою 4.1.

H =  0.25 ∙ log2 0.25  0.20 ∙ log2 0.20  0.15 ∙ log2 0.15  3 ∙ 0.10 ∙ log2 0.10 

 0.06 ∙ log2 0.06  0.04 ∙ log2 0.04 = 2.79 (біт)

Обчислимо середню довжину кодової комбинації за формулою 4.2.

Lср = 0.25 ∙ 2 + 0.20 ∙ 2.0 + 0.15 ∙ 3 + 0.10 ∙ 4 + 0.10 ∙ 4 + 0.06 ∙ 4 +

+ 0.04 ∙ 4 = 2.85 (біт)

Оптимальність (ефективність) коду (за формулою 4.3) дорівнює