Documente Academic
Documente Profesional
Documente Cultură
Laborator TD
1 Coduri de compresie
1.1 Introducere
Tehnicile de compresie sunt utile pentru fiierele text, n care anumite caractere apar cu o
frecven mai mare dect altele, pentru fiiere ce codific imagini sau sunt reprezentri digitale ale
sunetelor ori ale unor semnale analogice, ce pot conine numeroase motive care se repet. Chiar dac
astzi capacitatea dispozitivelor de memorare a crescut foarte mult, algoritmii de compresie a fiierelor
rmn foarte importani, datorit volumului tot mai mare de informaii ce trebuie stocate. n plus,
compresia este deosebit de util n comunicaii, transmiterea informaiilor fiind mult mai costisitoare
dect prelucrarea lor.
Una dintre cele mai rspndite tehnici de compresie a fiierelor text, care, n funcie de
caracteristicile fiierului ce urmeaz a fi comprimat, conduce la reducerea spaiului de memorie necesar
cu 20%-90%, a fost descoperit de D. Huffman n 1952 i poart numele de codificare (cod) Huffman. n
loc de a utiliza un cod n care fiecare caracter s fie reprezentat pe 7 sau pe 8 bii (lungime fix), se
utilizeaz un cod mai scurt pentru caracterele care sunt mai frecvente i coduri mai lungi pentru cele care
apar mai rar.
Definiii:
Compresia datelor metode i tehnici de reducere a volumului unui set de date reprezentate sub form
binar, cu posibilitatea reconstruirii lor fie exact, fie aproximativ.
Set de date ir finit de simboluri, cu reprezentare numeric (cod numeric original), n care numrul
simbolurilor ce-l compun (volumul setului de date) > numrul simbolurilor distincte ce construiesc setul
de date.
1 simbol = 8 bii (ASCII) setul de date se construiete din maxim 28 = 256 simboluri distincte.
Alfabet mulimea simbolurilor distincte dintr-un set de date
Lungimea setului de date numrul total de bii pe care este reprezentat setul de date
Volumul unui set de date numrul de simboluri care compun setul de date
Compresie
conservativ (metode de reconstrucie exact a setului de date din versiunea sa comprimat text,
programe surs)
neconservativ (metode de reconstrucie aproximative, inexacte, a setului de date original semnal
audio, imagine)
Rata de compresie parametru prin care se msoar performanele metodei de compresie utilizate
c
= 1 100% ;
o
= n min
n
Pas1: Parcurgerea setului de date (D) n mod secvenial, citind fiecare simbol n parte:
- se construiete alfabetul de ordin 0 (A0)
- se contorizeaz numrul de apariii ale fiecrui simbol s A0 contorul N(s) N.
N (s )
v(s ) = , s A 0 (estimarea probabilitatii de aparitie a lui s)
D
D = xA0 N (s ) ( volumul setului de date este constant )
Pas2: simbolurile din A0 se aranjeaz n ordine descresctoare a valorilor contoarelor, n caz de egalitate
se arajeaz lexicografic.
A0 = {K , s, t , K} cu N (s ) N (t )
Pas3: Alfabetul A0se divizeaz n dou pri disjuncte, numite subalfabete (A0L i A0R), dar se pstreaz
dou condiii de baz:
- se pstreaz ordinea simbolurilor
2
Laborator compresie
- ponderile subalfabetelor s fie ct mai apropiate
A0 = A 0 L A0 R ;
A0 L A0 R = 0; ;
( ) = N (s ) N ( A ) = N (s )
N A 0L 0R
s A0 L s A0 R
La construcia subalfabetelor se pleac simultan din cele dou capete ale alfabetului A0, mergnd spre
centru, comparnd mereu ponderile pariale ale subalfabetelor, pn la epuizarea simbolurilor alfabetului
A0.
Pas5: Se repet paii 3 i 4 pentru fiecare nod terminal al arborelui (subalfabet) care conine mai mult de
un simbol.
Stop: procesul de construcie a arborelui se oprete cnd toate subalfabetele nodurilor terminale (frunze)
conin doar un singur simbol.
Codul unui simbol se obine parcurgnd arborele de la rdcin pn la nodul ocupat de acel simbol,
concatennd valorile arcelor prin care se trece.
Observaie:
Pentru n simbol frecvent n setul de date codul corespondent este scurt, pentru c nodul lui va fi n
apropierea rdcinii. Simbolurile rare au o lungime mai mare a codului.
A0 E T R A I N . B H L S V
N(s) 5 5 5 3 2 2 2 1 1 1 1 1 1
3
Laborator compresie
Pas 1:
A0
0 1
0L
A A0R
A0L E T A0R R A I N . B H L S V
N(s) 5 5 5 N(s) 3 2 2 2 1 1 1 1 1 1
N(A0L) = 15 N(A0R) = 15
Pas 2:
N(A0LR) = 10;
N(A0RL) = 7;
N(A0RR) = 8;
Simbolul spaiu este cel mai frecvent simbol folosit i a atins o frunz fiind recodificat pe 2 bii: 00 (n
loc de codul original pe 8 bii 0010 0000, adic 32).
Pas 3:
4
Laborator compresie
A0RLR A I A0RRL N . B A0RRR H L S V
N(s) 2 2 N(s) 2 1 1 N(s) 1 1 1 1
N(A0RLR) = 4;
N(A0RRL) = 4;
N(A0RRR) = 4;
Simbolurile cele mai frecvente sunt recodificate n aceast iteraie, iar noile lor coduri nu depesc
lungimea de 3 bii (n loc de 8).
Pas 4:
N(A0RRLR) = 2;
N(A0RRRL) = 2;
N(A0RRRR) = 2;
Numai simbolurile foarte rare din setul de date au mai rmas de recodificat, dar codurile lor vor avea o
lungime de 5 bii n loc de 8 bii.
Pas 5 :
5
Laborator compresie
Noile coduri nu depesc 5 bii minimizarea redundanei i deci maximizarea ratei de compresie.
13 32 5 69 5 84 5 82 65 2 73 2
Cod info
N N E N T N R A N I N
nr. bii
8 8 32 8 32 8 32 8 8 32 8 32
Cod 78 32 46 1 66 1 72 1 76 1 83 1 86 1
info nr. N N . N B N H N L N S N V N
bii 8 8 8 32 8 8 8 32 8 32 8 32 8 32
Codurile numerice sunt exprimate n zecimal, dar n realitate aceste coduri sunt binare i au cte o
lungime de 8 bii. Aranjarea informaiei auxiliare poate fi realizat i n alt manier, dar modul de
aranjare trebuie cunoscut i la decompresia datelor.
Cod 1011 011 00 1011 11110 00 11011 010 011 011 010 100 00
info
I T I S B E T T E R
nr.
bii 4 3 2 4 5 2 5 3 3 3 3 3 2
Cod 11101 1010 011 010 100 00 011 11100 1010 1100
info
L A T E R T H A N
nr.
bii 5 4 3 3 3 2 3 5 4 4
Codurile informaiei utile i cele ale informaiei auxiliare se succed fr separatori ntre ele. ntre
informaia auxiliar i cea util ar putea s apar un separator sub forma unui simbol virtual, n absena
numrului de simboluri ai alfabetului, N. n acest caz, separatorul de informaie trebuie s aib un cod mai
mare de 255, de exemplu 256, dar reprezentarea lui ar fi pe 16 bii, n loc de 8 bii, ct ocup N.
Ha(D) depete lungimea setului original de date (30 * 8 = 240 de bii), datorit reprezentrii pe 32 de
bii a contoarelor asociate. Reducerea acestei reprezentri se poate face prin scalarea contoarelor n gama
0:255, cu o uoar pierdere a preciziei de estimare a probabilitilor de apariie pentru simbolurile rare ai
setului de date.
Dac N(s1) =< 255 scalarea nu mai este necesar i se poate transmite cte 8 bii pentru fiecare contor.
Dac N(s1) > 255 N(s1) = 255 i N(sk), cu k = 2 ... N, se scaleaz astfel: N(sk) [255 x N(sk) / N(s1)]
Toate contoarele care devin nule n urma scalrii vor fi resetate la valoarea 1, pentru a nu elimina
vreun simbol. Dezavantajul scalrii apare n situaia n care la nceput N(sm) > N(sn), iar dup scalare se
obine N(sm) = N(sn). Dup scalare noile coduri pot avea un bit n plus sau n minus, mai ales n cazul
celor care apar rar n setul de date. In cazul seturilor lungi de date efectul scalrii asupra performanelor
de compresie este nesemnificativ (unele simboluri pierd un bit iar altele ctig un bit).
Entropia informaiei utile este:
Aceast valoare este foarte apropiat de cea ideal (101,625 bii) metoda de compresie eficient.
Concluzii:
- n urma compresiei setul original de date va fi expandat, datorit dimensiunii lui reduse depite
de dimensiunea de stocare a modelului static;
- tipul static al modelului determin expandarea datelor;
- un model dinamic ar produce performane mai bune, dar ar crete complexitatea metodei de
compresie / decompresie
Decompresia datelor
Exemplu:
- primul bit este 1 deplasarea de la A0 la A0R
- Al doilea bit 0 deplasarea spre A0RL
- Al treilea bit 1 deplasarea spre A0RLR
- Al patrulea bit 1 atingerea simbolului I, care va fi nscris pe fluxul de ieire
Observaie:
Avantajul metodei const n faptul c nu este necesar cunoaterea dimensiunilor noilor coduri de
compresie care n general variaz de la un simbol la altul.
3. Codul Huffman
3.1 Introducere
D. Huffman a elaborat un algoritm Greedy care construiete un cod prefix optimal, numit cod
Huffman. Prima etap n construcia codului Huffman este calcularea numrului de apariii ale fiecrui
caracter n text. Exist situaii n care putem utiliza frecvenele standard de apariie a caracterelor,
calculate n funcie de limb sau de specificul textului.
Fie C={c1,c2,...,cn} mulimea caracterelor dintr-un text, iar f1,f2,...,fn, respectiv, numrul lor de
apariii. Dac li ar fi lungimea irului ce codific simbolul ci, atunci lungimea total a reprezentrii ar fi:
n
L = li fi
i =1
Scopul nostru este de a construi un cod prefix care s minimizeze aceast expresie. Pentru aceasta,
construim un arbore binar complet n manier bottom-up astfel :
- Iniial, considerm o partiie a mulimii C={ {c1,f1},{c2,f2}, ..., {cn,fn}}, reprezentat printr-o
pdure de arbori formai dintr-un singur nod.
- Pentru a obine arborele final, se execut n-1 operaii de unificare.
Unificarea a doi arbori A1 i A2 const n obinerea unui arbore A, al crui subarbore stng este A1,
subarbore drept A2, iar frecvena rdcinii lui A este suma frecvenelor rdcinilor celor doi arbori. La
fiecare pas unificm 2 arbori ale cror rdcini au frecvenele cele mai mici.
Fazele de compresie i decompresie trec prin aceleai etape ca n cazul algoritmului Shannon-Fano.
Construcia arborelui pleac de la frunze spre rdcin codurile simbolurilor sunt construite de la bitul
cel mai puin semnificativ la bitul cel mai semnificativ.
Pas 2: Rearanjarea simbolurilor alfabetului: A0 = {s1, s2, .......sN} cu N(s1) >= N(s2) >= ... >= N(sN)
Se renoteaz i reindexeaz elementele alfabetului astfel:
8
Laborator compresie
Simbolurile tN, tN+1, ......., t2N-1 sunt utilizai pentru etichetarea frunzelor arborelui binar, iar alfabetul A0
devine primul alfabet curent al algoritmului i va fi renotat prin A0,N. Fiecare alfabet curent al
algoritmului se va nota prin A0,(N-k), k=0 .... N-1
k=0 frunzele arborelui sunt etichetate cu simbolurile primului alfabet curent
Pas 3: Construcia arborelui binar se realizeaz simultan cu formarea noului alfabet curent.
Noul alfabet curent, A0,(N-k-1) cu k=0 ... N-2, se construiete din vechiul alfabet A0,(N-k), aplicndu-se
urmtoarea regul:
se elimina 2 simboluri cu cele mai mici contoare din vechiul alfabet curent, nlocuindu-le cu un
simbol virtual, notat prin i care are contorul egal cu suma contoarelor celor dou simboluri.
Dac exist mai mult de dou simboluri slabe avnd acelai contor, se aleg ultimele dou din
alfabet cardinalul noului alfabet scade cu o unitate fa de cardinalul alfabetului precedent.
Simbolul virtual eticheteaz un nod intermediar al arborelui, avnd ca descendeni cele dou
noduri etichetate de simboluri eliminate.
Fiecare nod intermediar din arbore are cte 2 descendeni, contorul fiului din stnga fiind cel puin
egal cu cel al fiului din dreapta.
Pas 4: Se repet pasul 3 de N-1 ori pentru fiecare alfabet curent A0,(N-k) pn cnd se eticheteaz i
rdcina arborelui (t1).
Pas 5: Se reindexeaz nodurile arborelui astfel nct fiii oricrui nod s fie etichetai cu indici consecutive,
de la stnga la dreapta, ncepnd de la rdcin.
a b c d e f
cod fix 000 001 010 011 100 101
a b c d e f
Frecven 45 13 12 16 9 5
a b c d e f
cod variabil 0 101 100 111 1101 1100
9
Laborator compresie
ar fi necesari doar 224.000 bii (deci o reducere a spaiului de memorie cu aproximativ 25%).
Problema se reduce deci la a asocia fiecrui caracter un cod binar, n funcie de frecven, astfel
nct s fie posibil decodificarea fiierului comprimat, fr ambiguiti. De exemplu, dac am fi codificat
a cu 1001 i b cu 100101, cnd citim n fiierul comprimat secvena 1001 nu putem decide dac este
vorba de caracterul a sau de o parte a codului caracterului b.
Ideea de a folosi separatori ntre codurile caracterelor pentru a nu crea ambiguiti ar conduce la
mrirea dimensiunii codificrii.
Pentru a evita ambiguitile este necesar ca nici un cod de caracter s nu fie prefix al unui cod
asociat al unui caracter (un astfel de cod se numete cod prefix).
Figura 1.
Pas 1: Unificm arborii corespunztori lui e i f, deoarece au frecvenele cele mai mici:
Figura 2.
Pas 2: Unificm arborii corespunztori lui b i c:
Figura 3.
Pas 3: Unificm arborele corespunztor lui d i arborele obinut la primul pas, cu rdcina ce are
frecvena 14:
Figura 4.
Pas 4: Unificm arborii ce au frecvenele 25 i 30.
Figura 5.
10
Laborator compresie
Pas 5: Unificnd ultimii doi arbori, se obine arborele Huffman asociat acestui set de caractere cu
frecvenele specificate iniial.
Figura 6.
Nodurile terminale vor conine un caracter i frecvena corespunztoare caracterului; nodurile
interioare conin suma frecvenelor caracterelor corespunztoare nodurilor terminale din subarbori.
Arborele Huffman obinut va permite asocierea unei codificri binare fiecrui caracter.
Caracterele fiind frunze n arborele obinut, se va asocia pentru fiecare deplasare la stnga pe drumul de la
rdcin la nodul terminal corespunztor caracterului un 0, iar pentru fiecare deplasare la dreapta un 1.
Obinem codurile :
a b c d e f
cod 0 100 101 110 1110 1111
Observaii
- caracterele care apar cel mai frecvent sunt mai aproape de rdcin i astfel lungimea codificrii
va avea un numr mai mic de bii.
- la fiecare pas am selectat cele mai mici dou frecvene, pentru a unifica arborii corespunztori.
Pentru extragerea eficient a minimului vom folosi un minheap. Astfel timpul de execuie pentru
operaiile de extragere minim, inserare i tergere va fi, n cazul cel mai defavorabil, de O(log n).
Analiza complexitii
Iniializarea heapului este liniar. Pasul 2 se repet de n-1 ori i presupune dou operaii de
extragere a minimului dintr-un heap i de inserare a unui element n heap, care au timpul de execuie de
O(log n). Deci complexitatea algoritmului de construcie a arborelui Huffman este de O(n log n).
Corectitudinea algoritmului
Trebuie s demonstrm c algoritmul lui Huffman produce un cod prefix optimal.
Lema 1.
Fie x, y C, dou caractere care au frecvena cea mai mic. Atunci exist un cod prefix optimal
n care x i y au codificri de aceeai lungime i care difer doar prin ultimul bit.
Demonstraie:
Fie T arborele binar asociat unui cod prefix optimal oarecare i fie a, b dou noduri de pe nivelul maxim,
care sunt fiii aceluiai nod. Putem presupune fr a restrnge generalitatea c f[a] f[b] i f[x] f[y].
Cum x i y au cele mai mici frecvene rezult c f[x] f[a] i f[y] f[b]. Transformm arborele T n T',
schimbnd pe a cu x :
11
Laborator compresie
Fig. 7.
Notm cu C(T) costul arborelui T:
C (T ) = f ( c) nivT ( c)
cC
C (T ) C (T ' ) = f ( x ) nivT ( x ) + f ( a ) nivT ( a) f ( x ) nivT ' ( x ) f ( a ) nivT ' ( a )
nivT '( x )= nivT ( a )
{
C (T ) C (T ' ) = ( f ( a ) f ( x )) ( nivT ( a ) nivT ( x )) 0, pentru c nivT '( a ) = nivT ( x )
Observaie
Din lem deducem c pentru construcia arborelui optimal putem ncepe prin a selecta dup o
strategie Greedy caracterele cu cele mai mici frecvene.
Lema 2.
Fie T un arbore binar complet corespunztor unui cod prefix optimal pentru alfabetul C. Dac x i
y sunt dou noduri, fii ai aceluiai nod z n T, atunci arborele T' obinut prin eliminarea nodurilor x i y
este arborele binar complet asociat unui cod prefix optimal pentru alfabetul
C' = (C-{x,y}) { z}, f[z] fiind f[x]+f[y].
C (T ) = f ( c) nivT ( c) = C (T ' ) + ( f ( x ) + f ( y ))
cC
Dac presupunem prin reducere la absurd c arborele T nu este optimal pentru alfabetul C = (C-
{x,y}) {z} T, ale crui frunze sunt caractere din C, astfel nct C(T) < C(T).
Cum z este nod terminal n T, putem construi un arbore T1 pentru alfabetul C, atrnnd pe x [i y
ca fii ai lui z.
C(T1) = C(T)+f(x)+f(y) < C(T), ceea ce contrazice ipoteza c T este arbore optimal pentru C. Deci, T
este un arbore optimal pentru C.
Corectitudinea algoritmului lui Huffman este o consecin imediat a celor dou leme.
Observaie
Metoda de compresie bazat pe arbori Huffman statici are o serie de dezavantaje:
1. Fiierul de compactat trebuie parcurs de dou ori: o dat pentru a calcula numrul de apariii ale
caracterelor n text, a doua oar pentru a comprima efectiv fiierul. Deci metoda nu poate fi folosit
pentru transmisii de date pentru care nu este posibil reluarea.
2. Pentru o dezarhivare ulterioar a fiierului, aa cum este i firesc, este necesar memorarea arborelui
Huffman utilizat pentru comprimare, ceea ce conduce la mrirea dimensiunii codului generat.
3. Arborele Huffman generat este static, metoda nefiind capabil s se adapteze la variaii locale ale
frecvenelor caracterelor.
Aceste dezavantaje au fost n mare parte eliminate n metodele care folosesc arbori Huffman
dinamici, ideea fiind ca la fiecare nou codificare, arborele Huffman s se reorganizeze astfel nct
caracterul respectiv s aib eventual un cod mai scurt.
12
Laborator compresie
4. Desfurarea lucrrii
1. exemple cu shannon fano
2. exemple cu shannon fano
3. exemple cu shannon fano
4. Construii arborele Huffman corespunztor alfabetului C={a,b,c,d,e,f,g,h} i frecvenelor:
a b c d e f g h
Frecvena 5 10 7 5 8 15 40 10
a b c d e f g h i
Frecvena 1 1 2 3 5 8 13 21 34
Putei generaliza rspunsul pentru cazul n care frecvenele sunt primele n numere din irul
Fibonacci?
6. Dac presupunem c oricare dou caractere din alfabet au frecvene distincte, atunci arborele
Huffman este unic?
13