LZ77 і LZ78

LZ77 і LZ78, алгори́тм Ле́мпеля — Зі́ва (англ. Lempel–Ziv algorithm) — універсальний алгоритм стискування даних без втрат, створений у 1977—1978 роках Авраамом Лемпелем і Яковом Зівом. Алгоритм розроблений так, щоб його можна було швидко реалізувати, але він не обов'язково є оптимальним, оскільки не проводить жодного аналізу вхідних даних. 1984 року Террі Велчем опублікована покращена реалізація алгоритму LZ78 — алгоритм Лемпеля — Зіва — Велча (англ. Lempel–Ziv–Welch algorithm, LZW).

Історія виникнення

Більше тридцяти років алгоритм стиснення Хаффмана і його варіанти залишалися найпопулярнішими методами. Проте 1977 року ізраїльскі дослідники Авраам Лемпель і Яків Зів запропонували абсолютно інший підхід до цієї проблеми, висунувши ідею формування «словника» загальних послідовностей даних.

При цьому стиснення даних здійснюється за рахунок заміни записів відповідними кодами із словника. Існують два алгоритми стиснення даних — LZ77 і LZ78. Вони вже не вимагають включення словника даних в архів, оскільки якщо ви формуєте ваш словник визначеним способом, програма декодування може його відновлювати безпосередньо з ваших даних. На жаль, LZ77 і LZ78 витрачають багато часу на створення ефективного словника. Лемпель був запрошений фірмою Sperry для допомоги в розробці способу найефективнішої упаковки даних на комп'ютерних стрічках. У цій же фірмі Тері Велч розширив алгоритм LZ78, створивши новий варіант, широко відомий як LZW.

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

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

Метод стиснення

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

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

  • JPEG (Joint Photographic Experts Group) для графічних даних;
  • MPG — для відеоданих;
  • MP3 — для аудіоданих.

Якщо при стисненні даних відбувається тільки зміна структури даних, то метод стиснення є зворотнім. У цьому випадку з архіву можна відновити інформацію повністю. Зворотні методи стиснення можна застосовувати до будь-яких типів даних, але вони дають менший ступінь стиснення у порівнянні з незворотними методами стиснення. Приклади форматів стиснення без втрати інформації: GIF (Graphics Interchange Format) та TIFF (Tagged Image File Format) — для графічних даних; AVI — для відеоданих; ZIP, ARJ, RAR, CAB, LH — для довільних типів даних. Існує багато різних практичних методів стиснення без втрати інформації, які, як правило, мають різну ефективність для різних типів даних та різних обсягів даних.

Кодування методом Лемпеля — Зіва

Візьмемо набір символів

АБВАБВЯЯЯЯЯЯ

У ньому двічі зустрічається поєднання АБВ, тому його можна записати в так званому словнику, а в початковому тексті тільки залишити посилання на словник. Тоді початковий текст можна перетворити, наприклад, на

11ЯЯЯЯЯЯ


і окремо запам'ятати, що за символом 1 насправді ховається трійця АБВ. Ясно, що якщо в тексті поєднання АБВ зустрілося не 2 а 100 або ще краще 1000 разів, то стиснення було б вельми відчутним. Проте в реальних ситуаціях на таке везіння розраховувати не слід. Треба все вичавлювати навіть з небагатьох повторень в початковому тексті. Подивимося, чи багато ми вигадали в розглянутому прикладі.

Текст стискувався на 4 символи, але і, як мінімум, 4 символи опинилися у словнику. Крім того, побудова словника зажадає введення роздільників і ін.

Але і це ще не все. А якщо в тексті вже є символи 1 ? Як зрозуміти, що це саме 1, а не посилання на словник? Як же поступити найбільш грамотно? Ось тут відповідь далеко неоднозначна. Вона і не може бути однозначна, тому що стиснення — це не таблиця множення. Один текст краще стискається одним методом, інший — абсолютно іншим способом. Спершу ми розглянемо дуже спрощений варіант, щоб мати від чого відштовхуватися надалі.

Для визначеності вважатимемо, що кожен символ в тексті — це впорядкований набір з 8 бітів, тобто байт, або, що те ж саме ціле число від 0 до 255.

Послідовно читаємо початковий текст і одночасно формуємо вихідний файл. Якщо чергова буква зустрілася вперше, або вона виявилася останньою в тексті, то на вихід посилаємо біт 1 і 8 бітів від самої цієї букви. Так само треба зробити, якщо символ не новий, але в парі з наступним ще не зустрічався. Отже, в нашому прикладі перші три символи дадуть на виході 27 бітів. Тоді, при зворотній операції, як тільки той, що розшифровує, побачив черговий біт 1, він відразу знатиме, що наступні за ним 8 бітів треба вивести, так би мовити, відкритим текстом.

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

В нашому прикладі достатньо двохбайтних посилань. Отже на вихід пошлемо:

001 11

Далі від букви Я по відомих правилах піде 9 бітів. Залишок тексту шифрується сімома бітами:

00001 01

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

Таким чином, початковий текст в стислому вигляді при декілька вільному зображенні з'явиться у вигляді:

1 А 1 Би 1 В 001 11 00001 01

Правильніше (але менш наочно) було б вписати замість А, Би і В їх восьмибітові уявлення.
. Дерево Лемпеля — Зіва виглядає так:

Дерево Лемпеля — Зіва

Щоб програма розшифровки годилася не тільки для розглянутого прикладу, ще до стислого тексту треба прикласти деякі параметри: довжину стислого або розгорненого тексту, а також довжину посилань. Само дерево прикладати не треба, якщо воно підкоряється простим широкоспоживаним правилам. Отже, дерево Лемпеля — Зіва може бути достатнє складним і розлогим.

Дешифрування

Далі приводиться алгоритм розархівування зі всіма необхідними технічними подробицями і ретельно підібраними значеннями параметрів. Річ у тому, що навіть дуже невеликі варіації параметрів різко міняють ступінь стиснення і, як правило, в гіршу сторону. А боротьба ведеться за долі відсотка. Завдання ускладнюється тим, що немає об'єктивних критеріїв, по яких можна було відразу сказати, що та або інша зміна алгоритму пішла йому на користь. Як ми знаємо, для будь-якого архіватора знайдеться сила-силенна текстів, взагалі непіддатливих стисненню.

Якщо брати тільки такі тексти, то роботу можна не починати. Оцінювати архіватор треба по ходових текстах, але ходові — це не наукове поняття.

Зчитується чергова серія бітів до першого одиничного біта. Нехай N — кількість лічених бітів. Наприклад, якщо в черзі 001000…, то зчитуються 3 біти і відповідно N=3. А якщо перший біт дорівнює одиниці, то зчитується тільки він і N=1. Вводимо число M для формування кількості символів, які пізніше будуть узяті із вже розшифрованого тексту. Спочатку M=N. M і N — цілі двохбайтні числа.

  1. Якщо N більше або дорівнює 17, то зчитуються чергові 8 бітів і розміщуються в молодших бітах числа M.
  2. Якщо N > 17, то зчитуються чергові 8 бітів і розміщуються в старших байтах числа M. (Воно вважається беззнаковим)
  3. Якщо M=1, то зчитуються чергові 8 бітів і надсилаються на вихід, тобто у відновлений текст, і тоді робіться перехід на п. 1.
  4. Зчитуються чергові 2 біти, з яких формується ціле число Z від 0 до 3. Вводяться K і R.
Якщо M=2, Z=0, то K=5, R=0. 
Якщо M=2, Z=1, то K=7, R=-32.
Якщо M=2, Z=2, то K=9, R=-160.
Якщо M=2, Z=3, то K=11, R=-672.
Якщо M>2, Z=0, то K=6, R=0.
Якщо M>2, Z=1, то K=9, R=-64.
Якщо M>2, Z=2, то K=12, R=-576.
Якщо M>2, Z=3, то K=14, R=-4672.
  1. Зчитуються чергові K бітів і розміщуються в молодших K бітах допоміжного цілого двохбайтного числа S. Решта бітів цього числа заповнюються одиницями. Отже S<0, оскільки у старшому біті, що відповідає за знак, знаходиться одиниця.
  2. Визначається адреса в тексті, звідки буде узятий потрібний фрагмент. Адреса — це просто номер байта в послідовності. Для цього до адреси, на якій поки завершено формування розшифрованого тексту, треба додати R і S. З отриманої таким чином адреси беремо M символів і додаємо в кінець сформованого тексту. Переходимо до п.1 (якщо дані ще не вичерпані).

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

Варіанти вдосконалення

Приведені вище деталі алгоритму і значення параметрів не можуть бути виведені будь-якими раціональними строгими методами. У якійсь мірі, в них відбиті особливості сучасного програмування і людської мови. Але автори кожного архіватора знаходять свій оптимум, і що краще — може підказати тільки практика (критерій загальний, але дещо розпливчатий).

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

Якщо файл короткий, то це означає, що взагалі дезархіватору не знадобиться заглядати далеко назад. Тоді не потрібний, скажімо, випадок K=14, і біти, що звільнилися, можна використовувати з більшою користю. Проте ефект порівняно невеликий. А оскільки він виявляється тільки на малих файлах, то на загальних (зазвичай гігантських) обсягах інформації він і зовсім втрачається.

Можливі багато інших варіантів удосконалень, не пов'язаних безпосередньо з характерними для Лемпеля — Зіва ідеями. Важливий випадок, коли чисельна інформація набита цифрами. Наприклад: 132, -44.8, 555. Зрозуміло, що цифри можуть бути так перетасовані, що навіть однакові пари будуть вкрай рідкісними. Згадані методи не дають стиснення. Проте, якщо у фрагменті тексту використовуються всього 16 різних знаків, кожен з них репрезентується чотирма бітами, що дає вже двократне стиснення. Додаткові резерви можуть бути розкриті якщо текст тільки українською мовою, де використовується не більше 66 знаків.

Можна виділяти у початковому файлі не стиковані ділянки. Тоді збиток від кожного з них можна понизити до трьох байтів. А в представленому варіанті кожен перенесений без змін символ тягне за собою однобайтову ознаку, тобто збиток 12,5 %.

Проте викладений вище алгоритм не враховує такі деталі, тому що вони відносно рідкісні, а ефект від них досить скромний.

Посилання

Read other articles:

Peta infrastruktur dan tata guna lahan di Komune Cleurie.  = Kawasan perkotaan  = Lahan subur  = Padang rumput  = Lahan pertanaman campuran  = Hutan  = Vegetasi perdu  = Lahan basah  = Anak sungaiCleurie merupakan sebuah komune di departemen Vosges yang terletak pada sebelah timur laut Prancis. Lihat pula Komune di departemen Vosges Referensi INSEE lbsKomune di departemen Vosges Les Ableuvenettes Ahéville Aingeville Ainvelle Allarmont Ambacourt Ameuvel...

 

 

تسينجي دي بيماراها التلة الملكية في أمبوهيمنغا الغابات المطيرة في أتسينانانا مواقع التراث العالمي في مدغشقر[1] بالنسبة لمنظمة الأمم المتحدة للتربية والعلم والثقافة (اليونسكو) فمواقع التراث العالمي هي أماكن ذات أهمية ثقافية أو تراث طبيعي كما هو موضح في اتفاقية منظمة ا...

 

 

Artikel ini membutuhkan rujukan tambahan agar kualitasnya dapat dipastikan. Mohon bantu kami mengembangkan artikel ini dengan cara menambahkan rujukan ke sumber tepercaya. Pernyataan tak bersumber bisa saja dipertentangkan dan dihapus.Cari sumber: Sejarah Buddhisme – berita · surat kabar · buku · cendekiawan · JSTOR (Juni 2018) Bagian dari seri tentangBuddhisme SejarahPenyebaran Sejarah Garis waktu Sidang Buddhis Jalur Sutra Benua Asia Tenggara Asia Ti...

Branch of neuroscience Neuroanatomy is the study of the anatomy and organisation of the nervous system. Pictured here is a cross-section showing the gross anatomy of the human brain. Neuroanatomy is the study of the structure and organization of the nervous system. In contrast to animals with radial symmetry, whose nervous system consists of a distributed network of cells, animals with bilateral symmetry have segregated, defined nervous systems. Their neuroanatomy is therefore better understo...

 

 

كأس اليونان 1991–92 تفاصيل الموسم كأس اليونان  النسخة 50  البلد اليونان  المنظم الاتحاد الإغريقي لكرة القدم  البطل نادي أولمبياكوس  عدد المشاركين 72   كأس اليونان 1990–91  كأس اليونان 1992–93  تعديل مصدري - تعديل   كأس اليونان 1991–92 (باليونانية: Κύπελλο Ελλάδος...

 

 

Ini adalah sebuah nama Indonesia yang tidak menggunakan nama keluarga. Teddy Minahasa Putra Perwira Tinggi Pelayanan Markas Kepolisian Negara Republik IndonesiaMasa jabatan14 Oktober 2022 – 31 Mei 2023Kepala Kepolisian Daerah Jawa TimurMasa jabatan10 Oktober 2022 – 14 Oktober 2022 PendahuluNico AfintaPenggantiToni HarmantoKepala Kepolisian Daerah Sumatera BaratMasa jabatan25 Agustus 2021 – 10 Oktober 2022 PendahuluToni HarmantoPenggantiRusdi HartonoStaf Ahli M...

American diplomat (1906–1992) Edward A. ClarkUnited States Ambassador to Australia In office1965–1967PresidentLyndon B. JohnsonPreceded byWilliam C. BattleSucceeded byWilliam H. Crook Personal detailsBorn(1906-07-15)July 15, 1906San Augustine, TexasDiedSeptember 16, 1992(1992-09-16) (aged 86)Political partyDemocraticSpouseAnne MetcalfeAlma materTulane University; University of TexasProfessionLawyer, DiplomatSecretary of State of TexasIn office1937–1939GovernorJames V. AllredPrecede...

 

 

Lois WeberWeber, 1916LahirFlorence Lois Weber(1879-06-13)13 Juni 1879Allegheny City, Pennsylvania, A.S.Meninggal13 November 1939(1939-11-13) (umur 60)Hollywood, California, A.S.PekerjaanAktris, sutradara, produser, screenwriterSuami/istriPhillips Smalley ​ ​(m. 1904; c. 1922)​ Harry Gantz ​ ​(m. 1926; c. 1935)​PenghargaanHollywood Walk of Fame – Motion Picture6518 Hollywood Blvd Florence Lo...

 

 

Pemandangan kota Tacoma Tacoma merupakan sebuah kota di Amerika Serikat. Kota ini letaknya di bagian barat. Tepatnya di negara bagian Washington. Terletak 32 km dari Seattle. Pada tahun 2000, kota ini memiliki jumlah penduduk sebanyak 196.532 jiwa dan memiliki luas wilayah 162 km². Kota ini memiliki angka kepadatan penduduk sebesar 3.138 jiwa/km². Kota ini merupakan kota terbesar ketiga di negara bagian Washington. Pranala luar Wikimedia Commons memiliki media mengenai Tacoma, Was...

2020 Pocono Organics 150 to Benefit Farm Aid Race details Race 6 of 23 of the 2020 NASCAR Gander RV & Outdoors Truck Series Date June 28, 2020Official name Pocono Organics 150 to Benefit Farm AidLocation Long Pond, Pennsylvania, Pocono RacewayCourse Permanent racing facility2.5 mi (4.0 km)Distance 60 laps, 150 mi (241.402 km)Scheduled Distance 60 laps, 150 mi (241.402 km)Average speed 94.077 miles per hour (151.402 km/h)Pole positionDriver Johnny Sauter ThorSport Racing Grid position...

 

 

Questa voce sull'argomento attori statunitensi è solo un abbozzo. Contribuisci a migliorarla secondo le convenzioni di Wikipedia. Segui i suggerimenti del progetto di riferimento. David Eigenberg David Eigenberg (New York, 17 maggio 1964) è un attore statunitense, noto per la sua interpretazione del barista Steve Brady in Sex and the City e del Vigile del Fuoco Christopher Herrmann in Chicago Fire. David ha vissuto i primi anni della sua vita a Long Island, insieme alle due sorelle, B...

 

 

American politician (1887–1987) Alf LandonLandon, c. 193626th Governor of KansasIn officeJanuary 9, 1933 – January 11, 1937LieutenantCharles ThompsonPreceded byHarry WoodringSucceeded byWalter HuxmanChairman of the Kansas Republican PartyIn officeAugust 27, 1928 – August 26, 1930Preceded bySeth G. WellsSucceeded byJohn Hamilton Personal detailsBornAlfred Mossman Landon(1887-09-09)September 9, 1887West Middlesex, Pennsylvania, U.S.DiedOctober 12, 1987(1987-10-...

This list of gastropods described in 2017 is a list of new taxa of snails and slugs of every kind that have been described (following the rules of the ICZN) during the year 2017. The list only includes taxa at the rank of genus or species. For changes in taxonomy above the level of genus, see Changes in the taxonomy of gastropods since 2005. Fossil gastropods Main article: 2017 in paleomalacology § Gastropods Marine gastropods New species Neomphalina Dracogyra subfuscus Chen, Zhou, Wan...

 

 

Brazilian footballer (born 1945) This biography of a living person needs additional citations for verification. Please help by adding reliable sources. Contentious material about living persons that is unsourced or poorly sourced must be removed immediately from the article and its talk page, especially if potentially libelous.Find sources: César Maluco – news · newspapers · books · scholar · JSTOR (May 2009) (Learn how and when to remove this message...

 

 

منظمة التعاون الاقتصادي (بالإنجليزية: Economic Cooperation Organization)‏(بالفرنسية: Organisation de la coopération economique)‏(بالألمانية: Organisation für Wirtschaftskooperation)‏      الاختصار (بالإنجليزية: ECO)‏،  و(بالفرنسية: OCE)‏،  و(بالألمانية: OWZ)‏  البلد إيران[1]  المقر الرئيسي طهران  تاريخ ال�...

Khapabandar kota (kerajaan tempatan)Peta India. BenderaNegaraIndiaNegara bagianMaharashtraDistrikNagpurbandar kota (kerajaan tempatan)KhapaPopulasi (2001) • Total14.972 • Melek huruf10.814 (6.082 lelaki 4.732 perempuan) • Jenis kelamin56% lelaki dan 44% perempuanZona waktuGMT • Musim panas (DST)GMTbawah 6 tahun1860 (2001) Khapa adalah sebuah bandar kota (kerajaan tempatan) yang terletak di Distrik Nagpur di negara bagian Maharashtra, India....

 

 

  هذه المقالة عن كريم بلقاسم. لمعانٍ أخرى، طالع بلقاسم. كريم بلقاسم كريم بلقاسم، و(بالإنجليزية: Krim Belkacem)‏  كريم بلقاسم معلومات شخصية الميلاد 15 ديسمبر 1922أيت يحي موسى -  الجزائر الوفاة 18 أكتوبر 1970 ( 48 سنة)فرانكفورت -  ألمانيا مكان الدفن مقبرة العالية طبيعة الوفاة إغ...

 

 

Species of snake This article is about the European grass snake or ringed snake, Natrix natrix. Grass snake is also used in the United Kingdom to refer to the barred grass snake (N. helvetica) and in North America to refer to the smooth green snake (Opheodrys vernalis) and the rough green snake (O. aestivus). Grass snake Conservation status Least Concern  (IUCN 2.3)[1] Scientific classification Domain: Eukaryota Kingdom: Animalia Phylum: Chordata Class: Reptilia Order: Squamata S...

Series of agreements between Poland and its trade unions in 1989 You can help expand this article with text translated from the corresponding article in Polish. (April 2022) Click [show] for important translation instructions. View a machine-translated version of the Polish article. Machine translation, like DeepL or Google Translate, is a useful starting point for translations, but translators must revise errors as necessary and confirm that the translation is accurate, rather than simp...

 

 

هذه المقالة يتيمة إذ تصل إليها مقالات أخرى قليلة جدًا. فضلًا، ساعد بإضافة وصلة إليها في مقالات متعلقة بها. (أكتوبر 2016) جورج زو مونستر   معلومات شخصية الميلاد سنة 1776[1] الوفاة 1844  (67–68 سنة)بايرويت[2]  مواطنة مملكة هانوفر  عضو في الأكاديمية البروسية للعلوم،  ...