Documente Academic
Documente Profesional
Documente Cultură
Asachi” Iași
LUCRARE DE DIPLOMĂ
Îndrumător: Absolvent:
2019
1
Universitatea Tehnică „Gheorghe Asachi” Iași
COMPRESIA DATELOR
Tehnici de dicţionar folosite în compresia fără pierderi a datelor
Îndrumător: Absolvent:
2
q
CUPRINS
INTRODUCERE……………………………………………………………………..…...……4
CAPITOLUL I: GENERALITĂŢI............................................................................................5
CONCLUZII……………………………………………………………………………...…….38
BIBLIOGRAFIE………………………………………………………………………...………39
3
INTRODUCERE
Noţiunea de compresia datelor a apărut pe la 1940 prin lucrările lui Shanon şi Fano care au dezvoltat
un algoritm eficient de compresie; acest algoritm a fost repede îmbunătăţit de Huffman prin minimizarea
redundanţei (1952). El a rămas neschimbat până în 1977 când Ziv şi Lempel au stabilit o manieră total
diferită de compresie, denumită schemă de dicţionar (dictionary scheme). Mulţi din algoritmii de
compresie utilizaţi în prezent utilizează variante ale acestor scheme de bază.
Scopul compresiei este de a reduce redundanţa memorată sau conţinută în datele din comunicaţii, în
vederea creşterii vitezei de transmisie. Compresia datelor are aplicaţii mari în domeniul
stocării/memorării fişierelor şi în sisteme distribuite.
Compresia datelor este considerată adesea ca o codare, în timp ce codarea este un termen foarte
general referindu-se la orice reprezentare specială ce satisface un anumit scop. Teoria informaţiei s-a
ocupat de studiul eficient al metodelor de codare, ţinând seama de probabilitatea de eroare şi de viteza de
transmisie. Compresia datelor poate fi vazută ca o latură a teoriei informaţiei în care obiectivul principal
este de a minimiza cantitatea de date ce trebuie transmisă. În acest fel se reduce costul transmisiei şi/sau
al memorării. Simplu, este foarte avantajos să comprimi un fişier la jumatate din mărimea lui iniţială.
O caracaterizare simplă a compresiei este aceea ce se referă la transformarea unui şir de caractere într-o
anumita reprezentare (cum este ASCII) într-un nou şir (de biţi, de exemplu), care conţine aceeaşi
informaţie, dar are lungimea mai mică pe cât posibil.
Pentru toate tipurile de compresie se presupune un canal fără zgomot, deci nu se pune problema corecţiei
erorilor.
4
Capitolul I: GENERALITĂŢI
La modul general, compresia datelor este un proces de codificare prin care se urmăreşte
micşorarea mesajului generat de o sursă, pentru a reduce mijloacele necesare memorării sau transmiterii
acestui mesaj. Pentru că modul de reprezentare al datelor se realizează prin simboluri binare, cele mai
multe metode de compresie au ca obiectiv reducerea numărului de simboluri binare necesar pentru
reprezentare mesajului. Odată compresat, mesajul va putea fi readus la forma iniţială prin tehnica
decompresiei, care, în mare, constă în parcurgerea paşilor necesari compresiei în ordine inversă.
Compresia fără decompresie este inutilă, pentru că datele obţinute prin compresie pot fi considerate doar
un balast în memoria calculatorului unde au fost stocate, atât timp cât acestea nu pot fi reconvertite la o
forma accesibilă.
Codul Morse, inventat în anul 1838 pentru telegrafie, este un exemplu de compresie a datelor bazată pe
folosirea unor cuvinte cheie mai scurte pentru literele mai des întâlnite în limba engleză. În anul 1949
Claude Shannon şi Robert Fano au conceput un sistem de asociere între cuvinte cheie şi anumite blocuri
de date, în baza unor probabilităţi de apariţie. Cel care a desăvârşit opera celor doi, găsind o modalitate
optimă a metodei, este David Huffman, în anul 1951. Mijlocul anilor ’70 a dus, odată cu utilizarea tot
mai des a fişierelor de tip text şi a stocării lor, la 7 modificări şi adaptări ale codului Huffman. În 1977,
Abraham Lempel şi Jacob Ziv au sugerat folosirea unui algoritm bazat pe înlănţuirea listelor de pointeri,
iar odată cu apariţia ideilor lui Terry Welch în anii 1980, s-a conturat algoritmul care avea să devină rapid
opţiunea principală pentru compresia cu scop general: LZW(Lempel-Ziv-Welch).
5
datorită micşorării cantităţii de informaţie, a diminuărilor pierderilor acestuia datorate protocoalelor de
comunicaţie şi a accesului mai rapid la unitatea de stocare a datelor în timpul rulării unui program.
Cel mai general model al unui sistem de compresie de date este cel din figura de mai jos.
Prima transformare este transformarea care reduce entropia cu scopul de a elimina parametrii
mesajului care nu au importanţă pentru destinatar (specific cazului lossy). Transformarea următoare
conservă entropia datelor dar reduce redundanţa în scopul măririi eficienţei transmisiunii sau stocării
(specific cazului lossless). În cazul în care transmisia se face pe un canal cu zgomot se poate
reintroduce o anumită redundanţă prin utilizarea de coduri corectoare sau detectoare de erori.
Deoarece aceste coduri nu realizează o compresie ci dimpotrivă o creştere a dimensiunii datelor ele
nu vor fi tratate în continuare.
6
Capitolul II: CLASIFICĂRI
În cadrul acestui domeniu există o mare varietate de metode, de cele mai multe ori prezentate
individual, fără a se încerca integrarea acestora. Acest lucru impune clasificări, care se pot face după
diverse criterii.
În funcţie de modul cum evolueaza în timp modelul sursei de date, metodele de compresie se
pot împărţi astfel:
2.1 Metode statice - în care modelul este fix, nu evoluează în timp ci este construit
apriori, pe baza unor mesaje considerate tipice. În această categorie este inclusă compresia realizată în
cazul transmisiilor fax. Este utilă în situaţiile în care cunoaştem statistica fluxului de date şi aceasta
ramâne neschimbată, rezultând metode dedicate unui anumit context. Datorită caracterului static se
pretează bine chiar şi la implementări hardware. Schemă generală de compresie (codare) pentru acestă
situaţie este dată în Figura 1.1.
2.2 Metode semistatice - în care modelul este construit înaintea codării (comprimării) pe
baza datelor ce urmează să fie comprimate şi este menţinut nemodificat pe durata acesteia. Avantajul
constă în adaptarea metodei la fluxul de date (metodele fiind mai general aplicabile). Dezavantajele sunt
necesitatea parcurgerii de două ori a fluxului de date şi necesitatea transmiterii modelului spre decodor,
fapt care încarcă suplimentar fluxul de date şi deteriorează performanţele. În această categorie se
încadrează metoda de comprimare bazată pe algoritmul Huffman (cunoscută de obicei ca şi metoda
Huffman static – notaţie oarecum nefericită dar consacrată). Schemă generală de compresie (codare)
pentru această situaţie este dată în Figura 1.2.
7
2.3 Metode dinamice (adaptive) - în care compresia începe la o anumită stare a modelului,
aceeaşi atât în cazul comprimării cât şi în cel al decomprimării. Starea iniţială a modelului poate fi la
rândul ei determinată ca şi în unul din cazurile anterioare. Fiecare simbol se codează pe baza modelului
curent. După codare sau respectiv decodare (la decodor) starea modelului se actualizează în acelaşi mod
atât la codor cât şi la decodor. Se elimină astfel cele două dezavantaje importante ale metodelor
semistatice. Cele mai cunoscute metode de acest tip sunt compresia Huffman adaptivă şi metodele de
dicţionar. În acest caz schema generală de compresie devine cea din Figura 1.3
8
diferitelor cercetări s-a stabilit, în cazul imaginilor, că ochiul uman nu poate face 11 diferenţa între
anumite nuanţe de culori, de aceea, alăturarea unor frecvenţe de culoare asemănătoare poate genera o
simplificare prin reducerea la o singură nuanţă de culoare. Pe de altă parte, ochiul şi urechea umană nu
pot detecta semnale vizuale şi audio care nu se încadrează între anumite frecvenţe, de aceea, se realizează
o filtrare a acestor semnale, păstrându-se doar frecvenţele posibil a fi recepţionate. Pentru fluxul de date
video, compresia ia în considerare şi diferenţa dintre cadrele care alcătuiesc filmul, algoritmii vizând
comprimarea pe două direcţii: intra şi inter-cadru. Pentru a se obţine o rată bună de compresie, chiar şi în
cazul datelor foto-video, se folosesc metode combinate din algoritmi ce reduc redundanţa la nivel de cod
şi la nivel de pixeli, pe de o parte, şi algoritmi psihovizuali, pe de altă parte. Un astfel de standard este
JPEG( Joints Photographic Experts Group), poate cea mai celebră tehnică de compresie foto cu pierdere
de informaţie. Deşi acesta a suferit câteva transformări de la prima versiune, în principiu el a rămas
asociat ideii de cuantizare a informaţiei vizuale, care constă în limitarea valorilor într-un anume interval,
considerat normal din punct de vedere al percepţiei umane.
Metodele de compresie fără pierderi de informaţie au la bază ideea eliminării informaţiei redundante.
Această redundanţă se datorează:
• Distribuţia poziţiei (unele caractere ocupă locuri preferenţiale în anumite blocuri de date)
ca în cazul recunoaşterii de caractere, care necesită adesea algoritmi bazaţi pe forma conturului, pe
structura şi pe alte proprietăţi interne ale regiunii analizate.
h(A)= log 2(1/p(A))= -log 2p(A), unde p(A) este probabilitatea de apariţie a
evenimentului A, iar unitatea de măsură este multiplu de bit.
9
Entropia (gradul de nedeterminare) unei surse discrete este definită ca fiind cantitatea medie de
informaţie furnizată de apariţia unui simbol în sursă
H(S) = -∑i m p(Ai)*log 2 p(Ai), unde S este sursa, A este mulţimea de m simboluri,
iar p(Ai) reprezintă probabilitatea de apariţie a simbolului Ai.
Eficienţa unei surse este raportul dintre entropia sursei şi entropia maximă
Modelarea statistică a unei surse discrete de informaţie constă în asocierea unei probabilităţi de
apariţie fiecărui simbol al alfabetului sursei urmată apoi de atribuirea de cuvinte de cod cu un număr
mai mic de biţi cuvintelor cu o probabilitate de apariţie mai mare. Din această categorie fac parte
codificarea Shannon-Fano, codificarea Huffman statică (optimă pentru cazul codificării simbol cu
simbol), codificarea Huffman dinamică, codificarea aritmetică (codifică secvenţe de simboluri şi nu
simboluri individuale).
Aceste metode au la bază faptul că şirul de simboluri generate de sursă prezintă constrângeri în
ceea ce priveşte combinaţiile care pot să apară. Datorită acestor constrângeri nu toate combinaţiile
posibile apar cu aceeaşi frecvenţă.
Ideea este de a construi un dicţionar din cuvinte ale limbajului asociat sursei. Ulterior inserării unui
cuvânt în dicţionar în cazul oricărei apariţii a cuvântului acesta se înlocuieşte cu o informaţie despre
poziţia sa în dicţionar. În acest caz modelul sursei este reprezentat de dicţionar. Din această categorie
fac parte algoritmii LZ77, LZ78 , LZW.
10
CAPITOLUL 3: COMPRESIA DE DATE PRIN METODA HUFFMAN
Algoritmul Huffman constituie o tehnică optimală pentru fişierele de tip text, nici
un alt algoritm neasigurând o lungime medie mai mică cuvintelor. Oricare alt algoritm poate da o
lungime egală cu cea a modelului Huffman, dar niciodată mai mică.
Codificarea unei imagini gray-level prin Huffman conţine cel mai redus număr de
simboluri codate raportat la simbolurile sursei, atunci când codificarea se face printr-o singură
parcurgere. Pentru a exemplifica, să alegem o imagine generată de dimensiune 4x4:
11
Simbolurile identificate în imagine sunt: a1=119, a2=123, a3=168, a4=107, având
următoarele probabilităţi de apariţie: p(a1)=0.5, p(a2)=0.125, p(a3)=0.1875 şi p(a4)=0.1875. Se
ordonează simbolurile descrescător, în funcţie de probabilităţi:
12
Algoritmul Huffman poate fi privit şi din perspectiva construirii unui arbore binar
în care fiecare nod are fie nici un fiu, fie exact 2 fii, în care frunzele reprezintă simboluri
generate de sursa de informaţie şi au ataşat un cost egal cu frecvenţa de apariţie a acestora, iar
nodurile interne au ataşat un cost egal cu suma costurilor fiilor. Rădăcina arborelui are, în acest
caz, costul 1. Arborele de codificare obţinut are rolul unui dicţionar, care este un termen general
utilizabil în compresia datelor şi constituie orice structură de date care se ataşează şirului
comprimat, pentru ca programul de decompresie să poată reconstitui forma iniţială. Varianta
prezentată mai sus este una statică, pentru că atât compresorul, cât şi decompresorul folosesc
acelaşi arbore de compresie calculat pe baza unor frecvenţe de apariţie şi nu mai este necesară
calcularea unui arbore nou şi transmiterea acestuia. Acest lucru este echivalent cu prezentarea
proprietăţilor codajului Huffman de bloc instantaneu unic decodabil.
Pentru varianta dinamică sunt cunoscuţi doi algoritmi performanţi: FGK( Faller,
Gallagher, Knuth) şi V( Vitter). Aceştia au în comun faptul că arborele se construieşte dinamic
pe măsură ce sursa generează simboluri, nefiind necesară stocarea decât pentru o mică parte din
date, pentru o optimizarea procesului. Rata de compresie în variantele dinamice sunt în general
cele mai bune, dar contează şi specificul şi scopul compresiei datelor, pentru a face alegerea cea
mai bună.
Arborele creşte (se dezvoltă, evoluează) la fiecare simbol citit din fişierul de intrare. Modul
de evoluţie al arborelui este identic la compresie şi la decompresie. Eficienţa metodei se
bazează pe o proprietate a arborilor Huffman, cunoscută sub numele de proprietatea „fiilor”
(„sibling property”).
13
Proprietate (sibling):
Fie T un arbore Huffman cu n frunze. Atunci nodurile lui T pot fi aranjate într-o secvenţă ( x 0
, x 1 , ..., x 2 n−2) astfel încat:
Secvenţa ponderilor (weight¿), weight( x 1), ..., weight( x 2 n−2)) să fie în ordine descrescătoare
Pentru orice i (0 ≤ i ≤ n-1), nodurile consecutive x 2 i+1si x 2 i+2sunt siblings (fii ai aceluiaşi
părinte)
De fiecare dată când un simbol este citit din fişierul de intrare se efectuează urmatoarele
operaţii:
Daca simbolul curent citit este nou, atunci din nodul virtual vor pleca doi fii:
unul pentru simbolul citit şi unul pentru simbolul virtual.
Nodul care a fost folosit ca nod virtual devine nod intermediar.
In caz contrar, se incrementeaza frecventa de apariţie a acestuia, prin mărirea
ponderii nodului corespunzator simbolului citit.
14
la creşterea ponderii unui nod, frunză sau intermediar, trebuie modificate şi ponderile
ancestorilor săi
pentru a păstra ordinea descrescatoare a ponderilor se judecă astfel: fie nodul frunză n
ce are ponderea cu unu mai mare decât valoarea anterioră, deci el este cel care s-a
modificat la pasul curent
Pentru îndeplinirea primei condiţii a proprietătii sibling, nodul n este schimbat cu cel
mai apropiat nod m (m < n) din listă, astfel încat weight(m) < weight(n)
Apoi, aceeaşi operaţie este efectuată asupra părintelui lui n, până când se obţine nodul
rădăcină sau este îndeplinită prima condiţie.
3.3 Exemplu
15
16
Capitolul IV : COMPRESIA DE DATE FOLOSIND METODE DE DICŢIONAR
Este o metodă ce sta la baza multor programe de compresie: compress şi uncompress, din
UNIX , sau gzip şi gunzip, sau WinZip din Windows.
Algoritmul de compresie este de tipul lungime variabilă - lungime fixă, în opoziţie cu
codarea Huffman (lungime fixă – lungime variabilă). Deşi există mai multe versiuni ale
algoritmului se pot distinge doua categorii: teoretică si practică. Diferenţa dintre ele constă în
faptul că – în varianta teoretică – optimalitatea asimptotică se poate mai uşor demonstra.
Variantele practice pot fi mai uşor de implementat.
Aceste metode constau dintr-o serie de reguli de identificare a unor grupuri de simboluri
şi gruparea/depunerea lor într-un dicţionar care se asociaza sursei de informaţie. Dacă se
intalneşte un anumit grup de simboluri, se creaza un indicator (pointer) corespunzator locului
ocupat de respectivul grup în dicţionar. Cu cât se întâlneşte mai des un anumit grup de simboluri,
cu atât este mai mare raportul de compresie. Deci, aceste metode codează şiruri de simboluri de
lungime variabilă cu semne individuale, fiecare semn reprezentand un indicator (index) într-un
dicţionar. Evident, se obţine o compresie atunci când noile semne sunt de lungime mai mică.
Exemplu: Fie convenţia reprezentării unui cuvânt dintr-o carte prin două atribute:
Atunci, mesajul „Titlul acestui capitol este compresia datelor” poate fi înlocuit prin
Cuvantul „Titlul” este înlocuit prin 500/3, ceea ce reprezinta al treilea cuvânt din pagină 500.
Cuvantul „compresia” este al 6 cuvânt din pagina 10.
17
Mărimea mesajului comprimat depinde de mărimea dicţionarului, deci de numarul de
pagini şi de numărul de înregistrări pe pagină. Dacă aceste două mărimi se notează cu NP
(numărul de pagini) şi NR(numărul de înregistrari pe pagină) atunci numărul de biţi pentru
reprezentarea (codarea) unui cuvânt din dicţionar este:
[log2(NP)] + [log2(NR)],
unde parantezele drepte arată rotunjurea la cel mai apropiat întreg.
8⋅NS 8
RC ( biti )= =
{[ log ( NP )]+ [ log ( NR )] }⋅NS {[ log ( NP ) ] + [ log ( NR ) ] }
Exemplu numeric: dacă dicţionarul conţine 2200 pagini, sunt necesari log2(2200) = 11.03 -> 12
biţi pentru a coda numărul paginii. Dacă fiecare pagină conţine un număr de cuvinte de 256 sunt
necesari un număr de log2(256) = 8 biti pentru codarea fiecărui cuvânt. Ca urmare, un cuvânt
oarecare din dicţionar este codat pe 20 (=11+8) biti sau 2.5 -> 3 octeţi. Mesajul comprimat va
avea lungimea 20 biti * 6 cuvinte = 120 biţi sau 18 octeţi. În reprezentarea ASCII, cele 6 cuvinte
necesită un total de (6+7+7+4+9+7) = 40 * 8 = 320 biţi, deci 40 octeţi. Raportul de compresie
este:
18
de compresie nu este foarte bun, de multe ori chiar subunitar. De aceea, cei mai răspândiţi sunt
algoritmii de compresie bazaţi pe dicţionare adaptive.
Într-una dintre cele mai cunoscute versiuni codorul împarte şirul simbolurilor
generate de sursă în subşiruri de lungime variabilă, dar fără să depăşească o lungime maximă
impusă. Subşirurile sunt memorate în dicţionarul codorului, în ordinea în care au fost create,
fiecărui subşir corespunzându-i un pointer. Un nou subşir (intrare în dicţionar) se creează
căutând în dicţionar cel mai lung subşir care este identic cu începutul datelor care aşteaptă să
fie codate (subşir rădăcină) şi apoi adăugând la acest subşir următorul simbol de date, numit
simbol de inovare. Decodorul alcătuieşte un dicţionar identic, pe baza pointerului primit, care
corespunde unui subşir, deja existent în dicţionar şi a simbolului de inovare. Fiecare nou
subşir este astfel transmis prin pointerul corespunzător subşirului rădăcină şi simbolul de
inovare. Dicţionarul se iniţializează cu subşirurile formate dintr-un singur simbol. În
principiu dicţionarul tinde să devină din ce în ce mai mare şi, în mod corespunzător, şi
19
pointerul tinde să devină mai lung. Este necesară o procedură, folosită atât de codor cât şi de
decodor, pentru a elimina din dicţionar şirurile rar folosite.
Algoritmul LZ77 este foarte simplu. La început avem un şir T care conţine n
simboluri iniţializate cu primul simbol din alfabetul sursei de informaţie. Se păstrează
primele LS simboluri generate de sursa de informaţie pe ultimele poziţii ale şirului şi se
transmit către receptor. La pasul următor avem un şir w de lungime 0. Atâta timp cât şirul w
se regăseşte în şirul T, acesta este concatenat cu următorul simbol generat de sursa de
informaţie. Notăm cu w i şirul format din primele i simboluri ale lui w. Fie i lungimea lui w
când acesta nu se mai regăseşte în şirul T. Aceasta înseamnă că şirul w i−1 este cel mai lung
şir generat de de sursa de informaţie care se află în T începând cu poziţia p. Către receptor se
trimite p , numărul i-1 şi simbolul de pe ultima poziţie a şirului w. Şirul T se deplasează la
stânga cu i poziţii, iar ultimele i poziţii se completează cu simbolurile şirului w. Acest pas se
repetă până sursa nu mai generează simboluri. Figura următoare ilustrează modul în care se
realizează compresia unui şir de simboluri.
20
Algoritmul de decompresie constă în interpretarea şirului de simboluri. Se citesc Ls
simboluri care se stochează pe ultimele poziţii ale şirului T de lungime n. Apoi se recepţionează
la fiecare pas câte un triplet (p, i, c), se extrag i simboluri din T începând cu poziţia p, apoi se
extrage simbolul c. Se deplasează T la stânga cu i+1 poziţii şi se completează şirul cu cele i+1
simboluri recepţionate. Algoritmul de compresie LZSS aduce următoarea îmbunătăţire: dacă
avem de codificat un singur simbol se transmite bitul 0 urmat de simbol, iar dacă avem de
transmis un şir mai lung se transmite bitul 1 urmat de perechea (p, i). Şirul T este denumit
fereastră mobilă, iar dicţionarul este constituit chiar de fereastra mobilă. Din acest motiv,
algoritmul LZ77 nu este optim.
Un an mai târziu Lempel şi Ziv au renunţat la fereastra mobilă, iar dicţionarul este constituit
de şirurile de simboluri recepţionate anterior. Acest cod se va numi LZ78.
001101100011010101001001001101000001010010110010110
Primul pas constă în împărţirea şirului de date în subşiruri, astfel încat la fiecare definiţie a unui
subşir să nu existe repetiţii, deci el să nu fi fost definit anterior. Se va utiliza virgula ca separator
de sub-şiruri. La începutul şirului se pune o virgulă pentru a evidenţia şirul de lungime zero. Se
pune apoi o virgulă după primul zero, întrucât nu a mai apărut. Al doilea bit este zero şi se
consideră şi al doilea simbol, 1, obţinandu-se şirul 01. Întrucat acesta este şir nou se pune
virgulă. Urmează simbolul 1, care fiind caracter nou, atrage virgula după el. Apoi apare un zero,
mai trebuie un zero (deci înca un simbol), ca să fie un şir nou. Rezultatul constă în urmatoarea
listă de şiruri:
21
,0,01,1,011,00,0110,10,101,001,0010,
01101,000,00101,001011,0010110
Pasul doi constă în derminarea numărului de biţi pentru reprezentarea secvenţei astfel obţinute.
Practic, se numerotează şirurile începând cu primul şir de lungime nenulă. Se determină numarul
de biţi dupa relaţia:
k = [ log 2 N ]
unde N reprezintă numărul de şiruri şi paranteza are rolul de rontunjire la cel mai mic întreg.
Pentru primul exemplu considerat se constată că sunt 16 simboluri (inclusiv şirul de lungime
zero) şi sunt necesari 4 biţi pentru reprezentarea fiecărui şir.
22
5. 00 0101 0 1 = 0001 00010
6. 0110 0110 011 4 = 0100 01000
7. 10 0111 1 3 = 0011 00110
8. 101 1000 10 7 = 0111 01111
9. 001 1001 00 5 = 0101 01011
10. 0010 1010 001 9 = 1001 10010
11. 01101 1011 0110 6 = 0110 01101
12. 000 1100 00 5 = 0101 01010
13. 00101 1101 0010 10 = 1010 10101
14. 001011 1110 00101 13 = 1101 11011
15. 0010110 1111 001011 14 = 1110 11100
Secvenţa comprimată este formată prin concatenarea tuturor şirurilor codate, aflate în ultima
coloană a tabelului de mai sus. Se obţine:
00000-00011-00001-00101-00010-01000-00110-01111
01011-10010-01001-01010-10101-11011-11100
23
4.4. Algoritmul Lempel-Ziv (LZ78)
Iniţial lista de elemente T are lungime 1 şi conţine şirul nul pe poziţia 0. La fiecare pas se
consideră lista simbolurilor de la pasul anterior şi se citeşte cel mai scurt şir w care nu este în
lista elementelor din T. În listă se adaugă şirul w şi se transmite o pereche formată din
numărul de ordine al primei apariţii a şirului format din w fără ultimul caracter şi caracterul
eliminat. Figura următoare prezintă un exemplu de compresie LZ78.
Proprietăţi:
Nu există un buffer de căutare – dicţionarul este explicit
Codificatorul/decodificatorul construiesc dicţionarul într-un mod
sincronizat
24
Codificare: <i, c>
i = indexul din dicţionar
c = codul următorului simbol
4.4.1. Exemplu LZ78
25
26
27
Observaţie
Soluţii practice
Micşorarea dicţionarului
Resetarea dicţionarului
28
4.5. Algoritmul Lempel-Ziv-Welch
Comprimarea
Algoritmul de comprimare LZW în forma lui cea mai simplǎ este descris imediat mai jos.
O examinare fie si sumarǎ aratǎ cǎ algoritmul LZW încearcǎ totdeauna sǎ genereze coduri pentru
siruri deja cunoscute. Si de fiecare datǎ când este generat un cod nou, un sir nou se adaugǎ în
tabelul de siruri.
Routine LZW_COMPRESS
STRING = STRING+CHARACTER
ELSE
29
STRING = CHARACTER
END of IF
END of WHILE
Pentru demonstraţie, este dat ceva mai jos un şir special ales. Şirul de intrare, cel
care trebuie comprimat este o scurtǎ secventǎ de cuvinte din limba englezǎ separate de
caracterul /. Dupǎ partea de început a acestui algoritm, prima trecere prin bucla WHILE
face o verificare dacǎ sirul /W este (deja) în tabelul de siruri. Deoarece sirul nu se
regǎseste acolo, se genereazǎ codul pentru /, iar sirul /W se adaugǎ în tabel. Deoarece 256
de caractere sunt deja asociate unor coduri (numerele de la 0 la 255), primul sir observat
este asociat cu numǎrul/codul urmǎtor, 256. Dupǎ ce se citeste a treia literǎ, E, se adaugǎ
în tabel al doilea sir, WE si se genereazǎ codul pentru W. Aceastǎ procedurǎ continuǎ
pânǎ când în cuvântul al doilea din text sunt citite succesiv (din nou) caracterele / si W,
care se potrivesc concatenate codului 256. În acest caz, se genereazǎ codul 256 si se
depune în tabelul de siruri un sir mai lung, de trei caractere. La fel se procedeazǎ si în
continuare, pânǎ când se epuizeazǎ tot sirul/textul de la intrare si toate codurile au fost
generate.
30
Tabelul de mai sus este o ilustrare a iesirilor (codurilor generate) pentru sirul arǎtat în
antet, /WED/WE/WEE/WEB/WET, si a tabelului de siruri-coduri. Dupǎ cum se poate vedea,
tabelul de şiruri se completeazǎ destul de rapid deoarece de fiecare datǎ când se adaugǎ un şir
nou, se şi genereazǎ un cod nou. Pentru şirul de intrare atât de redundant, s-au generat 5 coduri
noi alǎturi de 7 coduri de caractere simple. Dacǎ se folosesc coduri pe 9 biţi pentru ieşiri, intrarea
de 19 caractere se va reduce la cca. 13,5 octeti la ieşire. Desigur, acest exemplu este ales astfel
încât sǎ serveascǎ demonstrǎrii eficientei obtinute prin substitutia codatǎ. În cazurile reale,
efectul compresiei nu este sesizat efectiv înainte de a se fi fost constituit un tabel de echivalente
de dimensiune apreciabilǎ, de regulǎ dupǎ lectura a mai bine de o sutǎ de octeti.
Decomprimarea
Algoritmul pereche, cel de decomprimare are rolul de a prelua secvenţa de coduri rezultatǎ la
comprimare şi de a utiliza acele coduri pentru reconstituirea şirului codificat prin operaţia de
comprimare. Un motiv în plus pentru a aprecia eficienţa algoritmului LZW rezidǎ în faptul cǎ la
decomprimare nu este necesarǎ cunoasterea/transmiterea prealabilǎ a tabelului de echivalente
şiruri-coduri. Tabelul acesta poate fi (re)construit exact aşa cum a fost construit la comprimare,
utilizând numai intrǎrile (codurile) primite. Aceastǎ tratare este posibilǎ deoarece algoritmul de
comprimare genereazǎ componentele şir şi caracter din tabel totdeauna înainte de a le utiliza în
secvenţa de ieşire. Aceasta înseamnǎ cǎ datele comprimate nu sunt supraîncǎrcate cu tabele de
translatie de mari dimensiuni.
31
Routine LZW_DECOMPRESS
Read OLD_CODE
output OLD_CODE
Read NEW_CODE
output STRING
OLD_CODE = NEW_CODE
END of WHILE
Algoritmul de decompresie arǎtat mai sus este utilizat exemplificator imediat, pe secventa
de coduri generatǎ mai devreme. Ca si algoritmul de comprimare, si acesta adaugǎ un sir nou la
tabelul de siruri de fiecare datǎ când prelucreazǎ un cod nou. Tot ceea ce trebuie sǎ facǎ în plus
este sǎ traducǎ fiecare cod de intrare într-un sir si sǎ-l prezinte ca iesire. Tabelul urmǎtor aratǎ
ieşirile algoritmului la prelucrarea secvenţei de coduri data ca exemplu mai sus. De notat un fapt
important: tabelul de şiruri-coduri se completeazǎ exact ca în etapa de comprimare. Sirul de la
iesire este identic cu cel care a servit ca intrare a algoritmului de comprimare. Ca şi la
comprimare, primele 256 de coduri sunt asociate caracterelor simple.
32
Rezultate
33
4.5.1 Exemplu codare LZW
34
35
36
37
CONCLUZIE
Oricît de mult se dezvoltă suporţii de stocare a informaţiei, capacitatea lor va fi
întotdeauna un neajuns pentru implementarea aplicaţiilor informatice.
Trecerea de la banda perforată la banda magnetică a condus la apariţia restricţiilor de
utilizare a fişierelor independente. Trecerea de la banda magnetică la dischetă a adus unele
restricţii pentru bazele de date.
Dezvoltarea discurilor magnetice generează restricţii în domeniul bazelor de date
multimedia, şirul de restricţii continuînd asupra dimensiunilor şi complexităţii volumelor de date
care se manipulează simultan. O soluţie cu caracter de ameliorare o reprezintă compresia /
decompresia de date, însoţită de un consum de timp, influenţată puternic de performanţele
microprocesoarelor şi ratele de transfer.
Deşi există conturate tipologii de algoritmi, problema dezvoltării de noi clase rămîne
deschisă. De asemenea, elaborarea de software destinat compresiei creşte rata de compresie.
38
BIBLIOGRAFIE
1. Terry Welch, "A Technique for High-Performance Data Compression", Computer, June
1984
2. J. Ziv and A. Lempel, "A Universal Algorithm for Sequential Data Compression", IEEE
Transactions on Information Theory, May 1977
3. Rudy Rucker, "Mind Tools", Houghton Mifflin Company, 1987
4. http://ac.upg-ploiesti.ro/gpanaitescu/compresialzw.pdf
5. http://andrei.clubcisco.ro/cursuri/f/f-sym/5master/aac-tdmrc/18_Algoritmul%20Lempel-Ziv-
Welch.pdf
6. http://dumalex.ecosys.pub.ro/
7. http://www.comm.pub.ro/_curs/cic/curs/CIC_Capitolul%208%20Compresia%20datelor.pdf
8. Guy E. Blelloch, „Introduction to Data Compression”
9. „The Data Compression Book 2nd Ed” - Mark Nelson
39