Sunteți pe pagina 1din 15

Metode de compresie pe baz de dicionar

Metodele de compresie pe baz de dicionar selecteaz stringuri de simboluri din dicionar i cripteaz fiecare ir sub forma unui token. Avnd un ir de n-simboluri, un compresor pe baz de dicionar poate, n principiu, comprima irul dat pe nH-bii, unde H este entropia irului. Astfel, aceste compresoare sunt entropii de criptare pentru fiierele de intrare de lungime foarte mari. n general se utilizeaz metoda adaptiv de comprimare pe baz de dicionar ntruct se poate ncepe cu un dicionar gol sau unul implicit de dimensiune mic, la care se adaug cuvinte ce se gsesc n fluxul de intrare, i terge din cuvintele vechi, pentru a putea facilita cutarea n dicionar. O asemenea metod const ntr-o bucl, n care fiecare interaie ncepe cu citirea fiierului de intrare i fragmentarea acestuia n cuvinte sau fraze. Apoi, se caut fiecare cuvnt n dicionar, iar n cazul n care un match este gsit, s se scrie un token n fluxul de ieire; n caz contrar, cuvntul necompresat se va aduga n dicionar. Ultimul pas al fiecrei iteraii verific dac este necesar tergerea unor cuvnte mai vechi din dicionar. Pentru a decomprima fiierul compresat, se citete fiierul de intrare, se verific dac elementul curent este token sau dat necompresat, se folosete un token pentru a obine date din dicionar i n final se afieaz datele necompresate de la care s-au plecat.

Dicionarul simplu de compresie


Metodele de compresie bazate pe iruri de simboluri sunt mai eficiente dect metodele ce comprim simbolurile individuale, astfel c o compresie bun este posibil doar dac simbolurile din alfabet au probabiliti ct mai diferite de apariie. Dicionarul simplu de compresie cuprinde dou metode de trecere: prima trecere const n citirea fiierului de intrare i preagtirea unei liste cu toi octeii diferii gsii, iar cea de-a doua folosete lista obinut pentru a comprima octeii de date. Paii folosii pentru comprimarea datelor sunt:

1. Se citete fiierul surs, iar pentru octeii diferii gsii se creeaz o list n care se va trece frecvena de apariie al fiecrui octet . 2. Lista este sortat descrescator n funcie de frecvenele octeilor. Astfel, se ncepe cu valori ale octeilor comuni din fiier i se termin cu octeii care sunt distinci (lista poate conine maxim 256 elemente). 3. Lista sortat devine dicionar; se va scrie n fiierul de compresie, precedat de lungimea sa. 4. Este citit fiecare octet din fiierul surs, este cutat n dicionar i se reine indexul acestuia n fiierul de compresie, precedat de un cod pe 3-bii ce exprim lungimea indexului. Compresorul deine un buffer scurt pe 2-octei n care colecteaz octeii ce trebuiesc scrii n fiierul de compresie. Cnd primul octet al bufferului este umplut, acesta este scris n fiier i al doilea octet este mutat n locul primului octet. Decompresia este simpl. Se ncepe cu citirea lungimii dicionarului, precedat de citirea dicionarului. Se decomprim fiecare octet prin citirea codului pe 3-bii, urmat de valoarea indexului. Indexul este folosit pentru a localiza urmtorul octet n dicionar.

Metoda LZ77(Sliding window)


Ideea de baz a acestei metode este aceea de a folosi o parte din datele din fluxul de intrare observate anterior ca dicionar. Codificatorul menine o fereastr pentru fiierul de intrare i shifteaza irul de intrare din fereastr de la dreapta spre stnga, n timp ce irurile de simboluri sunt codificate. Fereastra este mprit n dou: partea din stnga se numete buffer de cutare i reprezint dicionarul curent ce conine simbolurile ce au fost introduse recent i au fost comprimate. Partea din dreapta se numete buffer de anticipare i conine textul ce urmeaz a fi comprimat. Un token LZ77 este alctuit din trei pri: poziia, lungimea i urmtorul simbol din bufferul de anticipare. Acest token este scris n streamul de ieire, iar fereastra este shiftat la dreapta (sau, alternativ, streamul de intrare este mutat

la stnga) cu patru poziii: trei poziii pentru irul cutat i o poziie pentru urmtorul simbol. n cazul n care cutarea invers nu produce nici un match, un token LZ77 cu decalajul i lungimea zero, mpreun cu simbolul nemarcat este scris n streamul de ieire. Acesta este i motivul pentru care un token are o a treia component. Token-ii cu decalajul i lungimea zero sunt comuni la nceputul oricrei compresii de iruri, cnd bufferul este gol/aproape gol. Decompresia este mult mai simpl dect compresia. Ea deine un buffer egal n mrime cu fereastra de compresie. Decompresorul ia un token, gsete match-ul n bufferul su, scrie match-ul i cmpul celui de-al treilea token n streamul de ieire, i permut irul pereche i cel de-al treilea cmp n buffer. Metoda LZ77 este util pentru cazurile n care fiierul este comprimat o singur dat i decomprimat adeseori. Aceast metod compar buferul de anticipare cu textul curent din streamul de intrare din bufferul de cutare i niciodat cu textul de intrare de la nceput.

Metoda LZSS
Aceast metod mbuntete LZ77 n trei direcii: menine bufferul de anticipare ntr-o coad circular, menine bufferul de cutare ntr-un arbore binar de cutare i creeaza token-uri cu dou cmpuri n loc de cele trei care stau la baza metodei LZ77. Un arbore binar de cutare este un arbore binar n care subarborele stng al fiecarui nod A conine noduri mai mici dect A, iar subarborele drept al lui A conine noduri mai mari dect A. Inlimea unui arbore binar este [log2n], unde n este numrul de elemente din arbore, iar pentru a obine poziia unui nod din arbore se executa un numr de pai mai mic sau egal cu nlimea arborelui. ntruct metodele de compresie lucreaz cu iruri de caractere, arborele va conine caracterele aezate n ordine lexicografic. Pentru comprimarea irurilor de caractere din bufferul de cutare se utilizeaz coada circular, cu ajutorul creia se vor terge/ aduga elemente n buffer. Astfel, dac pentru o cutare a unui simbol se gsete un ir de lungime k,

atunci se vor terge primele k-caractere din bufferul de cutare nainte de shiftarea ferestrei, i tot attea caractere vor fi adugate n bufferul de cutare dup shiftarea ferestrei la dreapta. Numrul de caractere va fi ntotdeauna acelai, deoarece numrul de caractere terse va fi acelai cu numrul de caractere adugate. Arborele conine T noduri, unde T este lungimea bufferului de cutare din care se scade lungimea bufferului de anticipare la care se mai adaug o poziie (T=S-L+1). A treia mbuntire adus metodei LZ77 se observa n token-urile create la comprimare. Un token LZSS conine doar un offset i o lungime. Daca nu se gasete nici un match pentru stringul cutat, codificatorul emite codul necompresat al urmtorului simbol n locul celui de-al treilea cmp al token-ului din LZ77. Pentru a deosebi un token de codul necompresat, fiecare token este precedat de un singur bit (un flag). Deficientele metodei LZ77 O deficien o reprezont folosirea ipotezei implicite de ncorporare n care patternurile din datele de intrare au loc mpreun. Fluxurile de date care nu ndeplinesc aceast presupunere, comprim insuficient. Un alt dezavantaj l reprezint faptul c bufferul de anticipare are dimensiunile L i S limitate. Dimensiunea stringurilor match este limitat la L-1, dar L trebuie s fie ct mai mic deoarece procesul de potrivire al irurilor de caractere presupune compararea simbolurilor individuale. Dac L ar fi dublat n dimensiune, compresia ar improviza din moment ce sunt posibile match-uri mari, dar codificatorul ar fi mult mai lent la cutarea match-urilor de dimensiuni mari. Deoarece i dimensiunea S este limitat, folosirea unui buffer de cutare de dimensiune mare ar produce o compresie bun, dar ar ncetini codificatorul ntruct cutarea dureaz mai mult. Creterea dimensiunilor celor 2 bufferi determin crearea de tokenuri mari, reducnd astfel eficiena comprimrii.

Perioadele de repetiie
Simbolurile de intrare sunt grupate n cuvinte de lungime L fiecare ce sunt plasate ntr-un buffer de alunecare. Bufferul cuprinde doua pri: un buffer de anticipare cu cuvinte ce trebuiesc comprimate i un buffer ce conine cuvintele B procesate recent. Codificatorul ncearc s potriveasc cuvntul cel mai din stnga din bufferul de anticipare cu coninutul din bufferul de cutare. Numai un cuvnt din bufferul de anticipare este match la un anumit pas. Dac se gsete un match, distana cuvntului de la nceputul match-ului este notat cu m i este codificat de un cod prefix pe 2-pri ce este scris n fluxul de compresie. n cazul n care nu se gsete nici un match, un cod special este scris, urmat de L simboluri ale cuvntului necomprimat n format de rnd. Performana de compresie al acestei metode este inferioar metodei LZ77, dar este interesant din 2 motive: 1. Este universal i optim, nu folosete statistica streamului de intrare, iar performana sa asimptotic se apropie de entropia inputului odat cu creterea streamului de intrare. 2. Aceast metod poate fi modificat permind ascunderea datelor.

QIC-122
Compresia standard QIC-122 este o variant a metodei LZ77 care a fost dezvoltat de QIC pentru comprimarea textului pe -inch de uniti de band cartu de date. Datele sunt citite i mutate ntr-un octet-2048 a bufferului de intrare, de la dreapta la stnga, astfel nct primul caracter este unul din extrema stng. n cazul n care bufferul su este plin, sau atunci cnd toate datele au fost citite din el, algoritmul caut de la stnga la dreapta irurile de caractere ce se repet. Streamul de ieire const din caractere rnd i din token-uri ce reprezint irurile de caractere ce au fost deja vzute n buffer. Un caracter rnd este codificat cu 0 urmat de cei 8 bii ASCII ai caracterului. Un ir este codificat ca un token ce ncepe cu 1 urmat de codul de compresie i de lungimea codului. Codificarile mici sunt codificate ca un 1 urmat de 7 bii

compensare; codificrile mari sunt codificate ca un 0 urmat de 11 bii compensare. Cnd algoritmul de cutare ajunge la captul din dreapta al bufferului, shifteaz bufferul la stnga i insereaz urmtorul caracter pe poziia cea mai din dreapta a bufferului. Decodificatorul este inversul codificatorului (compresie simetrica).

LZX
LZX este o variant a metodei LZ77 care scrie n fluxurile de compresie, fie caracterele diferite, fie perechile(offset, lungime). De fapt, n stream-ul de compresie sunt scrise codurile de lungime variabil pentru caracterele necomprimate, offset-urile i lungimile lor. Dimensiunea bufferului de cutare este o putere a lui 2, ntre 215 i 221. LZX folosete arborii canonici statici Huffman ce ofer coduri prefix de dimensiuni variabile pentru trei tipuri de date. n total sunt 256 caractere posibile, i pot exista numeroase offset-uri i lungimi diferite. Astfel, arborii Huffman sunt de dimensiune mari, iar orice fiier cabinet particular ce este comprimat de LZX are nevoie doar de o mic parte din fiecare arbore. Acele pri din arbore sunt scrise n fluxul de compresie. Deoarece doar un singur fiier cabinet poate consta din mai multe date fiier, fiecare este comprimat separat i este scris n fluxul de compresie ca un bloc n care sunt incluse i acele pri din arbore de care are nevoie. Offset-urile ce se repeta. Notm cu R0, R1, R2 prima, a doua, respectiv a treia cele mai recente offset-uri. Considerm R0, R1, R2 o lista scurt ce o actualizm asemeni unei cozi. Cele trei cantiti sunt iniializate cu 1 i sunt actualizate dup cum urmeaz: dac X R0 i XR1 i XR2, atunci R2<-R1, R1<-R0, R0<-X; dac X=R0, atunci nu se ntmpl nimic; dac X=R1, atunci interschimbm R0 cu R1; dac X=R2, atunci interschimbm R0 cu R2. Deoarece codurile 0,1 i 2 sunt alocate celor trei offset-uri recente speciale, un offset de dimensiune 3 este alocat codului 5, deci n general, unui offset x i este atribuit un cod x+2. Dimensiunea cea mai mare a unui offset este mrimea

bufferului de cutare minus 3, iar codul care i este atribuit este dimensiunea bufferului de cutare minus 1. Formatul blocului de ieire. LZX emite datele comprimate n blocuri ce conin fiecare rnduri de caractere, offset-uri, lungimile match-urilor, i arborii canonici Huffman folosii pentru codificarea celor trei tipuri de date. Un arbore Huffman canonic poate fi reconstruit de-a lungul drumului fiecruia din nodurile sale. Atunci, numai lungimile cilor trebuiesc scrise la ieire pentru fiecare arbore Huffman. LZX limiteaz adncimea unui arbore Huffman la 16, astfel nct fiecare nod este reprezentat la ieire de un numr cuprins ntre 0 i 16. Cifra 0 indic nodul care lipsete (un cod Huffman care nu este folosit n blocul actual). Dac arborele este mare, blocul curent este scris la ieire, i se reia compresarea pentru noi arbori. Nodurile arborilor sunt scrii n forma comprimat. Dac arborele conine cteva noduri consecutive identice, atunci este folosit codificarea n funcie de lungime pentru a le comprima. Cele trei numere 17, 18, 19 sunt folosite n acest scop. Altfel, este scris diferena (modulo 17) dintre lungimea drumului din nodul curent i nodul anterior. La ieire sunt scrii 20 ntregi pe 5-bii de la 0 la 19, ntregi ce sunt codificai de arborele Huffman numit pre-arbore. Pre-arborele este generat dinamic potrivit frecvenelor de apariie a celor 20 de valori i este scris la ieire pe ntregi pe 4-bii, n care fiecare ntreg indic lungimea drumului unuia dintre cele 20 de noduri ale arborelui. Un drum de lungimea 0 indic faptul c unul din cele 20 de noduri nu este folosit n blocul curent.

Diferenierea fiierelor: VCDIFF


Termenul de diferenierea fiierelor se refer la orice metod care localizeaz i comprim diferenele dintre dou fiiere. Metoda are la baz un fiier surs. Fiierul este copiat, iar copia este modificat pentru a deveni un fiier int. Ideea este s se foloseasc ambele fiiere pentru a codifica diferenele dintre ele n forma compresat, astfel nct oricine are fiierele surs i diferenele codificate s poat fi capabil s reconstruiasc fiierul int. Principiul este de a anexa fiierul int fiierului surs,

pentru a trece fiierul combinat prin LZ77 sau o metod similar, i pentru a ncepe s scrie fiierul compresat cnd se ajunge la fiierul int. Dac nu exist nici un fiier surs, atunci diferenierea fiierelor se va reduce la o compresare LZ77 a fiierului int. Cnd procesul LZ77 ajunge la fiierul surs, acesta este comprimat foarte eficient deoarece fiierul surs a fost deja citit n ntregime din bufferul de cutare. Multe pri din fiierul int provin din fiierul surs i, prin urmare, vor fi gsite n bufferul de cutare, obinnd astfel o compresie excelent. Dac fiierul surs este prea mare ca s ncap n bufferul de cutare, ambele surse i fiiere int trebuie s fie segmentate, iar diferena dintre fiecare pereche de segmente trebuie s fie comprimate separat. Dezvoltatorii ai VCDIFF propun o variant a vechiului algoritm LZ77 ce comprim diferenele dintre fiierele int i fiierele surs i creeaz un fiier delta compresat cu trei tipuri de instruciuni: ADD, RU i COPY. Ne imaginm fiierul surs, cu octei notai S0, S1,...Ss-1 , urmat de fiierul int cu octeii T0, T1,...Tt-1 . Ambele fiiere sunt stocate ntr-un buffer U, astfel indexul bufferului pentru Si este i, iar indexul bufferului pentru Tj este s+j. Sarcina codificatorului VCDIFF este s scaneze bufferul U, s gseasc match-uri ntre sursa i sirurile de caractere int, i s creeze un fiier delta cu instruciuni delta. Orice codificator ce creeaza un fiier delta valid este considerat un codificator VCDIFF compatibil. Decodificatorul VCDIFF, pe de alt parte, este direct i implic instruciunile delta pentru a genera fiierul int precum urmeaz: ADD are dou argumente: o lungime x i o secven de x octei. Octeii sunt anexai de decodificator, fiierului int ce a fost generat. RUN este un caz special a ADD unde octeii x sunt identici i are dou argumente: o lungime x i un singur octet b. Decodificatorul execut RUN prin anexarea a x apariii a lui b la fiierul int. COPY are de asemenea dou argumente, o lungime x i un index p n bufferul U. Decodorul localizeaz subirurile de lungime x care ncep la indexul p n U i anexeaza o copie fiierului int. Un fiier delta ncepe cu un antet ce conine numeroase detalii despre restul fiierului. Antetul este urmat de ferestre n care fiecare fereastr este alcatuit din instruciuni delta ale unui segment din fisierele sursa i int. Fiecare

fereastr ncepe cu mai multe elemente care specific formatul instruciunilor delta, urmate de nsi instruciunile delta. Pentru o compresie mai bun, instruciunile sunt codificate n trei vectori astfel: -un vector data ce conine valorile de date pentru instruciunile ADD i RUN; aceast informaie este necompresat; -un vector inst ce conine instruciunile nsi, codificate ca pointeri pentru tabelul de coduri de instruciuni; acest vector este o secven de triplei (index, size1, size2), unde index este indexul din tabela de instruciuni, iar cele dou size anticipeaz dimensiunile din tabel; - un vector addr ce conine indecii pentru instructiunile COPY, codificai ntr-un format relativ.

LZ78
Metoda LZ78 folosete un dicionar alctuit din iruri de caractere ntlnite anterior. Acest dicionar este gol la nceput iar dimensiunea sa este limitat de cantitatea de memorie disponibil. Codificatorul afieaz dou cmpuri de tokenuri: primul cmp este un pointer ctre dicionar iar al doilea cmp este codul unui simbol. Fiecare token corespunde unui ir de simboluri input, iar acest ir este adugat n dicionar dup ce tokenul este scris n fiierul de comprimare. Dicionarul ncepe cu irul null pe poziia zero. Ct timp simboluri sunt introduse i codificate, stringuri sunt adugate n dicionar pe poziiile 1,2 i tot aa. Cnd urmtorul simbol x este citit din fiierul de intrare, n dicionar este cutat intrarea cu irul cu un singur simbol x. Dac nu este gsit nici o intrare, x este adugat pe urmtoarea poziie disponibil din dicionar i tokenul (o,x) este afiat. Dac o intrare pentru x este gsit, urmtorul simbol y este citit, iar n dicionar este cutat intrarea ce conine stringul cu dou caractere xy. Dac nu este gsit nici o intrare, atunci stringul xy este adugat pe urmtoarea poziie disponibil n dicionar. Procesul continu pn cnd se ajunge la sfritul fiierului de intrare. O structur de date eficient pentru dicionar o reprezint cea de tip arbore, dar nu de arbore binar, structur ce faciliteaz cutarea i adugarea unui string n dicionar. Acest arbore mai poart i numele de trie i reprezint un

arbore a crui structur de ramificare la orice nivel este determinat de doar o parte a unui element de date, nu de ntreg articolul. n cazul LZ78, la fiecare string adugat n arbore, se adaug o ramur ce conine doar acel simbol. Decodorul LZ78 funcioneaz prin construirea i meninerea dicionarului n acelai mod ca i un codificator. Prin urmare este mai complex dect decodorul LZ77.

LZFG
Codificatorul genereaz un fiier comprimat cu tokenuri i literali amestecai. Exist dou tipuri de simboluri: un literal i o copie. Un token literal indic irul de literati ce urmeaz, iar tokenul copie pointeaz spre un ir vazut anterior n dat. Decodificatorul incepe cu un buffer gol de dimensiune mare n care se genereaz i se shifteaz fiierul decompresat. Cnd decodificatorul introduce un token, acesta introduce urmtorii 23 octei ca rnduri de coduri ASCII n buffer, mutnd bufferul astfel nct ultimii octei s fie cei din extrema dreapt. Cnd decodificatorul introduce (copy 4 23), atunci el copie irul de lungime 4 ncepnd de la poziia 23 din captul din dreapta a bufferului. Fie metoda LZFG adnotat A1 ce conine tokenuri literai pe 8-bii i tokenuri-copie pe 16-bii. Un token literat are forma 0000nnnn, n care nnnn indic numrul de octei ASCII ce nsoesc tokenul. Deoarece cmpul pe 4-bii nnnn poate avea valori ntre 0 i 15, ei sunt interpretai ca valori ntre 1 i 16. Astfel, cel mai lung ir de literai posibil este de 16 octei. Metoda A1 mprumut ideea de buffer glisant al metodei LZ77, dar se comport, de asemenea, i ca metoda LZ78, din moment ce creeaz dou cmpuri token. De aceea, LZFG poate fi considerat un hibrid a celor dou metode originale LZ. Cnd A1 ncepe, ea creeaz n mare parte literai, dar cnd aceasta i mrete viteza, beneficiaz de o adaptare puternic astfel nct din ce n ce mai muli tokenuri-copie apar n streamul de comprimare.

LZRW1
Ideea de baz este de a gsi un macth dintr-un singur pas, folosind o tabela de dispersie. Aceast metod este rapid, dar nu este foarte eficient, avnd n vedere c primul match gsit nu este ntotdeauna cel mai lung. Metoda folosete tot spaiul de memorie disponibil ca un buffer i codific streamul de intrare n blocuri. Un bloc este citit din buffer i este complet criptat dup care un alt bloc este citit i criptat .a.m.d. Lungimea bufferului de cutare este 4K, iar dimensiunea bufferului de anticipare este de 16 octei. Aceste doua buffere alunec de-a lungul blocului de intrare din memorie de la stnga spre dreapta. Este necesar s se menin un singur indicator p_src, ce pointeaz la poziia de start a bufferului de anticipare. Pointerul p_src este iniializat cu 1 i este incrementat dup ce fiecare fraz este criptat, mutnd astfel ambele buffere spre dreapta n funcie de lungimea frazei criptate. Se observ faptul c vectorul de pointeri nu trebuie iniializat atunci cnd procesul de codificare ncepe, deoarece codificatorul verific fiecare pointer. Intiial, toi indicii sunt aleatori, dar odat ce sunt nlocuii, tot mai muli dintre ei indic match-urile reale. Fiierul de ieire al codificatorului LYRW1 este format din grupuri, fiecare ncepnd cu un cuvnt de control pe 16-bii, urmat de 16 itemi. Un item este fie un literat pe 8-bii, fie un item copie(un match) pe 16-bii format dintr-un cmp b pe 4-bii i un offset (cmpurile a i c) pe 12-bii. Cmpul lungime indic lungimea dintre 3 i 16. Cei 16 bii ai cuvntului de control marcheaz fiecare din cei 16 itemi care urmeaz (un flag 0 indic un literat, iar un flag 1 indic un match). Ultimul grup poate conine un numr mai mic dect cei 16 itemi. Decodificarea este mai simpl dect codificarea, avnd n vedere c nu necesit vectorul de indici. El menine un buffer mare folosind un pointer p_src n acelai mod ca i codificatorul. Decodificatorul citete un cuvnt de control din streamul de compresie i folosete cei 16 bii pentru a citi cei 16 itemi. Un item literat este decodificat prin anexarea sa n buffer i incrementarea lui p_src cu 1. Un item copie este decodificat prin substragerea unui offset din p_src, prelund un ir din bufferul de cutare, de lungimea indicat de cmpul lungime, i adugarea sa n buffer, dup care p_src este incrementat cu acea lungime.

LZRW4
LZRW4 folosete un buffer de 1 Mbyte n care ambele buffere, cel de cutare i cel de anticipare se mut de la stnga la dreapta. n orice moment n procesul de codificare, contextul de ordin 2 al simbolului curent (dou dintre cele mai recente simboluri din bufferul de cutare) este utilizat pentru a prezice simbolul curent. Cele dou simboluri ce constituie contextul sunt distribuite unui numr I pe 12-bii, ce este folosit ca index pentru un vector A de partiii cu 212 intrri. Fiecare partiie conine 32 de pointeri ctre datele de intrare din bufferul de 1Mbyte, fiecare pointer reinnd cel mai lung match dintre bufferul de anticipare i datele de intrare vzute pn atunci. Cel mai lung match este selectat i codificat pe 8 bii. Primii trei bii codific lungimea match-ului , iar ultimii 5 bii identific pointerul n partiie. Un astfel de numr pe 8 bii se numete item copie. Dac nu este gsit nici un match, un literat este codificat pe 8 bii. Pentru fiecare item, un bit n plus este pregtit, un 0 pentru un literat i un 1 pentru un item copie. Biii suplimentari sunt mprii n grupuri de 16, iar fiecare grup este afiat ca un LZRW1, urmat de cei 16 itemi la care se refer. Partiiile sunt actualizate tot timpul prin mutarea pointerilor buni la nceputul partiiilor lor. Atunci cnd un match este gsit, codificatorul interschimb pointerul selectat cu pointerul de la jumtatea partiiei. Dac nu este gsit nici un match, ntreaga partiie de 32 de pointeri este introdus la dreapta, indicnd simbolul curent.

LZW
Dicionarul LZW este un vector de iruri de dimensiune variabil. Principiul LZW este acela c, codificatorul ia simbolurile unul cte unul i le adaug ntr-un string I. Dup ce fiecare simbol este introdus i concatenat la I, stringul I este cutat n dicionar. Att timp ct I este gsit n dicionar, procesul continu. La un moment dat, adugarea unui nou simbol x, va duce la o cutare euat, deoarece stringul Ix nu se gsete n dicionar. n acest moment codificatorul afieaz pointerul din dicionar, ce pointeaz la stringul I, salveaz stringul Ix n urmtoarea intrare disponibil n dicionar, i iniializeaz stringul I cu simbolul x.

Decodorul ncepe cu primele intrri ale dicionarului iniializate cu toate simbolurile alfabetului. Se citete atunci fiierul de intrare (ce const n indici de dicionar) i folosete fiecare indice pentru a gsi simboluri necompresate din dicionarul su, pe care le scrie n fiierul de ieire. Acesta se bazez pe dicionar, n aceeai msur ca i codificatorul. n primul pas de decodificare, decodorul ia primul pointer pentru a putea gsi un item I n dicionar. Acesta este un string de simboluri i este scris n fiierul de ieire al decodorului. irul Ix trebuie s fie salvat n dicionar, dar simbolul x rmne necunoscut; el va fi primul simbol din urmtorul string gsit n dicionar. n fiecare etap de decodificare dup etapa de dinainte, decoderul ia urmtorul pointer, gsete urmtorul string J din dicionar, l scrie n fiierul de ieire, izoleaz primul su simbol x i salveaz stringul Ix n urmtoarea intrare disponibil n dicionar. Decodorul mut apoi J n I i este pregtit pentru urmtorul pas. Asemeni metodei LZ78, pentru structurarea dicionarului, se folosete structura de arbore. Adugarea stringului Ix unui asemenea arbore se realizez prin adugarea unui nod cu simbolul x. O modalitate de a concepe aceast structur de date este de a aranja arborele ntr-un vector de noduri, fiecare structur avnd dou cmpuri: un simbol i un pointer la nodul printe. Un nod nu are pointeri la alte noduri fii. Parcurgerea arborelui, de la un nod la fii si, se face printr-un proces de hashing n care pointerul nodului i simbolul fiului sunt distribuii pentru a crea un nou pointer. Variante ale metodei LZW: Metoda LZMW ce procedeaz astfel: n loc s adauge I cu un caracter ce aparine urmtoarei fraze din dicionar, adaug I mpreun cu ntreaga fraz ce urmeaz din dicionar. Metoda LZAP : n loc s concateneze ultimele dou fraze i s pun rezultatul n dicionar, pune toate prefixurile concatenrii n dicionar; mai exact, dac S i T sunt ultimele dou match-uri, adaug St n dicionar pentru orice prefix nevid t al lui T, incluznd nsui T. Metoda LZY: adaug un string n dicionar pentru fiecare simbol de intrare i mrete stringul cu un singur simbol la un moment dat.

LZMW
Aceast metod are la baz dou principii: 1. Cnd dicionarul devine complet, cea mai recent fraz folosit din dicionar este tears. 2. Orice fraz adugat n dicionar este o concatenare ntre dou stringuri, match-ul anterior(S) i match-ul curent(S). LZMW se adapteaz inputului su mai repede dect metoda LZW, dar prezint urmtoarele dezavantaje: - Structura de date a dicionarului nu poate fi o simpl ncercare LZW , din moment ce nu orice prefix al frazelor dicionar este inclus n dicionar. La adugarea unei fraze S n dicionarul LZW, fiecare prefix al lui S trebuie adugat n structura de date, i fiecare nod din structura de date trebuie s conin o etichet care indic faptul c un nod se afl sau nu n dicionar. - Gsirea celui mai lung string ar putea necesita backtracking, ceea ce duce la o cutare mai lent dect metoda LZW; - O fraz ar putea fi adugat de dou ori n dicionar, fapt ce duce la o alegere mai complicat a structurei de date pentru dicionar.

LZAP
LZAP se adapteaz rapid intrrii sale, precum metoda LZMW, dar elimin necesitatea backtrackingului, o caracteristic ce o face mai rapid dect LZMW. Principiul este urmtorul: n loc s se adauge stringul concatenat SS al ultimelor dou fraze n dicionar, se adaug toate stringurile St n care t reprezint un prefix al lui S. LZAP adaug mai multe fraze la dicionarul acestuia dect adaug LZMW, deci are nevoie de mai muli bii pentru a reprezenta poziia unei fraze. n acelai timp, LZAP asigur o selecie mai mare a frazelor dicionar ca match-uri pentru irurile de intrare, astfel nct sfrete printr-o compresie mai bun dect LZMW, fiind rapid n acelai timp.

LZY
Dicionarul LZY este iniializat la toate simbolurile unice din alfabet. Pentru orice simbol C din fiierul de intrare, decodorul caut cel mai lung string P care precede C i este deja inclus n dicionar. Dac stringul PC nu se afl n dicionar, se adaug acestuia ca o nou expresie. n timp ce se codific inputul, codificatorul ine o eviden a listei matchuri de pn acum L. Iniial L este vid. Dac C este simbolul curent de intrare, codificatorul verific fiecare string M n L, pentru a vedea dac irul MC se afl n dicionar. Dac se afl, atunci MC devine noul match de pn acum i este adugat n L. n caz contrar, codificatorul afieaz numrul lui L i adaug C ca un nou match de pn acum la L. Ieirea pentru LZY nu este sincronizat cu completrile dicionar. De asemenea, codificatorul trebuie s aib grij s nu aib cel mai lung match de ieire ce se suprapune peste el. Decodorul citete fiierul de compresie. El folosete fiecare cod pentru a gsi o fraz n dicionar, afieaz fraza ca un string, dup care folosete fiecare simbol a stringului pentru a aduga o nou fraz dicionarului, n acelai mod precum o face i codificatorul.

S-ar putea să vă placă și