LZW, Алгори́тм Ле́мпеля — Зі́ва — Ве́лча (англ. Lempel–Ziv–Welch, LZW) — універсальний алгоритм стиснення даних без втрат, створений Авраамом Лемпелем (англ. Abraham Lempel), Яковом Зівом (англ. Jacob Ziv) і Террі Велчем (англ. Terry Welch). Опублікований Велчем 1984 року як покращена реалізація алгоритму LZ78, опублікованого Лемпелем і Зівом 1978 року.
Алгоритм Лемпеля — Зіва — Велча | |
Коротка назва | LZW |
---|---|
Названо на честь | Авраам Лемпель[1], Яков Зів[1] і Террі Велч[1] |
Ґрунтується на | LZ78[d] |
Першовідкривач або винахідник | Авраам Лемпель, Яков Зів і Террі Велч |
Конструктор | Террі Велч |
Алгоритм Лемпеля — Зіва — Велча у Вікісховищі |
Алгоритм розроблений так, щоб його можна було швидко реалізувати, але він не обов'язково є оптимальним, оскільки він не проводить ніякого аналізу вхідних даних.
Акронім LZW вказує на прізвища винахідників алгоритму: Лемпел, Зів і Велч, але багато хто стверджує, що, оскільки патент належав Зіву, то метод повинен називатися алгоритмом Зіва — Лемпеля — Велча.
Опис
Даний алгоритм при стисненні даних (кодуванні джерела) динамічно створює таблицю перетворення рядків: певним послідовностям символів ставляться у відповідність групи бітів фіксованої довжини (зазвичай 12-бітні). Таблиця ініціюється всіма 1-символьними рядками. По мірі кодування алгоритм переглядає текст символ за символом і зберігає кожен новий унікальний 2-символьний рядок в таблицю у вигляді пари код/символ, де код посилається на відповідний перший символ. Після того, як новий 2-символьний рядок збережений в таблиці, на вихід передається код першого символу. Коли на вході читається черговий символ, для нього по таблиці знаходиться рядок, що вже зустрічався, максимальної довжини, після чого в таблиці зберігається код цього рядка з наступним символом на вході; на вихід видається код цього рядка, а наступний символ використовується як початок наступного рядка.
Алгоритму декодування на вході потрібен лише закодований текст, оскільки він може відтворювати відповідну таблицю перетворень безпосередньо по закодованому тексту.
Алгоритм
- Ініціалізація словника всіма можливими односимвольними фразами. Ініціалізація вхідної фрази ω першим символом повідомлення.
- Знайти в словнику рядок ω найбільшої довжини, який збігається з останніми прийнятими символами.
- Зчитати черговий символ K з кодованого повідомлення.
- Якщо КІНЕЦЬ_ПОВІДОМЛЕННЯ, то видати код для ω, інакше — крок 5.
- Якщо фраза ωK вже є в словнику, присвоїти вхідній фразі ω значення ωK і перейти до Кроку 3, інакше видати код ω, додати ωK в словник, присвоїти вхідній фразі ω значення K і перейти до Кроку 3.
- Кінець.
Застосування
На момент своєї появи алгоритм LZW давав кращий коефіцієнт стиснення для більшості застосувань, ніж будь-який інший добре відомий метод того часу. Він став першим широковживаним на комп'ютерах методом стиснення даних.
Алгоритм був реалізований в програмі compress, яка стала більш чи менш стандартною утилітою Unix-систем приблизно в 1986 році. Кілька інших популярних утиліт-архіваторів також використовують цей метод або близькі до нього.
1987 року алгоритм став частиною стандарту на формат зображень GIF. Він також може (опціонально) використовуватися в форматі TIFF.
На даний момент алгоритм утримується в стандарті PDF.
Приклад
Даний приклад показує алгоритм LZW в дії, зображуючи стан вихідних даних і словника на кожній стадії, як при кодуванні, так і при розкодуванні повідомлення. Щоб зробити вкладення простішим, ми обмежимося простим алфавітом — тільки прописні букви, без знаків пунктуації і пробілів. Повідомлення, яке потрібно стиснути, виглядає наступним чином:
TOBEORNOTTOBEORTOBEORNOT#
Маркер # використовується для позначення кінця повідомлення. Отже в нашому алфавіті 27 символів (26 прописних букв від A до Z і #). Комп'ютер представляє це у вигляді груп бітів, для представлення кожного символу алфавіту нам достатньо групи з 5 бітів на символ. По мірі росту словника розмір груп повинен рости, щоб врахувати нові елементи. 5-бітні групи дають 25 = 32 можливих комбінацій бітів, тому, коли в словнику з'явиться 33-тє слово, алгоритм повинен перейти до 6-бітних груп. Зауважимо, що, оскільки використовується група з всіх нулів 00000, то 33-тя група має код 32. Початковий словник міститиме:
# = 00000 A = 00001 B = 00010 C = 00011 . . . Z = 11010
Кодування
Без використання алгоритму LZW, при передачі повідомлення у початковому вигляді — 25 символів по 5 бітів на кожен символ — воно займає 125 бітів. Порівняємо це з тим, що отримуємо при використанні LZW:
Символ: Бітовий код: Новий запис у словнику: (на виході) T 20 = 10100 O 15 = 01111 27: TO B 2 = 00010 28: OB E 5 = 00101 29: BE O 15 = 01111 30: EO R 18 = 10010 31: OR <--- з наступного символу починаємо використовувати 6-бітні групи N 14 = 001110 32: RN O 15 = 001111 33: NO T 20 = 010100 34: OT TO 27 = 011011 35: TT BE 29 = 011101 36: TOB OR 31 = 011111 37: BEO TOB 36 = 100100 38: ORT EO 30 = 011110 39: TOBE RN 32 = 100000 40: EOR OT 34 = 100010 41: RNO # 0 = 000000 42: OT# Загальна довжина = 6*5 + 11*6 = 96 бітів.
Таким чином, використовуючи LZW ми скоротили повідомлення на 29 бітів з 125 — це майже 22 %. Якщо повідомлення буде довшим, то елементи словника будуть представляти все більш і більш довгі частини тексту, завдяки чому слова, що повторюються, будуть представлені дуже компактно.
Декодування
Тепер уявімо, що ми отримали закодоване повідомлення, наведене вище, і нам потрібно його декодувати. Перш за все нам потрібно знати початковий словник, а подальші записи словника ми можемо реконструювати вже на ходу, оскільки вони є просто конкатенацією попередніх записів.
Дані: На виході: Новий запис: Повний: Частковий: 10100 = 20 T 27: T? 01111 = 15 O 27: TO 28: O? 00010 = 2 B 28: OB 29: B? 00101 = 5 E 29: BE 30: E? 01111 = 15 O 30: EO 31: O? 10010 = 18 R 31: OR 32: R? <---- починаємо використовувати 6-бітні групи 001110 = 14 N 32: RN 33: N? 001111 = 15 O 33: NO 34: O? 010100 = 20 T 34: OT 35: T? 011011 = 27 TO 35: TT 36: TO? <---- для 37 додаємо тільки перший елемент 011101 = 29 BE 36: TOB 37: BE? наступного слова словника 011111 = 31 OR 37: BEO 38: OR? 100100 = 36 TOB 38: ORT 39: TOB? 011110 = 30 EO 39: TOBE 40: EO? 100000 = 32 RN 40: EOR 41: RN? 100010 = 34 OT 41: RNO 42: OT? 000000 = 0 #
Єдина невелика складність може виникнути, якщо нове слово словника пересилається негайно. В приведеному вище прикладі декодування, коли декодер зустрічає перший символ «T», він знає, що слово 27 починається з «T», але чим воно закінчується? Проілюструємо проблему наступним прикладом. Ми декодуємо повідомлення «ABABA»:
Дані: На виході: Новий запис: Повний: Частковий: . . . 011101 = 29 AB 46: (word) 47: AB? 101111 = 47 AB? <--- що нам з цим робити?
На перший погляд, для декодера це нерозв'язна задача. Ми знаємо наперед, що словом 47 повинно бути ABA, але як декодер дізнається про це?
Відмітимо, що слово 47 складається зі слова 29 плюс символ, що йде наступним. Таким чином, слово 47 закінчується на «символ, що йде наступним». Але, оскільки це слово посилається негайно, то воно повинно починатися з «символу, що йде наступним», і тому воно закінчується тим же символом, яким і починається, в даному випадку — A. Цей трюк дозволяє декодеру визначити, що слово 47 це ABA.
У загальному випадку така ситуація з'являється, коли кодується послідовність виду KωKωK, де K — це один символ, а ω — рядок, причому слово Kω вже є в словнику.
Патенти
На алгоритм LZW і його варіації був виданий ряд патентів, як в США, так і в других країнах. На LZ78 був виданий американський патент U.S. Patent 4,464,650, що належить , яка пізніше стала частиною Unisys Corporation. На LZW в США були видані два патенти: U.S. Patent 4,814,746, що належить IBM і патент Велча U.S. Patent 4,558,302 (виданий 20 червня 1983 року), що належав Sperry Corporation і пізніше перейшов до Unisys Corporation. На даний момент строки всіх патентів минули.
Unisys, GIF і PNG
При розробці формату GIF в CompuServe не знали про існування патенту U.S. Patent 4,558,302. У грудні 1994 року, коли в Unisys стало відомо про використання LZW в широковживаному графічному форматі, ця компанія розповсюдила інформацію про свої плани по стягненню ліцензійних відрахувань з комерційних програм, які мають можливості створення GIF-файлів. В той час формат був вже настільки широко розповсюджений, що більшість компаній-виробників ПЗ не мали іншого виходу крім як заплатити. Ця ситуація стала однією з причин розробки графічного формату PNG (неофіційна розшифровка: «PNG's Not GIF»). Наприкінці серпня 1999 року Unisys перервала дію безкоштовних ліцензій на LZW для безкоштовного та некомерційного ПЗ, а також для користувачів неліцензійних програм, що закликав Лігу за вільне програмування (англ. League for Programming Freedom) розгорнути кампанію «спалимо всі GIF'и» і інформувати публіку про існуючі альтернативи. Багато експертів в області патентного права відмічали, що патент не розповсюджується на пристрої, які можуть лише розтискати LZW-дані, але не стискати їх; з цієї причини популярна утиліта gzip може читати .Z-файли, але не записувати їх.
20 червня 2003 року закінчився строк оригінального американського патенту, що означає, що Unisys не може більше стягувати по ньому ліцензійні відрахування. Аналогічні патенти в Європі, Японії та Канаді закінчились 2004 року.
Примітки
- http://www.digitalpreservation.gov/formats/fdd/fdd000135.shtml
- . Архів оригіналу за 30 березня 2022. Процитовано 26 серпня 2019.
{{}}
: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title ()
Див. також
Ця стаття не містить . (січень 2016) |
Ця стаття потребує додаткових для поліпшення її . (січень 2016) |
Це незавершена стаття про алгоритми. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
LZW Algori tm Le mpelya Zi va Ve lcha angl Lempel Ziv Welch LZW universalnij algoritm stisnennya danih bez vtrat stvorenij Avraamom Lempelem angl Abraham Lempel Yakovom Zivom angl Jacob Ziv i Terri Velchem angl Terry Welch Opublikovanij Velchem 1984 roku yak pokrashena realizaciya algoritmu LZ78 opublikovanogo Lempelem i Zivom 1978 roku Algoritm Lempelya Ziva Velcha Korotka nazvaLZW Nazvano na chestAvraam Lempel 1 Yakov Ziv 1 i Terri Velch 1 Gruntuyetsya naLZ78 d Pershovidkrivach abo vinahidnikAvraam Lempel Yakov Ziv i Terri Velch KonstruktorTerri Velch Algoritm Lempelya Ziva Velcha u Vikishovishi Algoritm rozroblenij tak shob jogo mozhna bulo shvidko realizuvati ale vin ne obov yazkovo ye optimalnim oskilki vin ne provodit niyakogo analizu vhidnih danih Akronim LZW vkazuye na prizvisha vinahidnikiv algoritmu Lempel Ziv i Velch ale bagato hto stverdzhuye sho oskilki patent nalezhav Zivu to metod povinen nazivatisya algoritmom Ziva Lempelya Velcha OpisDanij algoritm pri stisnenni danih koduvanni dzherela dinamichno stvoryuye tablicyu peretvorennya ryadkiv pevnim poslidovnostyam simvoliv stavlyatsya u vidpovidnist grupi bitiv fiksovanoyi dovzhini zazvichaj 12 bitni Tablicya iniciyuyetsya vsima 1 simvolnimi ryadkami Po miri koduvannya algoritm pereglyadaye tekst simvol za simvolom i zberigaye kozhen novij unikalnij 2 simvolnij ryadok v tablicyu u viglyadi pari kod simvol de kod posilayetsya na vidpovidnij pershij simvol Pislya togo yak novij 2 simvolnij ryadok zberezhenij v tablici na vihid peredayetsya kod pershogo simvolu Koli na vhodi chitayetsya chergovij simvol dlya nogo po tablici znahoditsya ryadok sho vzhe zustrichavsya maksimalnoyi dovzhini pislya chogo v tablici zberigayetsya kod cogo ryadka z nastupnim simvolom na vhodi na vihid vidayetsya kod cogo ryadka a nastupnij simvol vikoristovuyetsya yak pochatok nastupnogo ryadka Algoritmu dekoduvannya na vhodi potriben lishe zakodovanij tekst oskilki vin mozhe vidtvoryuvati vidpovidnu tablicyu peretvoren bezposeredno po zakodovanomu tekstu AlgoritmInicializaciya slovnika vsima mozhlivimi odnosimvolnimi frazami Inicializaciya vhidnoyi frazi w pershim simvolom povidomlennya Znajti v slovniku ryadok w najbilshoyi dovzhini yakij zbigayetsya z ostannimi prijnyatimi simvolami Zchitati chergovij simvol K z kodovanogo povidomlennya Yaksho KINEC POVIDOMLENNYa to vidati kod dlya w inakshe krok 5 Yaksho fraza wK vzhe ye v slovniku prisvoyiti vhidnij frazi w znachennya wK i perejti do Kroku 3 inakshe vidati kod w dodati wK v slovnik prisvoyiti vhidnij frazi w znachennya K i perejti do Kroku 3 Kinec ZastosuvannyaNa moment svoyeyi poyavi algoritm LZW davav krashij koeficiyent stisnennya dlya bilshosti zastosuvan nizh bud yakij inshij dobre vidomij metod togo chasu Vin stav pershim shirokovzhivanim na komp yuterah metodom stisnennya danih Algoritm buv realizovanij v programi compress yaka stala bilsh chi mensh standartnoyu utilitoyu Unix sistem priblizno v 1986 roci Kilka inshih populyarnih utilit arhivatoriv takozh vikoristovuyut cej metod abo blizki do nogo 1987 roku algoritm stav chastinoyu standartu na format zobrazhen GIF Vin takozh mozhe opcionalno vikoristovuvatisya v formati TIFF Na danij moment algoritm utrimuyetsya v standarti PDF PrikladDanij priklad pokazuye algoritm LZW v diyi zobrazhuyuchi stan vihidnih danih i slovnika na kozhnij stadiyi yak pri koduvanni tak i pri rozkoduvanni povidomlennya Shob zrobiti vkladennya prostishim mi obmezhimosya prostim alfavitom tilki propisni bukvi bez znakiv punktuaciyi i probiliv Povidomlennya yake potribno stisnuti viglyadaye nastupnim chinom TOBEORNOTTOBEORTOBEORNOT Marker vikoristovuyetsya dlya poznachennya kincya povidomlennya Otzhe v nashomu alfaviti 27 simvoliv 26 propisnih bukv vid A do Z i Komp yuter predstavlyaye ce u viglyadi grup bitiv dlya predstavlennya kozhnogo simvolu alfavitu nam dostatno grupi z 5 bitiv na simvol Po miri rostu slovnika rozmir grup povinen rosti shob vrahuvati novi elementi 5 bitni grupi dayut 25 32 mozhlivih kombinacij bitiv tomu koli v slovniku z yavitsya 33 tye slovo algoritm povinen perejti do 6 bitnih grup Zauvazhimo sho oskilki vikoristovuyetsya grupa z vsih nuliv 00000 to 33 tya grupa maye kod 32 Pochatkovij slovnik mistitime 00000 A 00001 B 00010 C 00011 Z 11010 Koduvannya Bez vikoristannya algoritmu LZW pri peredachi povidomlennya u pochatkovomu viglyadi 25 simvoliv po 5 bitiv na kozhen simvol vono zajmaye 125 bitiv Porivnyayemo ce z tim sho otrimuyemo pri vikoristanni LZW Simvol Bitovij kod Novij zapis u slovniku na vihodi T 20 10100 O 15 01111 27 TO B 2 00010 28 OB E 5 00101 29 BE O 15 01111 30 EO R 18 10010 31 OR lt z nastupnogo simvolu pochinayemo vikoristovuvati 6 bitni grupi N 14 001110 32 RN O 15 001111 33 NO T 20 010100 34 OT TO 27 011011 35 TT BE 29 011101 36 TOB OR 31 011111 37 BEO TOB 36 100100 38 ORT EO 30 011110 39 TOBE RN 32 100000 40 EOR OT 34 100010 41 RNO 0 000000 42 OT Zagalna dovzhina 6 5 11 6 96 bitiv Takim chinom vikoristovuyuchi LZW mi skorotili povidomlennya na 29 bitiv z 125 ce majzhe 22 Yaksho povidomlennya bude dovshim to elementi slovnika budut predstavlyati vse bilsh i bilsh dovgi chastini tekstu zavdyaki chomu slova sho povtoryuyutsya budut predstavleni duzhe kompaktno Dekoduvannya Teper uyavimo sho mi otrimali zakodovane povidomlennya navedene vishe i nam potribno jogo dekoduvati Persh za vse nam potribno znati pochatkovij slovnik a podalshi zapisi slovnika mi mozhemo rekonstruyuvati vzhe na hodu oskilki voni ye prosto konkatenaciyeyu poperednih zapisiv Dani Na vihodi Novij zapis Povnij Chastkovij 10100 20 T 27 T 01111 15 O 27 TO 28 O 00010 2 B 28 OB 29 B 00101 5 E 29 BE 30 E 01111 15 O 30 EO 31 O 10010 18 R 31 OR 32 R lt pochinayemo vikoristovuvati 6 bitni grupi 001110 14 N 32 RN 33 N 001111 15 O 33 NO 34 O 010100 20 T 34 OT 35 T 011011 27 TO 35 TT 36 TO lt dlya 37 dodayemo tilki pershij element 011101 29 BE 36 TOB 37 BE nastupnogo slova slovnika 011111 31 OR 37 BEO 38 OR 100100 36 TOB 38 ORT 39 TOB 011110 30 EO 39 TOBE 40 EO 100000 32 RN 40 EOR 41 RN 100010 34 OT 41 RNO 42 OT 000000 0 Yedina nevelika skladnist mozhe viniknuti yaksho nove slovo slovnika peresilayetsya negajno V privedenomu vishe prikladi dekoduvannya koli dekoder zustrichaye pershij simvol T vin znaye sho slovo 27 pochinayetsya z T ale chim vono zakinchuyetsya Proilyustruyemo problemu nastupnim prikladom Mi dekoduyemo povidomlennya ABABA Dani Na vihodi Novij zapis Povnij Chastkovij 011101 29 AB 46 word 47 AB 101111 47 AB lt sho nam z cim robiti Na pershij poglyad dlya dekodera ce nerozv yazna zadacha Mi znayemo napered sho slovom 47 povinno buti ABA ale yak dekoder diznayetsya pro ce Vidmitimo sho slovo 47 skladayetsya zi slova 29 plyus simvol sho jde nastupnim Takim chinom slovo 47 zakinchuyetsya na simvol sho jde nastupnim Ale oskilki ce slovo posilayetsya negajno to vono povinno pochinatisya z simvolu sho jde nastupnim i tomu vono zakinchuyetsya tim zhe simvolom yakim i pochinayetsya v danomu vipadku A Cej tryuk dozvolyaye dekoderu viznachiti sho slovo 47 ce ABA U zagalnomu vipadku taka situaciya z yavlyayetsya koli koduyetsya poslidovnist vidu KwKwK de K ce odin simvol a w ryadok prichomu slovo Kw vzhe ye v slovniku PatentiNa algoritm LZW i jogo variaciyi buv vidanij ryad patentiv yak v SShA tak i v drugih krayinah Na LZ78 buv vidanij amerikanskij patent U S Patent 4 464 650 sho nalezhit yaka piznishe stala chastinoyu Unisys Corporation Na LZW v SShA buli vidani dva patenti U S Patent 4 814 746 sho nalezhit IBM i patent Velcha U S Patent 4 558 302 vidanij 20 chervnya 1983 roku sho nalezhav Sperry Corporation i piznishe perejshov do Unisys Corporation Na danij moment stroki vsih patentiv minuli Unisys GIF i PNG Pri rozrobci formatu GIF v CompuServe ne znali pro isnuvannya patentu U S Patent 4 558 302 U grudni 1994 roku koli v Unisys stalo vidomo pro vikoristannya LZW v shirokovzhivanomu grafichnomu formati cya kompaniya rozpovsyudila informaciyu pro svoyi plani po styagnennyu licenzijnih vidrahuvan z komercijnih program yaki mayut mozhlivosti stvorennya GIF fajliv V toj chas format buv vzhe nastilki shiroko rozpovsyudzhenij sho bilshist kompanij virobnikiv PZ ne mali inshogo vihodu krim yak zaplatiti Cya situaciya stala odniyeyu z prichin rozrobki grafichnogo formatu PNG neoficijna rozshifrovka PNG s Not GIF Naprikinci serpnya 1999 roku Unisys perervala diyu bezkoshtovnih licenzij na LZW dlya bezkoshtovnogo ta nekomercijnogo PZ a takozh dlya koristuvachiv nelicenzijnih program sho zaklikav Ligu za vilne programuvannya angl League for Programming Freedom rozgornuti kampaniyu spalimo vsi GIF i i informuvati publiku pro isnuyuchi alternativi Bagato ekspertiv v oblasti patentnogo prava vidmichali sho patent ne rozpovsyudzhuyetsya na pristroyi yaki mozhut lishe roztiskati LZW dani ale ne stiskati yih z ciyeyi prichini populyarna utilita gzip mozhe chitati Z fajli ale ne zapisuvati yih 20 chervnya 2003 roku zakinchivsya strok originalnogo amerikanskogo patentu sho oznachaye sho Unisys ne mozhe bilshe styaguvati po nomu licenzijni vidrahuvannya Analogichni patenti v Yevropi Yaponiyi ta Kanadi zakinchilis 2004 roku Primitkihttp www digitalpreservation gov formats fdd fdd000135 shtml Arhiv originalu za 30 bereznya 2022 Procitovano 26 serpnya 2019 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite web title Shablon Cite web cite web a Obslugovuvannya CS1 Storinki z tekstom archived copy yak znachennya parametru title posilannya Div takozhLZ77 i LZ78 LZMA Cya stattya ne mistit posilan na dzherela Vi mozhete dopomogti polipshiti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Material bez dzherel mozhe buti piddano sumnivu ta vilucheno sichen 2016 Cya stattya potrebuye dodatkovih posilan na dzherela dlya polipshennya yiyi perevirnosti Bud laska dopomozhit udoskonaliti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Zvernitsya na storinku obgovorennya za poyasnennyami ta dopomozhit vipraviti nedoliki Material bez dzherel mozhe buti piddano sumnivu ta vilucheno sichen 2016 Ce nezavershena stattya pro algoritmi Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi