You are on page 1of 18

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ

«КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ»


ННК «ІПСА»
Кафедра системного проектування

РОЗРАХУНКОВО-ГРАФІЧНА РОБОТА
з дисципліни"Теорія інформації і кодування"
на тему:«Програмна реалізація словникового методу стиснення
данних - кодування з використанням ковзаючого вікна - алгоритми
класу 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].

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 є ефективний пошук в дереві цифрового пошуку за допомогою вставки.
Кожен вузол містить номер представленої ним фрази. Оскільки фраза,що
вставляється,буде лише одним символ довша однієї з їй попередніх, то для
здійснення цієї операції кодеру буде потрібно тільки спуститися вниз по дереву
на одну дугу.

Алгори́тм Ле́мпеля — Зіва — Ве́лча (англ. Lempel — Ziv — Welch, LZW) —


це універсальний алгоритм стиснення даних без втрат, створений Абрахамом
Лемпелем (англ. Abraham Lempel), Якобом Зівом (англ. Jacob Ziv) і Террі
7
Велчем (англ. Terry Welch). Він був опублікований Велчем в 1984 році в якості
покращеної реалізації алгоритму LZ78, опублікованого Лемпелем і Зівом
в 1978 році. Алгоритм розроблений так, щоб його можна було швидко
реалізувати, але він не обов'язково є оптимальним, оскільки він не проводить
ніякого аналізу вхідних даних.

Акронім «LZW» вкадує на прізвища винахідників алгоритму: Лемпель, Зів и


Велч, але багато хто стверджує, що, оскільки патент належав Зіву, то метод
повинен називатися алгоритмом Зіва — Лемпеля — Велча.

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

Алгоритм був реалізований в програмі compress, яка стала більш чи менш


стандартною утилітою Unix-систем приблизно в 1986 році. Кілька інших
популярних утиліт-архіваторів також використовують цей метод або близькі до
нього.

В 1987 році алгоритм став частиною стандарту на формат зображень GIF. Він


також може (опціонально) використовуватися в форматі TIFF.

На даний момент алгоритм утримується в стандарті PDF.

ДЕТАЛЬНИЙ ОПИС АЛГОРИТМУ

8
Даний алгоритм при стисненні (кодуванні) динамічно створює таблицю
перетворення рядків: певним послідовностям символів (словам) ставляться у
відповідність групи бітів фіксованої довжини.

Спочатку таблиця ініціюється всіма 1-символьними рядками (у випадку


8-бітних символів – це 256 записів).

По мірі кодування алгоритм переглядає текст символ за символом і


зберігає кожен новий унікальний 2-символьний рядок в таблицю у вигляді пари
код/символ, де код посилається на відповідний перший символ. Після того, як
новий 2-символьний рядок збережений в таблиці, на вихід передається код
першого символу. Коли на вході читається черговий символ, для нього по
таблиці знаходиться рядок, що вже зустрічався, максимальної довжини, після
чого в таблиці зберігається код цього рядка з наступним символом на вході; на
вихід видається код цього рядка, а наступний символ використовується у якості
початку наступного рядка.

Дуже цікавою особливістю LZW є те, що алгоритму декодування на вході


потрібен лише закодований текст, оскільки він може відтворювати відповідну
таблицю перетворень безпосередньо по закодованому тексту.

Алгоритм реалізації методу


9
1. Ст
ворення словника всіма можливими односимвольними фразами.

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.*;

public class LZWCompression {

/** Compress a string to a list of output symbols. */

public static List<Integer> compress(String uncompressed) {

// Build the dictionary.

int dictSize = 256;

Map<String,Integer> dictionary = new HashMap<String,Integer>();

for (int i = 0; i < 256; i++)

dictionary.put("" + (char)i, i);

String w = "";

List<Integer> result = new ArrayList<Integer>();

for (char c : uncompressed.toCharArray()) {

String wc = w + c;

if (dictionary.containsKey(wc))

w = wc;

12
else {

result.add(dictionary.get(w));

// Add wc to the dictionary.

dictionary.put(wc, dictSize++);

w = "" + c;

// Output the code for w.

if (!w.equals(""))

result.add(dictionary.get(w));

return result;

/** Decompress a list of output ks to a string. */

public static String decompress(List<Integer> compressed) {

// Build the dictionary.

int dictSize = 256;

Map<Integer,String> dictionary = new HashMap<Integer,String>();

for (int i = 0; i < 256; i++)

dictionary.put(i, "" + (char)i);

String w = "" + (char)(int)compressed.remove(0);

StringBuffer result = new StringBuffer(w);

for (int k : compressed) {

String entry;
13
if (dictionary.containsKey(k))

entry = dictionary.get(k);

else if (k == dictSize)

entry = w + w.charAt(0);

else

throw new IllegalArgumentException("Bad compressed k: " + k);

result.append(entry);

// Add w+entry[0] to the dictionary.

dictionary.put(dictSize++, w + entry.charAt(0));

w = entry;

return result.toString();

public static void main(String[] args) throws IOException {

//int [] arr = new int[7000];

final String source =


"/Users/MariaKhaleta/Desktop/лабы/тик/tic2/iasaTIC2/src/main/java/lzw/in.txt";

File file = new File(source);

try (BufferedReader reader = new BufferedReader(

new InputStreamReader(

new FileInputStream(file), StandardCharsets.UTF_8))){

String line;

14
while ((line = reader.readLine()) != null) {

System.out.println(line);

List<Integer> compressed = compress(line);

System.out.println(compressed);

String decompressed = decompress(compressed);

System.out.println(decompressed);

} catch (IOException e) {

// log error

15
1. Ре
зультати тестування програми
Рис. 7.1 – Програма працює без збоїв

Рис. 7.2 – Вхідне повідомлення (файл «in.txt»)

Рис. 7.3 – Відновлене повідомлення (файл «out.txt»)

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

You might also like