Sunteți pe pagina 1din 15

1

Algoritmi de compresie utilizati in compresia datelor


1. Breviar teoretic Metodele de compresie entropic se bazeaza pe reducerea redundanei naturale a mesajului iniial. Metodele de compresie entropic se pot clasifica n dou categorii : a) metode bazate pe frecvena de apariie a unei forme (simboluri sau grupe (subiruri) de simboluri) b) metode bazate pe apariia grupat (consecutiv sau diseminat) a aceleiai forme Dup un alt criteriu, cel al construciei arborilor de codare-decodare, metodele de compresie entropic pot fi clasificate n: (i) metode statice (corespondena ntre mulimea mesajelor i mulimea cuvintelor de cod nu se modific n timp) (ii) metode dinamice (corespondena ntre mulimea mesajelor i mulimea cuvintelor de cod se modific n timp) Nu se poate face ns o delimitare clar ntre cele doua grupe de metode, chiar dac n categoria ( a) predomin metodele dinamice, iar in categoria ( b) cele statice.

1.1 COMPRESIA HUFFMAN


Algoritmul utilizat in crearea arborelui Huffman:

1. 2.

asigneaza acestui nod valoarea v( n x ) = p( x ) 3. ataseaza aceste noduri unei multimi T reprezentand o colectie de arbori. 4. repeta urmatorii pasi pana cand in multimea T ramane un singur arbore: i. Verifica valorile v( ni ) ale nodului radacita pentru ficare arbore. Gaseste cei doi arbori ( n a si n b ) cu cele mai mici valori v( n i ) . ii. Extrage din T cei doi arbori.

pentru fiecare

x din multimea A creeaza un nod

nx

iii.

Creeaza un nou nod n c si ataseaza nodurile n a si n b la stanga si la dreapta acestuia. Se va crea astfel un nou arbore. iv. Asigneaza noului arbore valoarea v( n c ) = v( n a ) + v( nb ) v. Insereaza noua valoare in arborele T .

n arborele obinut prin parcurgerea pailor anteriori se asigneaz simbolurile binare 0 i 1 pentru fiecare pereche de ramuri care pleac dintr-un nod intermediar. Cuvntul de cod pentru fiecare simbol poate fi citit ca secvena binar determinat prin parcurgerea nodurilor dinspre rdcin pn la nodurile terminale asociate simbolurilor. Figura 1.1 ilustreaza algorimul utilizat pentru crearea arborelui Huffman. Cele patru nivele contin colectia de arbori din multimea T dupa parcurgerea fiecarui pas al algoritmului.
A .125 A .125 .250 A .125 B .125 A .125 C .250 A .125 D .5 5 A .125 D .5 5 A .125

A .125 A .125

B .125 A .125

C .250 A .125

.5 5 A C .250 .125 .250 A A .125 B .125 .125 A .125 1.0 D .5 .5 5 50 A C A .250 .125 .250 .125 A .125 B .125

D .5 5 A .125

Fig. 1.1 Algoritmul pe baza caruia se creeaza arborele Huffman.

Codul pentru A este 111, B este 110, C este 10, si D este 0.

Cel mai simplu mod de a coda date utilizand aceasta metoda este de a crea un tabel cu doua valori pentru fiecare caracter (o valoare reprezentand lungimea codului in biti si cea de a doua reprezentand codul stocat in exemplul de mai jos pe 8 biti in practica se recomanda 32 biti). Litera A B C D Lungime cod 3 3 2 1 cod 11100000 11000000 10000000 00000000

Pentru decodare pornind de la radacina se urmaresc ramurile fiecarui nod conform bitilor secventei pana se atinge un nod terminal. Apoi se reporneste procedura de la radacina. Codul pentru compresia fisierelor va utiliza operatia logica OR pentru inserarea codului si operatiile Shift stanga - Shift dreapta pentru aliniere. Exemplu de pseudocode:
integer outputWord=0; integer bitsUsedInOutput=0; integer maxBitsInWord=32; integer[] integer[] codeWords; codeLengths;

integer temp; char codeMe; while more characters are uncoded do begin codeMe=get next character; temp=codeWords[codeMe]; if maxBitsInWord); then begin temp=rightshift(temp, bitsUsedInOutput); outputWord=OR(outputWord, temp); store outputWord in file; outputWord=leftshift(codeWords[codeMe], maxBitsInWord - bitsUsedInOutput); bitsUsedInOutput =maxBitsInWord bitsUsedInOutput; -codeLength[codeMe] + (bitsUsedInOutput + codeLengths[codeMe] >

end else begin temp=rightshift(temp, bitsUsedInOutput); outputWord=OR(outputWord, temp); bitsUsedInOutput=bitsUsedInOutput codeLength[codeMe]; end; end; +

1.2 COMPRESIA SHANNON-FANO


Algoritmul utilizat in crearea arborelui Shannon-Fano: 1. Pentru fiecare caracter x creeaza un nod n x

2.

Pentru fiecare nod, ataseaza un string nul c( n x ) in care se va scrie codul final pentru fiecare caracter.

3. Considera N o multime care contine toate nodurile 4. Aplica recursiv multimii N urmatorii pasi:

i.

Imparte N in doua submultimi N 1 si N 2 , astfel incat suma probabilitatilor caracterelor din multimea N 1 ( W ( N 1 ) ) sa fie aproximativ egala cu cea aferenta multimii N 2 ( W ( N 2 ) )

ii.

Adauga un 0 la sfarsitul lui c( n x ) pentru toate n x din N 1 . Adauga cate un 1 la sfarsitul lui c( n x ) pentru toate n x din N 2 Aplica recursiv aceasta functie lui N 1 si N 2 separat.

iii.
Exemplu de pseudocode:
make_codes( N ); if else
N =1 then N[0];

sort N by probabilities; split N into

N 1 and N 2 such that W ( N 1 ) approx. W ( N 2 ) ;

return node (make_code( N 1 ), make _code( N 2 ))

Exemplul #1 Se considera o sursa cu opt mesaje: s1, s2, s3, s4, s5, s6, s7, s8; cu probabilitatile: Mesaj s1 s2 s3 s4 s5 s6 s7 s8 pi 0,4 0,18 0,10 0,10 0,07 0,06 0,05 0,04 a) Sa se realizeze compresia utilizand metodele Huffman / Shannon-Fano:

b)

Sa se calculeze entropia H ( x ) = p i log 2


i =1

eficienta codului =

H ( x) , redundanta = n H ( x ) n

N 1 , lungimea medie n = p i n i , pi i =1

Solutie:
Mesaj pi Log(1/pI) Shannon-Fano si* Huffman

s1 s2 s3 s4 s5 s6 s7 s8

0,4 0,18 0,10 0,10 0,07 0,06 0,05 0,04

1,32 2,47 3,32 3,32 3,83 4,06 4,32 4,64 2,64

00 01 100 101 1100 1101 1110 1111 2,61 97%

1 001 011 0000 0100 0101 00010 00011 97,8%

Metoda Shannon-Fano:

Metoda Huffman:

1.3 COMPRESIA LEMPEL-ZIV


Compresia pe baza de dictionar presupune constructia unui model statistic in care se asociaza probabilitati de aparitie grupurilor de simboluri (fraze) care se pot repeta pe fluxul de date de intrare. Frazele sunt memorate intr-un dictionar, prin citirea lor cu ajutorul unei ferestre culisante de-a lungul setului de date. Dictionarul contine cate un pointer care indica pozitia frazei in cadrul acestuia. Pointerul de pozitie constituie o abreviere a frazei pe fluxul de iesire. Ori de cate ori o fraza a dictionarului este recunoscuta pe fluxul de intrare, pe fluxul de iesire se emite un cod constand dintr-un acronim ce indica pozitia frazei in dictionar. Pentru gasirea pointerilor, in faza de compresie sunt necesare urmatoarele operatii: Baleierea fluxului de intrare la nivel de grup de simboluri prin utilizarea unei ferestre (de dimensiune fixa sau variabila) care sa culiseze de-a lungul setului de date Identificarea frazei din fereastra culisanta folosind dictionarul. Daca fraza este gasita, este inlocuita cu un pointer de pozitie corespunzator care este emis apoi pe fluxul de iesire. Daca dictionarul nu contine fraza respectiva, ea este emisa pe fluxul de iesire iar dictionarul este extins cu noua fraza emisa.

In faza de decompresie succesiunea operatiilor este urmatoarea: baleierea fluxului de intrare la nivel de pointeri frazele din dictionar indicate de pointeri sunt extrase si inscrise pe fluxul de iesire

Dintre algoritmii de compresie bazati pe utilizarea dictionarelor statistice, in cadrul acestui paragraf se va descrie algoritmul LZW Lempel-Ziv-Welch. Algoritmul de compresie se poate sintetiza in urmatorul pseudocode:
word=; while not end of file; x=read next character; if word + x is in the dictionary // + concatenare word=word + x; else send the dictionary number for word add word + x to the dictionary word=x end of while loop

Algoritmul de decompresie are urmatorul pseudocode:


read a character x from compressed file; write x to uncompressed version; word=x; while not end of compressed file do begin read x look up dictionary element corresponding to x; output element add w + first char of element to the dictionary w=dictionary element endwhile

Pentru a elimina prezenta simbolurilor din cadrul codurilor emise, se propune preancarcarea dictionarului cu 256 simboluri (din pozitia 0 pana in pozitia 255). Simbolurile sunt asezate in ordine lexicografica. Codul original al fiecarui simbol coincide chiar cu indexul pozitiei sale in dictionar. Deoarece dimensiunea dictionarului este superioara valorii 256, numarul de biti asociati unui cod este de cel putin 9. In cazul dictionarului liniar, emisia unui cod se efectueaza cu cel putin un pas intarziere fata de momentul citirii datelor de pe fluxul de intrare. Dimensiuinea frazei creste cu fiecare simbol citit, in cazul in care a fost depistata o coincidenta. Procesul de crestere a dimensiunii frazei necriptate inceteaza odata cu primul simbol adaugat care produce imposibilitatea identificarii noii fraze in dictionar. In acest moment se cripteaza fraza curenta, mai putin ultimul ei simbol. Fluxul de iesire este ocupat numai de coduri de tip index . Exemplul #2 . Fie sirul de caractere: BABY AT BAT. Sa se aplice algoritmul Lempel-Ziv-Welch pe acest sir de caractere. Solutie:
Simbol curent citit (x) Cod emis Fraza adaugata dictionarului /index valoare

B A B Y space A T space B A T -

B A B Y space A T space 257 T

257=BA 258=AB 259=BY 260=Y 261= A 262=AT 263=T 264= B 265=BAT -

B A B Y space A T space B BA T -

Compresia se realizeaza prin inlocuirea grupului BA prin codul 257. Intrarile in dictionar se pot stoca intr-un arbore indexat alfabetic:

B A 257 T 265 Y 259 A .125 B 258

A T 262 A 261

sp B 264 A .125 Y sp 260

T sp 263

Exemplul #3 Fie sirul de caractere: BOB BOOTS BOOMBOX BOATS. Sa se aplice algoritmul Lempel-Ziv-Welch . Solutie:
Simbol curent citit (x) Cod emis Fraza adaugata dictionarului /index valoare

B O B space B O O T S space B O O M B O X space B O A T S -

B O B space 257 O T S 260 O O M 257 X 265 A T S

none 257=BO 258=OB 259=B 260= B 261=BOO 262=OT 263=TS 264=S 265= BO 266=OO 267=OM 268=MB 269=BOX 270=X 271= BOA 272=AT 273=TS -

B O B space B BO O T S space B O O M B BO X space B BO A T S -

Observatie: Daca se utilizeaza n=9 biti pentru fiecare cod In cazul exemplului #2 - 184 biti (23 litere) sunt comprimati in 162 biti . Procedura de decompresie aferenta primului exemplu este prezentata in urmatorul tabel:
Cod curent citit valoare Fraza adaugata dictionarului /index Simbol emis

B A B Y space A T space 257 T

B A B Y space A T space BA T

none 257=BA 258=AB 259=BY 260=Y 261= A 262=AT 263=T 264= B 265=BAT

B A B Y space A T space B A T

1.4 COMPRESIA ARITMETICA

In cazul codarii aritmetice, se asociaza un singur numar fractionar pentru un intreg bloc de simboluri.

Algoritmul de compresie:

se construieste alfabetul asociat setului de date si o tabela a frecventelor asociate fiecarui simbol notata cu: p ( s ) se construieste o partitie disjuncta a intervalului [0,1) folosind sirul frecventelor de aparitie. Fiecarui simbol i se aloca cate un interval al partitiei, de lungime proportionala cu frecventa sa de aparitie, pozitionat in functie de locul ocupat de simbol in alfabet. Se noteaza cu L( s ) = [m( s ), M ( s ) ) intervalul asociat simbolului s . Lungimea sa este egala cu p ( s ) , adica p ( s ) = M ( s ) m( s )

se imparte setul de date in blocuri de lungime fixa, k pentru fiecare bloc de simboluri se construieste cate un numar fractionar folosind urmatoarea procedura: Constructia incepe cu determinarea limitelor superioara si inferioara intre care va fi incadrat numarul fractionar, in functie de primul simbol al blocului. Pe masura ce se citesc noi simboluri, limitele se apropie din ce in ce mai mult, ajungand in final sa coincida pe un anumit numar de zecimale. Ajustarea limitelor se realizeaza astfel: Fie { a k } multimea limitelor inferioare si superioare.

{ Ak }

multimea limitelor

a k = a k 1 + ( Ak 1 a k 1 ) m( s k ) Ak = a k 1 + ( Ak 1 a k 1 ) M ( s k )

Algoritmul de decompresie:

se construieste alfabetul asociat setului de date si o tabela a frecventelor asociate fiecarui simbol notata cu: p ( s ) .Se construieste o partitie disjuncta a intervalului [0,1) folosind sirul frecventelor de aparitie. Pentru fiecare bloc k de simboluri ce urmeaza a fi decriptat, se citeste codul fractionar corespondent r1 . Celelalte numere ale multimii se evalueaza pe masura ce sunt decriptate simbolurile s k :

rk =

rk 1 m( s k 1 ) , unde simbolul s k este unicul pentru care: p ( k 1)

m( s k ) rk < M ( s k )
Algoritmul se opreste dupa decriptarea tuturor simbolurilor.

Exemplul #4 Fie caracterele{A, B, C, D} carora le corespund probabilitatile {1/2, 1,4, 1/8, 1/8}. Sa se comprime prin codaj aritmetic. Solutie: Arborele Huffman de codare este urmatorul:

. 0 1 . . C 0 1 1 0 1 1 B 1 A

C 1/8

D 1/8

B 1/4

A 1/2

Rezultatul compresiei sirului ABCDC este prezentat in urmatorul tabel (codul Huffman este adaugat pentru comparatie). Simbol A B C D C Sau: Simbol A B C Cod Huffman 1 01 000 Limita inferioara .1 2 .101 2 .101000 2 Limita superioara 1.0 2 .11 2 .101001 2 Cod Huffman 1 01 000 001 000
1/2 1/2 + 1/2x1/4 1/2 + 1/2x1/4 1/2 + 1/2x1/4 1/2x1/4x1/8x1/8 1/2 + 1/2x1/4 1/2x1/4x1/8x1/8 + +

Limita inferioara
1

Limita superioara
1/2 +1/2x1/4 + !/4x1/2 1/2 + 1/2x1/4 + 1/2x1/4x1/8 1/2 + 1/2x1/4 + 1/2x1/4x1/8x1/4 1/2 + 1/2x1/4 + 1/2x1/4x1/8x1/8+1/2x1/4x1/8x1/8x1/ 8

D C

001 000

.101000001 2 .101000001000 2

.10100001 2 .101000001001 2

Exemplul #5 : Fie literele {A, B, C, D} cu probabilitatile de aparitie {.7, .12, .1, . 08}.}. Sa se comprime prin codaj aritmetic. Solutie: Arborele Huffman de codare este urmatorul:

. 0 1 . . C 0 1 1 0 1 1 B 1 A

C .08

D .1

B .12

A .7

Rezultatul compresiei sirului AAAB este prezentat in urmatorul tabel (codul Huffman este adaugat pentru comparatie). Simbol A A A B Cod Huffman 1 1 1 01 Limita inferioara .3 .3+.3x.7 .3+.3x.7+.3x.7x.7 . 3+.3x.7+.3x.7x.7+.18x.7x.7x.7 =.71874 Limita superioara 1 1 1 . 3+.3x.7+.3x.7x.7+.3x.7x.7x.7=.7599

Arobrele Huffman va comprima sirul de caractere prin 11101. Codarea aritmetica reduce sirul de caractere in limitele: .71874=.10110111111111111 2 si .

7599=.1100001010001 2 . Cea mai scurta fractie binara in acest interval este .11 2 de unde rezulta ca prin compresia aritmetica se poate reduce un string de 4 caractere la 2 biti. Exemplul#6: Prin aceeasi metoda sa se comprime sirul ABCDC. Solutie: Simbol Cod Huffma n 1 01 000 001 Limita inferioara Limita superioara

A B C D

.3 .3+.18x.7=.426 . 3+.18x.7+.7x.12x.08=.43272 . 3+.18x.7+.7x.12x.08=.43272 . 3+.18x.7+.7x.12x.08+.7x.12 x.10x.08x.08=.43277376

1 .3+.3x.7 .3+.18x.7+.7x.12x.18=.44112 . 3+.18x.7+.7x.12x.08+.7x.12x.1x.0 8=.433392 . 3+.18x.7+.7x.12x.08+.7x.12x.10x. 08x.18=.43284096

000

Limitele finale sunt: .43277376=.011011101100101001000010111 2 .43284096=.01101110110011101010101001 2 O valoare in intervalul considerat (cea mai scurta val. binara) este: .01101110110011 2 care necesita 14 biti cu doi biti mai mult decat compresia Huffman. 2. Chestiuni de studiat/Mod de lucru a.Aplicarea programului de tip H, S.F, Ca. LZ pe urmatoarele tipuri de fisiere text: text limba romana, text limba engleza, texte cu figuri, formulare economice(siruri de numere), compresie antet . fisiere sursa (C, Vb...) b. Calculul ratei de compresie pentru fiecare caz in parte c. Concluzii privind recomandarea unui anume program de compresie Pe modelul a. Comparatie intre diferite tipuri de programe de arhivare standard: zip rar ace

3.Tema de casa: 1. Implementati unul dintre algoritmii Huffman/Shannon-Fano.

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