- •Національний університет біоресурсів і природокористування Кафедра автоматизації сільськогосподарського виробництва
- •Методичні вказівки до виконання
- •Лабораторна робота № 1 Системи числення і цифрова техніка
- •Теоретичні відомості
- •Основою позиційної системи числення є число десять. Загальновживана форма запису числа є насправді не що інше, як скорочена форма запису розкладу за степенями основи системи числення, наприклад:
- •Алгоритми переведення чисел з однієї позиційної системи числення в іншу
- •Представлення від'ємних і дробових чисел у пам'яті комп'ютера
- •Контрольні запитання
- •Лабораторна робота № 2 Представлення даних у пам'яті електронно-обчислювальної машини (еом)
- •Теоретичні відомості
- •1. Системи числення
- •2. Кодіровка ascii
- •3. Кодіровка ascii
- •4. Альтернативна кодова таблиця
- •Завдання на лабораторну роботу
- •Контрольні запитання
- •Лабораторна робота № 3 Ентропія та її властивості. Безумовна, умовна ентропія та ентропія двох джерел
- •Теоретичні відомості
- •Основні властивості ентропії
- •Основні властивості безумовної ентропії дискретних повідомлень:
- •Умовна ентропія
- •Властивості умовної ентропії
- •Завдання на лабораторну роботу
- •Контрольні запитання
- •Лабораторна робота № 4
- •Кодування та стиснення інформації методом хаффмена та Шенона-Фано
- •Мета роботи: Вивчення принципів кодування потоків символів з різною частотою появи символів у потоці, використовуючи метод кодування Хаффмена та Шенона-Фано.
- •Теоретичні відомості
- •Порядок виконання роботи
- •Контрольні запитання
- •Лабораторна робота № 5
- •Дослідження завадозахищених кодів
- •Теоретичні відомості
- •Порядок виконання роботи
- •Контрольні запитання
- •Порядок виконання роботи
- •Дані для кодування
- •Елементи схеми пофарбовані в зелені кольори дозволяють одержати готові шаблони схем зв'язку, з яких можна створити необхідні схеми.
- •Подвійне нажимання миші в полі елемента викликає набір інструментів для цього елемента з необхідним набором параметрів.
- •Підключення до лінії з'єднання двох елементів здійснюється з використанням правої кнопки миші.
- •Порядок виконання роботи
- •Контрольні запитання
- •Лабораторна робота № 8 Способи стиснення даних методом архівації
- •Теоретичні відомості
- •Порядок виконання роботи
- •Контрольні запитання
- •Список літератури
Теоретичні відомості
Оптимальним кодуванням називається процедура перетворення символів первинного алфавіту А в кодові слова у вторинному алфавіті В, при якій середня довжина повідомлень у вторинному алфавіті має мінімально можливу для даного алфавіту В довжину.
Тобто, метою оптимального кодування є перетворення потоку символів на потік бітів мінімальної довжини. Це досягається завдяки зменшенню надмірності вхідного потоку з врахуванням частоти появи символів на вході та довжини коду, яка має бути пропорційною інформації, що міститься у вхідному потоці даних. Такі способи ґрунтуються на використанні оптимального кодування. Якщо розподіл імовірностей появи символів у вхідному потоці даних наперед невідомий, то можна скористатися одним із двох підходів. Згідно з першим підходом слід переглянути вхідний потік даних і побудувати оптимальний код (наприклад, код Хаффмена), ґрунтуючись на наявній статистиці. При цьому дістають вихідний потік даних, закодований оптимальним кодом. Як приклад, використання такого підходу можна назвати статистичним кодуванням Хаффмена. У цьому разі із вхідними символами, поданими послідовностями бітів однакової довжини, зіставляються послідовності бітів змінної довжини. Довжина коду для символу пропорційна (з округленням до цілого) двійковому логарифму частоти його появи, що береться з оберненим знаком.
У повідомленнях, складених з кодових слів оптимального коду, статистична надмірність зведена до мінімуму, в ідеальному випадку - до нуля.
Оптимальні коди відносяться до класу префіксних кодів, кожна кодова комбінація має свою довжину і жодна не є початком іншої, більшої завдовжки, тобто кодове слово не може бути початком будь-якого іншого кодового слова.
З властивостей оптимальних кодів випливають принципи їх побудови.
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) дорівнює
