Кіріспе

Lempel–Ziv–Welch (LZW) – Абрахам Лемпель, Джейкоб Зив және Терри Уэлч жасаған әмбебап жоғалмайтын деректерді сығу алгоритмі. Ол 1984 жылы Уэлч тарапынан Лемпель мен Зив 1978 жылы жариялаған LZ78 алгоритмінің жетілдірілген нұсқасы ретінде жарияланды. Алгоритмді іске асыру оңай және аппараттық іске асыруларда өте жоғары өнімділікке қол жеткізуге мүмкіндік береді. Бұл Unix жүйесіндегі файлдарды сығу құралының алгоритмі және GIF кескін форматында қолданылады.

Өзгермелі ендік кодтар

Егер өзгермелі ендік кодтар қолданылса, кодтаушы мен декодер кодталған деректерде енді бірдей нүктелерде өзгертуге сақ болуы керек, әйтпесе олар ағындағы жеке кодтар арасындағы шекараларда келіспеуі мүмкін. Стандартты нұсқада кодтаушы кестеде жоқ ω + s тізбесі кездескенде (оған код қосу қажет), бірақ кестедегі келесі қолжетімді код 2p (p + 1 бит қажет ететін бірінші код) болса, енін p-ден p + 1-ге дейін арттырады. Кодтаушы ω кодын ені p-де шығарады (өйткені бұл код p + 1 бит қажет етпейді), содан кейін кодтың енін ұлғайтады, нәтижесінде келесі шығарылатын кодтың ені p + 1 бит болады. Декодер кесте құруда әрқашан кодтаушыдан бір код қалып қояды, сондықтан ω кодын көрген кезде ол 2p − 1 коды үшін жазба жасайды. Бұл кодтаушының код енін арттыратын нүкте болғандықтан, декодер де осы жерде енді арттыруы керек – p битке сәйкес келетін ең үлкен кодты шығаратын сәтте. Алайда, кодтау алгоритмінің кейбір алғашқы нұсқалары код енін арттырып, содан кейін ω кодын ескі еннің орнына жаңа енде шығарды, бұл декодерге ен бір кодты ертерек өзгерткендей көрінеді. Бұл «ерте өзгерту» деп аталады; ол Adobe компаниясын PDF файлдарында екі нұсқаға да рұқсат беруге мәжбүр етті, бірақ әр LZW сығылған ағынының басында ерте өзгерту қолданылып жатса, оны көрсету үшін арнайы белгіні қосты. LZW сығылуын қолдайтын графикалық файл форматтарының ішінде TIFF ерте өзгертуді қолданады, ал GIF және көптеген басқалары қолданбайды. Кесте таза кодқа жауап ретінде тазартылғанда, кодтаушы мен декодер екі жақ та кодтың енін бастапқы енге қайтарады, таза кодтан кейін келетін кодтан бастап.

Қаптау тәртібі

Шығарылатын кодтар әдетте байт шекараларына сәйкес келмейтіндіктен, кодтаушы мен декодер кодтардың байттарға қалай жинақталатыны туралы келісуі керек. Екі кең таралған әдіс бар: LSB бірінші («ең кіші маңызды бит бірінші») және MSB бірінші («ең үлкен маңызды бит бірінші»). LSB бірінші жинақтауда, бірінші кодтың ең кіші маңызды биті бірінші ағын байтының ең кіші маңызды битімен сәйкестендіріледі, ал егер код 8 биттен асатын болса, жоғары реттік биттер келесі байттың ең кіші маңызды биттерімен сәйкестендіріледі; ал келесі кодтар LSB арқылы ағымдағы ағын байтында әлі пайдаланылмаған ең кіші маңызды биттерге енгізіліп, қажет болған жағдайда келесі байттарға таратылады. MSB бірінші жинақтауда, бірінші кодтың ең үлкен маңызды биті бірінші ағын байтының MSB-сымен сәйкестендіріледі, ал артық биттер келесі байттың MSB-сымен сәйкестендіріледі; келесі кодтар MSB арқылы ағымдағы ағын байтында әлі пайдаланылмаған ең үлкен маңызды биттерге жазылады. GIF файлдары LSB бірінші жинақтау тәртібін қолданады. TIFF файлдары мен PDF файлдары MSB бірінші жинақтау тәртібін қолданады.

Қосымша кодтау

Жоғарыда сипатталған қарапайым схема LZW алгоритмінің өзіне назар аударады. Көптеген қолданбалар шығыс символдарының тізбегіне қосымша кодтау қолданады. Кейбір қолданбалар кодталған ағынды мәтіндік форматқа түрлендірудің әртүрлі әдістерін пайдаланып, басып шығаруға болатын символдар түрінде ұсынады; бұл кодталған мәліметтің көлемін арттырады және сығылу деңгейін төмендетеді. Керісінше, адаптивті энтропиялық кодтаушыны қолдану арқылы сығылуды арттыруға болады. Мұндай кодтаушы келесі символдың мәнінің ықтималдық таралуын, бұған дейін байқалған мәндердің жиілігіне сүйене отырып, бағалайды. Хаффман кодтау немесе арифметикалық кодтау сияқты стандартты энтропиялық кодтау, жоғары ықтималдығы бар мәндер үшін қысқа кодтарды пайдаланады.

Қолданылуы

LZW компрессиясы компьютерлерде ең көп тараған алғашқы әмбебап деректерді қысу әдісі болды. Көлемді ағылшын мәтін файлы LZW арқылы әдетте бастапқы көлемінің жартысына дейін қысылуы мүмкін. LZW 1986 жылы Unix жүйелерінде дерлік стандартты құралға айналған, қоғамдық домендегі compress бағдарламасында қолданылды. Кейіннен ол LZW патентын бұзғаны және LZ77 негізіндегі DEFLATE алгоритмін пайдаланатын gzip қысудың жақсы нәтижелерін көрсеткені үшін көптеген таралымдардан жойылды, бірақ 2008 жылға дейін кем дегенде FreeBSD таралымына compress және uncompress кірген. Тағы да бірнеше танымал қысу құралдары LZW немесе оған ұқсас әдістерді қолданды. LZW 1987 жылы GIF кескін форматының құрамына енген кезде кеңінен таралды. Ол сондай-ақ TIFF және PDF файлдарында (қосымша опция ретінде) қолданылуы мүмкін. (LZW Adobe Acrobat бағдарламалық құралында болғанымен, Acrobat PDF файлдарындағы мәтіндік және түсті кестелерге негіделген кескін деректерінің көп бөлігі үшін әдепкі бойынша DEFLATE-ты қолданады.)

Патенттер

LZW және ұқсас алгоритмдерге қатысты АҚШ-та және басқа да елдерде түрлі патенттер берілді. LZ78-ті Лемпель, Зив, Кохн және Истман жасады, ол Sperry Corporation, кейіннен Unisys Corporation компаниясына тиесілі болды және 1981 жылдың 10 тамызында тіркелді. LZW алгоритміне екі АҚШ патенті берілді: Виктор С. Миллер мен Марк Н. Вегманға, IBM компаниясына тиесілі, бастапқыда 1983 жылдың 1 маусымында және Уэлчқа, Sperry Corporation компаниясына, кейіннен Unisys Corporation компаниясына тиесілі, 1983 жылдың 20 маусымында. Жоғарыда аталған патенттерден басқа, Уэлчтің 1983 жылғы патентіне оған әсер еткен бірнеше басқа патенттерге де сілтемелер енгізілген, соның ішінде 1980 жылы NEC-тің Джун Канатсудан екі жапондық патент (JP9343880A және JP17790880A), (1974) Джон С. Хоернингтен, (1977) Клаус Э. Холцтен және 1981 жылы неміс патенті (DE19813118676) Карл Экхарт Хайнцтен. 1993–1994 жылдары және 1999 жылы Unisys Corporation GIF суреттерінде LZW үшін лицензиялық төлемдерді енгізуге тырысқанда кеңінен сынға ұшырады. 1993–1994 жылдардағы Unisys CompuServe дауы (CompuServe GIF форматын жасаған компания) Usenet-тегі comp.graphics талқысына «GIF форматын алмастыру туралы ойлар» деген тақырыпта әкелді, бұл өз кезегінде электрондық поштамен алмасуға және ақырында 1995 жылы патенттік шектеулерден бос Портативті желілік графикалық (PNG) файл форматын құруға әкелді. Unisys компаниясының LZW алгоритміне арналған АҚШ патенті 2003 жылдың 20 маусымында, тіркелгеннен 20 жыл өткен соң тоқтап қалды. Ұлыбритания, Франция, Германия, Италия, Жапония және Канадада тіркелген патенттердің мерзімі 2004 жылы аяқталды. – Сөздіктегі ең ұзын тізбекті іздеу («ағымдағы» сәйкестік); алдыңғы сәйкестік пен ағымдағы сәйкестіктің біріктірілуін сөздікке қосу. (Осылайша сөздік жазбалары жылдам өседі, бірақ бұл схеманы іске асыру әлдеқайда күрделі.) Миллер мен Вегман сөздік толған кезде жиі қолданылмайтын жазбаларды жоюды ұсынады. LZAP (1988, Джеймс Сторр) – LZMW модификациясы: сөздікке ағымдағы сәйкестікпен алдыңғы сәйкестіктің біріктірілуін ғана қосудың орнына, ағымдағы сәйкестіктің әрбір бастапқы қосымшасымен алдыңғы сәйкестіктің біріктірілуін қосыңыз («AP» – «барлық префикстер» дегенді білдіреді). Мысалы, егер алдыңғы сәйкестік «wiki» және ағымдағы сәйкестік «pedia» болса, онда LZAP кодері сөздікке 5 жаңа тізбек қосады: «wikip», «wikipe», «wikiped», «wikipedi» және «wikipedia», ал LZMW кодері тек «wikipedia» тізбегін ғана қосады. Бұл LZMW-нің күрделілігін азайтады, бірақ сөздікке көбірек жазбалар қосуға мүмкіндік береді. LZWL – LZW-дің буынға негізделген түрі.