Sunteți pe pagina 1din 39

Universitatea Tehnică „Gh.

Asachi” Iași

Facultatea de Electronică, Telecomunicații și Tehnologia Informației

Specializarea: Tehnologii și Sisteme de Telecomunicații

LUCRARE DE DIPLOMĂ

Îndrumător: Absolvent:

Prof. dr.ing. Tărniceriu Daniela Airinei Bogdan-Iulian

2019

1
Universitatea Tehnică „Gheorghe Asachi” Iași

Facultatea de Electronică, Telecomunicații și Tehnologia Informației

Specializarea: Tehnologii și Sisteme de Telecomunicații

COMPRESIA DATELOR
Tehnici de dicţionar folosite în compresia fără pierderi a datelor

Îndrumător: Absolvent:

Prof. dr.ing. Tărniceriu Daniela Airinei Bogdan-Iulian

2
q

CUPRINS

INTRODUCERE……………………………………………………………………..…...……4

CAPITOLUL I: GENERALITĂŢI............................................................................................5

CAPITOLUL II: CLASIFICĂRI...............................................................................................7

2.1 METODE STATICE............................................................................................7


2.2 METODE SEMISTATICE...............................................................................7
2.3 METODE DINAMICE.....................................................................................8
2.4 METODE DE COMPRESIE CU PIERDERE DE INFORMATIE..................8
2.5 METODE DE COMPRESIE FARA PIERDERE DE INFORMATIE.............9
2.5.1 MODELAREA STATISTICA A SURSELOR DISCRET..….....10
2.5.2 MODELAREA LINGVISTICA A SURSELOR DISCRETE......10

CAPITOLUL III:COMPRESIA DE DATE PRIN METODA HUFFMAN............................11

3.1 CODIFICARE HUFFMAN DINAMICA………..............................….........13


3.2 DECODIFICAREA HUFFMAN DINAMICA...........................................15
3.3 EXEMPLU..................................................................................................16

CAPITOLUL IV:COMPRESIA DE DATE PRIN TEHNICI DE DICŢIONAR.............,,,,....17

4.1 DICŢIONAR STATIC..................................................................................,,.....18


4.2 DICŢIONAR SEMISTATICE...................................................................,.....19
4.3 ALGORITMUL LEMPEL-ZIV (LZ77)...........................................................19
4.3.1 EXEMPLU APLICAŢIE LZ77…………..................................….....21
4.4 ALGORITMUL LEMPEL-ZIV (LZ78)...........................................................24
4.4.1 EXEMPLU APLICAŢIE LZ78…………..................................….....25
4.5 ALGORITMUL LEMPEL-ZIV-WELCH (LZW)............................................29
4.5.1EXEMPLU APLICAŢIE LZW…………..............................….34

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).

Aşadar, obiectul de studiu al compresiei de date îl constituie metodele şi tehnicile destinate


reducerii volumului unui set de date reprezentate sub formă binară, cu posibilitatea reconstituirii acestuia
fie exact, fie aproximativ, astfel distingându-se două tipuri de algoritmi de compresie: cu pierdere de
informaţie şi fără pierdere. Cei fără pierderi sunt reversibili, prin decompresie obţinându-se mesajul
original întocmai, iar ceilalţi au ca rezultat diferenţe relativ insesizabile, raportat mai ales la percepţia
umană (folosit în principal în domeniul visual şi audio).

Compresia datelor a evoluat, în conformitatea cu progresul societăţii şi al expansiunii


intensive şi extensive a informaţiei, de la algoritmi simpli( suprimarea zerourilor, codificarea pe şiruri)
până la cei complecşi, din prezent. Dezvoltarea diverselor metode de compresie a avut ca efect, pe lângă
reducerea spaţiului de depozitare a datelor şi mărirea ratei lor de transfer, a scăderii timpului de transfer

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.

Model general de compresie – decompresie

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

2.4 Metode de compresie cu pierdere de informaţie

Metodele de compresie cu pierderi de informaţie sunt necesare în cazul datelor multimedia:


semnale digitale audio, imagini digitale, date video. Aceste tipuri de date au nevoie de o compresie mare,
mai ales în cazul transmisiunilor în reţea, şi pierderea unei părţi din informaţie, dar care oferă în schimb
un transfer de date mai rapid, este preferată. Important este ca pierderea de informaţie să nu afecteze
decât într-o măsură acceptabilă mesajul iniţial. Criteriul care stabileşte marja este unul de natură
subiectivă, dar care are o bază teoretică solidă. El se referă la modul de percepţie uman al frecvenţelor
sonore şi video, de aceea algoritmii poartă calificativul de psihoauditivi, respectiv, psihovizuali. În urma

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.

2.5 Metode de compresie fără pierderi de informaţii

Metodele de compresie fără pierderi de informaţie au la bază ideea eliminării informaţiei redundante.
Această redundanţă se datorează:

• Distribuţiei caracterelor (frecvenţa de apariţie care diferă substanţial de la caracter la


caracter)

• Repetarea consecutivă a caracterelor

• Distribuţia grupurilor de caractere

• 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.

Pentru a verifica randamentul unei compresii, trebuie să ne folosim de câţiva termeni


utilizaţi în domeniul compresiei:

Cantitatea de informaţie furnizată de un eveniment A este egală cu

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ă

E = H(S) / Hmax(S) = H(S) / log 2 m.

Redundanţa unei surse reprezintă excesul de informaţie faţă de strictul necesar

Rs= Hmax(S) - H(S).

Factorul de compresie poate fi definit ca

Fc = Ni / Nc , unde Ni este lungimea în biţi a mesajului iniţial şi Nc lungimea


mesajului compresat.

2.5.1 Metode de compresie bazate pe modelarea statistică a surselor discrete

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).

2.5.2 Metode de compresie bazate pe modelarea lingvistică a surselor discrete

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ă.

Paşii algoritmului sunt următorii:

1. Ordonarea mesajelor sursei în ordinea descrescătoare a probabilităţilor

2. Formarea din ultimele două mesaje a unui mesaj restrans r 1 = S M−1U S M , cu


p(r1) = p( S M−1) + p( S M )

3. Includerea mesajului r 1 în mulţimea celorlalte mesaje, în ordinea descrescătoare


a probabilităţilor, alcătuind şirul ordonat R1.

4. Repetarea algoritmului de restrângere până când ultimul şir ordonat Rk conţine


doar două mesaje.

5. Cuvintele de cod corespunzătoare fiecărui mesaj se obţin în felul următor:

 Simbolului r k−1 i se alocă ‘0’ , iar lui r k ‘1’ .


 La fiecare diviziune în două se alocă, în aceeaşi ordine ca la prima
diviziune, simbolurile ‘0’ sau ‘1’ şi operaţia se continuă până când
se ajunge la mulţimi formate dintr-un singur mesaj.

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:

f = 119 123 168 119

123 119 168 168

119 119 107 119

107 107 119 119

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:

Codul generat de un algoritm Huffman are câteva proprietăţi care îi certifică


optimalitatea. El este un bloc de coduri pentru că fiecare simbol este generat ca o secvenţă fixă
de cod. Este instantaneu pentru că oricare cuvânt cheie poate fi decodat fără a face referire la alt
simbol, adică nici un codeword nu este prefix al altuia. Codul Huffman se decodează în mod
unic, prin parcurgerea secvenţei de caractere de la stânga la dreapta. Pentru imaginea f secvenţa
va fi 10101011010110110000011110011. Datorită proprietăţilor enumerate anterior, nu este
nevoie să se insereze delimitatori între pixelii codaţi. Scanarea de la stânga la dreapta a codului
creat ne arată că primul cod valid este 1, care corespunde lui a1=119, iar cel de-al doilea cod
valid este 010, ce corespunde lui a2=123. Parcurgerea până la capăt va genera în ordine valorile
aflate în matricea f. Generarea codului anterior nu este echivalentă cu o compresie a unei imagini
2-D, ba dimpotrivă, şi asta pentru că, la nivelul de reprezentare a datelor în calculator, am plecat
de la o matrice care conţine valori de tip integer şi am generat un vector de string-uri. Simple
calcule ne arată ca am aplicat o extensie sursei iniţiale, extensie care, în urma unor transformări
specifice, poate fi adusă la o formă de reprezentare adecvată. Astfel, codul va fi trecut într-o
formă şir de biţi, care, în funcţie de modul cum dorim să reprezentăm datele, va fi multiplu de 8
biţi, adică de un octet( minimul necesar pentru orice fel de dată). De aceea, codul nostru de 29 de
valori constituite din 0 şi 1 va deveni unul de 32 de biţi, ultimele trei valori, ce constituie
diferenţa, luând valoare 0. Şi pentru că reprezentarea numerelor de tip integer se face pe 2 octeţi
sau pe 4, cei 32 de biţi vor fi divizaţi în două subgrupe: 1010101101011011 0000011110011000
sau vor rămâne grupaţ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.

Varianta semi-staticăconstruieşte arborele binar după ce în prealabil a parcurs sursa


de date pentru a stabili frecvenţele de apariţie, urmând să mai facă o a doua parcurgere pentru
codificarea în sine. Este evident un inconvenient legat de stocarea iniţială şi de viteză, iar dacă
simbolurile au aproximativ aceeaşi frecvenţă de apariţie, algoritmul nu oferă o compresie prea
bună.

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ă.

3.1 Codificarea Huffman dinamică

Compresia dinamică (sau adaptivă) Huffman foloseşte un arbore de codare ce este


actualizat de fiecare dată cand un simbol este citit din fişierul de intrare.

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)

Compresia şi decompresia utilizează arborele dinamic Huffman pornind de la un caracter


virtual, notat – de exemplu – prin VIRT, sau NTI. Acesta este întotdeauna nod terminal
(frunză).

De fiecare dată când un simbol este citit din fişierul de intrare se efectuează urmatoarele
operaţii:

1. Se scrie în fişierul destinaţie codul simbolului:


 Dacă simbolul citit este nou, atunci se scrie codul caracterului virtual (NTI)
(determinat din arborele de codare) urmat de codificarea în binar (ASCII)
pe 9 biţi a simbolului respectiv .
 În caz contrar, se scrie cuvântul de cod al simbolului, determinat din
arborele de codare.
 Numai la primul simbol se scrie direct codul ASCII al acestuia pe 9 biţi.

2. Se introduce simbolul citit în arborele de codare:

 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.

3. Se ajustează arborele pentru îndeplinirea proprietăţii sibling. Trebuie


considerate urmatoarele doua aspecte:

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.2 Decodificarea Huffman dinamică

La decompresie, textul comprimat este verificat cu arborele de codare. Tehnica se


numeste „parsing”.

 La începutul decompresiei, nodul curent este iniţializat cu rădacina, ca la algoritmul de


compresie, şi – apoi – arborele evoluează simetric.
 La fiecare citire a unui simbol 0 se parcurge arborele în jos spre stânga; se parcurge
arborele spre dreapta daca simbolul citit este 1.
 Când se ajunge la un nod terminal (frunză), simbolul asociat este scris în fisierul de ieşire
şi se ajustează arborele, la fel ca în faza de compresie.

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:

(Numărul paginii) / (numărul cuvântului din pagina).

Atunci, mesajul „Titlul acestui capitol este compresia datelor” poate fi înlocuit prin

500/3 1/5 10/2 15/9 10/6 12/1

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.

Întrucât trebuie considerat şi mărimea mesajului de la intrare, exprimat prin numarul de


simboluri, NS, rezultă un raport de compresie:

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:

320 biti 40 octeti


RC (biti)= =2. 66 RC(octeti)= =2. 22
120 biti sau 18 octeti

4.1. Dicţionarul static

Un dicţionar static este construit şi transmis odată cu textul comprimat şi este


folosit ca referinţele citate într-o lucrare stiinţifică. Un dicţionar static este construit înaintea
efectuăriii compresiei şi ramâne neschimbat pe toată durata acesteia. Dicţionarul static are
avantajul că poate fi „ales” („acordat”) în vederea codării, înregistrările care apar cu cea mai
mare frecvenţă putând fi codate cu numărul cel mai mic de biţi, în conformitate cu regulile de
codare enrtropică. Dezavantajul folosirii unui dicţionar static apare la compresia fişierelor mici,
când, din cauza transmisiei/memorării atât a dicţionarului cât şi a fişierului comprimat, raportul

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.

4.2 Dicţionarul adaptiv

Un dictionar adaptiv constă în adăugarea unei abrevieri pe lângă anumite grupe de


simboluri, cand apar prima oară, şi utilizarea în continuare doar a abrevierilor.
Cel mai folosit algoritm de compresie bazat pe dicţionar este cel propus de Jacob Ziv şi
Abraham Lempel, în două variante: prima din 1977, cunoscută sub numele de LZ77, şi a doua,
din 1978, cunoscută sub numele de LZ78.

4.3. Algoritmul Lempel-Ziv (LZ77)

Metoda de compresie Lempel-Ziv a fost implementată pentru prima dată de către


Abraham Lempel şi Jacob Ziv în anul 1977, de unde şi denumirea LZ77. Ulterior au mai
apărut şi alte variante (LZ78, LZW, LZSS). Metoda de compresie LZ ţine cont de repetiţia
unor silabe, cuvinte în mesaj.

Î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.

4.3.1. Exemplu aplicaţie LZ

Următorul exemplu se refera la o versiune simpla a algoritmului Lempel-Ziv. Schema de


compresie trebuie sa imparta datele in sub-siruri, sa codeze sub-sirurile, si sa fie posibilă şi
operaţia inversă.
Fie urmatorul şir de date:

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.

Pasul trei constă în


codarea şirurilor, astfel obţinute. Se completează un tabel de forma de mai jos, în care se
definesc: şirul, numărul ce arată poziţia şirului, prefixul, numărul ce arată poziţia prefixului, şi
codul şirului. Codul şirului este obtinut considerând numărul ce arată poziţia prefixului urmat de
ultimul bit al şirului considerat, aşa cum se prezintă în tabelul de mai jos.

Nr. Codarea Codarea


Sirul Prefix Sir codat
sirului pozitiei sirului pozitiei prefixului
1. 0 0001 empty 0 = 0000 0000+0 = 00000
2. 01 0010 0 1 = 0001 0001+1 = 00011
3. 1 0011 empty 0 = 0000 0000+1 = 00001
4. 011 0100 01 2 = 0010 00101

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

Comparând lungimea secvenţei comprimate cu lungimea secvenţei originale se constată că


secvenţa comprimată are o lungime mai mare. Acest rezultat este explicat prin faptul că secvenţa
de intrare este de lungime foarte mică. Pentru fişiere cu secvenţa de lungime de milioane de
simboluri se constată cu raport de compresie de până la 2, depinzând şi de conţinutul fişierului.

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

Input: wabba wabba wabba wabba woo woo woo

25
26
27
Observaţie

Dacă o să codificam în continuare, dicţionarul continuă să crească

Soluţii practice

 Oprirea creşterii dicţionarului

 efectiv ,considerarea dicţionarului ca unul static

 Micşorarea dicţionarului

 Ex: pe baza statisticilor de utilizare

 Resetarea dicţionarului

 Fără a cunoaşte informaţii specifice referitoare la sursă, tehnicile de mai


sus nu garantează succesul

28
4.5. Algoritmul Lempel-Ziv-Welch

Compresia LZW constǎ în înlocuirea de siruri de caractere cu coduri unice. Nu se


efectueazǎ vreo analizǎ prealabilǎ a sursei care trebuie comprimatǎ ci se adaugǎ într-un tabel
fiecare sir de caractere nou apǎrut cu codul asociat. Comprimarea rezultǎ din substituirea sirului
cu un cod. Codul generat de algoritmul LZW poate fi de lungime arbitrarǎ, dar în mod necesar
trebuie sǎ se întindǎ pe mai multi biti decât un singur character. Primele 256 coduri (familiare
când se utilizeazǎ caractere pe opt biti) sunt prin default atribuite multimii standard de caractere.
O reprezentare pe 12 biti asociazǎ codurile 0 la 255 cu caracterele simple, codurile de la 256 la
4095 se referǎ la siruri mai scurte sau mai lungi.

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 = get input character

WHILE there are still input characters DO

CHARACTER = get input character

IF STRING+CHARACTER is in the string table then

STRING = STRING+CHARACTER

ELSE

output the code for STRING

add STRING+CHARACTER to the string table

29
STRING = CHARACTER

END of IF

END of WHILE

output the code for STRING

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

WHILE there are still input characters DO

Read NEW_CODE

STRING = get translation of NEW_CODE

output STRING

CHARACTER = first character in STRING

add OLD_CODE + CHARACTER to the translation table

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

Este oarecum dificil a caracteriza rezultatele oricǎrei metode de comprimare. Nivelul


comprimǎrii obţinut variazǎ oarecum în funcţie de mai mulţi factori. Compresia LZW exceleazǎ
când are de comprimat şiruri de date care au (sub)şiruri repetate de orice naturǎ. Din aceastǎ
cauzǎ algoritmul LZW se comportǎ extrem de bine la comprimarea textelor în limba englezǎ.
Nivele de comprimare de 50% sau chiar mai bune sunt frecvente. La fel, comprimarea de ecrane
stocate are rezultate în general foarte bune. Încercarea de a comprima fisiere de date binare este
usor riscantǎ. Functie de date, comprimarea poate da rezultate bune sau proaste. În unele cazuri
se comprimǎ chiar mai bine decât textele. O dozǎ de experienţǎ concretǎ dǎ mǎsura şansei ca
datele de interes sǎ se comprime bine sau nu.

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

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