Professional Documents
Culture Documents
Rgrtic
Rgrtic
РОЗРАХУНКОВО-ГРАФІЧНА РОБОТА
з дисципліни"Теорія інформації і кодування"
на тему:«Програмна реалізація словникового методу стиснення
данних - кодування з використанням ковзаючого вікна - алгоритми
класу LZ»
Студента II курсу
групи ДА-61
Халета М. В.
Керівник доц., к.т.н. Капшук О.О.
Київ – 2018
Зміст
1
Вступ……...……………...................................................................................3
1 Загальні відомості………..…………………………………………………3
2 Вибір та обгрантування алгоритму………………………………………6
2.1 Ідея та особливості словникових методів.………........................6
2.2 Відомі модифікації.…………….....................................................7
3 Детальний опис алгоритму ………………………………………………9
4 Алгоритм реалізації методу…..................................................................10
5 Вибір засобів для реалізації програми…………………………………11
6 Текст програми…………………………………………………………..12
7 Результати тестування програми………………………………………..16
8 Висновок………………………………………………………………….18
9 Список виористаної літератури…………………………………………19
ВСТУП
В даний час, з розвитком інформаційних технологій, все більше значення
надається питанню стиснення і кодування даних. Коло застосування таких
засобів практично безмежне. У даній розрахунково-графічной роботі буде
2
розглянута одна з модифікацій алгоритму словникового стиснення даних -
LZW, зокрема програмна реалізація даного методу.
1. ЗАГАЛЬНІ ВІДОМОСТІ
Стиснення даних - процедура перекодування даних, вироблена з метою
зменшення їх обсягу. Застосовується для більш раціонального використання
пристроїв зберігання та передачі даних.
Стиснення буває без втрат (коли можливо відновлення вихідних даних
без спотворень) або з втратами (відновлення можливе зі спотвореннями,
несуттєвими з точки зору подальшого використання відновлених даних).
Стиснення без втрат зазвичай використовується при обробці комп'ютерних
програм і даних, рідше - для скорочення обсягу звукової, фото-та
відеоінформації. Стиснення з втратами застосовується для скорочення обсягу
звукової, фото-та відеоінформації, воно значно ефективніше ніж стиснення без
втрат.
Стиснення засноване на усуненні надлишковості інформації, що
міститься у вихідних даних. Прикладом збитковості є повторення в тексті
фрагментів. Подібна збитковість зазвичай усувається заміною повторюваної
послідовності більш коротким значенням (кодом). Інший вид збитковості
пов'язаний з тим, що деякі значення в стисливих даних зустрічаються частіше
інших, при цьому можливо замінювати часто зустрічаємі дані більш короткими
кодами, а рідкісні - більш довгими. Стиснення даних, що не володіють
властивістю збитковості (наприклад, випадковий сигнал чи шум), неможливе
без втрат. Також, звичайно, неможливе стиснення зашифрованої інформації[1].
У процесі вдосконалення інформаційних технологій розроблено велику
кількість різноманітних методів, їх модифікацій і підвидів для стиснення даних
без втрат. Сучасні архіватори, як правило, одночасно використовують кілька
методів одночасно. Виділимо деякі основні.
Кодування довжин серій (run length encoding, RLE)
3
Дуже простий метод. Послідовна серія однакових елементів даних
замінюється на два символи: елемент і число його повторень. Широко
використовується як додатковий, так і проміжний метод. В якості самостійного
методу застосовується, наприклад, в графічному форматі BMP.
Словниковий метод (LZ)
Найбільш поширений метод. Використовується словник, що складається з
послідовностей даних або слів. При стисненні ці слова замінюються на їх коди
зі словника. У найбільш поширеному варіанті реалізації як словника виступає
сам вихідний блок даних.
Основним параметром словникового методу є розмір словника. Чим
більший словник, тим більша ефективність. Однак для неоднорідних даних
надмірно великий розмір може бути шкідливим, так як при різкій зміні типу
даних словник буде заповнений неактуальними словами. Для ефективної
роботи даного методу при стисканні потрібна додаткова пам'ять. Приблизно на
порядок більше, ніж потрібно для вихідних даних словника. Істотною
перевагою словникового методу є проста і швидка процедура розпакування.
Додаткова пам'ять при цьому не вимагається. Така особливість особливо
важлива, якщо необхідний оперативний доступ до даних.
Ентропійний метод
У цьому методі елементи даних, які зустрічаються частіше, кодуються
при стисканні більш коротким кодом, а більш рідкісні елементи даних
кодуються довшим кодом. За рахунок того, що коротких кодів значно більше,
загальний розмір виходить менше вихідного.
Широко використовується як додатковий метод. В якості самостійного
методу застосовується, наприклад, в графічному форматі JPEG.
Метод контекстного моделювання (CM)
У цьому методі будується модель вихідних даних. При стисненні
чергового елемента даних ця модель видає своє пророкування або ймовірність.
Відповідно до цієї ймовірності, елемент даних кодується ентропійним методом.
4
Чим точніше модель буде відповідати вихідним даним, тим точніше вона буде
видавати передбачення, і тим коротшими будуть кодуватися елементи даних.
Для побудови ефективної моделі потрібно багато пам'яті. При
розпакуванні доводиться будувати точно таку ж модель. Тому швидкість і
вимоги до обсягу оперативної пам'яті для стиснення та розпакування майже
однакові. У даний момент методи контекстного моделювання дозволяють
отримати найкращу ступінь стиснення, але відрізняються надзвичайно низькою
швидкістю роботи.
Передбачення щодо часткового збігу (PPM)
Це особливий підвид контекстного моделювання. Передбачення виконується
на підставі певної кількості попередніх елементів даних. Основним параметром
є порядок моделі, який задає цю кількість елементів. Чим більший порядок
моделі, тим вищий ступінь стиснення, але потрібно більше оперативної пам'яті
для зберігання даних моделі. Якщо оперативної пам'яті недостатньо, то така
модель з великим порядком показує низькі результати. Метод PPM особливо
ефективний для стиснення текстових даних[2].
5
Для обґрунтування вибору алгоритму виконання розрахунково-графічної
роботи розглянемо основну ідею словникового методу стиснення, а також
відомі модифікації цього методу з короткими коментарями.
2.1 Ідея та особливості словникових методів
В основі цих методів лежить ідея абсолютно відмінна від ідеї
статистичного стиснення. Словниковий кодер домагається стиснення заміною
груп послідовних символів індексами деякого словника. Словник - список
таких фраз, які, як очікується, будуть часто використовуватися. Індекси
влаштовані так, що в середньому займають менше місця, ніж закодовані ними
фрази, за рахунок чого і досягається стиснення. Цей тип стиснення ще відомий
як "макро"-кодування або метод "книги кодів". Відмінність між моделюванням
і кодуванням для словникових методів туманна, оскільки при зміні словників
коди зазвичай не змінюються.
6
з'являється в різних записах. Однак, адаптивні схеми, що допускають великі
фрази, досягають кращого стиснення.
2.2 Відомі модифікації
Існує велика безліч модифікацій алгоритму словникового методу стиснення
даних, однак найбільш поширеними і ефективними є алгоритми, засновані на
стандартах LZ77 і LZ78.
LZ77 і LZ78 - це назви двох алгоритмів стиснення без втрат, опублікованих у
статтях Абрама Лемпела (Abraham Lempel) і Якоба Зіва (Jacob Ziv) в 1977 і
1978. Ці два алгоритми входять в сімейство LZ*, що також включає в себе
LZW, LZSS, LZMA та інші алгоритми. LZ77 є алгоритмом із «ковзним вікном»,
що еквівалентно неявному використання словникового підходу, вперше
запропонованого в LZ78.
Основна відмінність даних методів:
LZ77 - чергуються вказівники і символи. Вказівники посилаються на підрядок,
розташований в попередніх N символах.
LZ78 - на виході чергуються вказівники і символи, вказівники посилаються на
фразу зі словника, попередньо виділену інтерактивним аналізатором.
Незалежно від можливості вказівників звертатися до будь-якого вже
переглянутого рядка, переглянутий текст розбирається на фрази, де кожна нова
фраза є найдовша з вже переглянутих плюс один символ. Вона кодується як
індекс її префікса плюс додатковий символ. Після чого нова фраза додається до
списку фраз, на які можна посилатися. Привабливою практичною властивістю
LZ78 є ефективний пошук в дереві цифрового пошуку за допомогою вставки.
Кожен вузол містить номер представленої ним фрази. Оскільки фраза,що
вставляється,буде лише одним символ довша однієї з їй попередніх, то для
здійснення цієї операції кодеру буде потрібно тільки спуститися вниз по дереву
на одну дугу.
На момент своєї появи алгоритм LZW давав кращий коефіцієнт стиснення для
більшості застосувань, ніж будь-який інший добре відомий метод того часу. Він
став першим широковживаним на комп'ютерах методом стиснення даних.
8
Даний алгоритм при стисненні (кодуванні) динамічно створює таблицю
перетворення рядків: певним послідовностям символів (словам) ставляться у
відповідність групи бітів фіксованої довжини.
2. Іні
ціалізація вхідної фрази А першим символом повідомлення.
3. По
шук у словнику рядок А найбільшої довжини, яка співпадає з останніми
прийнятими символами.
4. Зчи
тати черговий символ В з кодованого повідомлення.
5. Як
що КІНЕЦЬ_ПОВІДОМЛЕННЯ, то видати код для А, інакше - крок 5.
6. Як
що фраза АВ вже є в словнику, присвоїти вхідній фразі А значення АВ і
перейти до кроку 3, інакше - видати код А, додати АВ в словник,
присвоїти вхідній фразі А значення В і перейти до кроку 3.
7. Кін
ець.
10
Вибір засобів для реалізації програми
Програма була написана для терміналу за процедурною парадигмою
програмування мовою java8 в середовищі Intellij IDEA.
11
Текст програми
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;
String w = "";
String wc = w + c;
if (dictionary.containsKey(wc))
w = wc;
12
else {
result.add(dictionary.get(w));
dictionary.put(wc, dictSize++);
w = "" + c;
if (!w.equals(""))
result.add(dictionary.get(w));
return result;
String entry;
13
if (dictionary.containsKey(k))
entry = dictionary.get(k);
else if (k == dictSize)
entry = w + w.charAt(0);
else
result.append(entry);
dictionary.put(dictSize++, w + entry.charAt(0));
w = entry;
return result.toString();
new InputStreamReader(
String line;
14
while ((line = reader.readLine()) != null) {
System.out.println(line);
System.out.println(compressed);
System.out.println(decompressed);
} catch (IOException e) {
// log error
15
1. Ре
зультати тестування програми
Рис. 7.1 – Програма працює без збоїв
16
Висновки
Переваги LZW:
1) алг
оритм є однопрохідним;
2) для
декомпресії не треба зберігати таблицю рядків у файл для
розпакування (алгоритм побудований таким чином, що ми в змозі
відновити таблицю рядків, користуючись тільки потоком кодів).
Недолік LZW:
17
9. С
писок використаних джерел
1) htt
ps://uk.wikipedia.org/w/index.php?title=%D0%90%D0%BB
%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B
%D0%B5%D0%BC%D0%BF%D0%B5%D0%BB%D1%8F-
%D0%97%D1%96%D0%B2%D0%B0-%D0%92%D0%B5%D0%BB
%D1%87%D0%B0
2) htt
p://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB
%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_LZW
3) htt
p://habrahabr.ru/post/132683/
18