Metode de compresie

Desi există un număr mare de formate grafice, practic sunt folosite doar câteva metode pentru codificarea datelor. Mai mult, există doar câteva metode conventionale pentru compresia datelor în vederea utilizării unui spatiu cât mai mic la stocare. Detaliile algoritmilor de compresie variază si sunt eventual descrise la prezentarea formatelor grafice.

Algoritmul Huffman

Prin intermediul acestei tehnici, se urmăreste ca de fapt caracterelor care apar mai des să li se asigure un cod mai scurt iar celor cu frecventă de aparitie mai redusă să li se asigure un cod de lungime mai mare. Aceste corespondente se înregistrează într-o tabelă de conversie care va fi folosită la decodificare.

De exemplu în sirul următor există doar 6 valori unice: abbbccddddeeeeeeef. Frecventele cu care apar caracterele sunt descrise în continuare:

a: 1; b: 3; c: 2; d:4; e: 7; f:1. 

Pentru a găsi codul potrivit fiecărui caracter se poate utiliza un arbore binar. Algoritmul porneste de la împerechierea elementelor cu frecventa de aparitie cea mai mică. Apoi această pereche este tratată ca si un singur element iar frecventele sunt combinate. Acest mod de lucru este aplicat până când toate elementele sunt combinate.

În scopul de a lucra corect, algoritmul Huffman este compus din două etape. În cadrul primei etape este creat un model statistic privind frecventa de aparitie a caracterelor în fisierul ce trebuie comprimat. Cea de-a două fază realizează comprimarea propriu-zisă. În consecintă, din cauza faptului că aceste coduri de lungime variabilă necesită multe procesări, compresia si decompresia se realizează foarte încet.

Compresia LZW

Acesta este un algoritm de compresie mult mai recent descoperit de un cercetător pe nume Welch si implementat apoi de Lempel si Ziv. El a fost dezvoltat în mod deosebit pentru a putea fi implementat la nivel hard, având câteva variatii. Desi este protejat prin patent, acest algoritm apare în produse public-domain, cum este utilitarul de comprimare sub sistemul de operare UNIX.

Contrar algoritmului Huffman, în cazul LZW nu este necesară construirea unei tabele de conversie înaintea începerii procesului de comprimare. Practic se începe cu o tabelă simplă, care asignează câte un cod fiecărui caracter posibil (256 de intrări a câte 8 biti fiecare, de exemplu). În timpului desfăsurării procesului, algoritmul construieste o tabelă de coduri mai mare si mai eficientă adăugând coduri noi pentru fiecare nouă secventă de caractere. Singurul lucru necesar este fixarea unei lungimi maxime a tabelei astfel încât să se cunoască lungimea maximă a codului care poate fi alocat.

Să considerăm că avem de-a face cu sirul următor: ababaaacaaaad. Tabela initială va arăta cam asa: a:00; b:01; c:10; d:11. Algoritmul LZW caută cea mai lungă secventă pe care o poate recunoaste. Prima dată găseste valoarea a si o recunoaste; în continuare încearcă pentru secventa ab - nu o mai recunoaste. În acest caz se scrie în fisierul de iesire codul pentru caracterul recunoscut (000) si se adaugă o nouă intrare tabelei, pentru secventa negăsită. Tabela devine:

a:000; b:001; c:010; d:011; ab:100 

Codificatorul ia în considerare ultima valoare, b, si încearcă construirea unui nou model împreună cu următoarea valoare. În acest mod apare ba care nu va fi recunoscut si ca urmare în fisierul de iesire va fi scris codul caracterului b (001). Decodificatorul a receptionat aceleasi date si va proceda în acelasi mod la adăugarea unui cod pentru ab în tabela sa. Acum urmează partea bună deoarece codificatorul, la fel ca si decodificatorul, poate recunoaste următoarea aparitie a secventei ab. În acest mod, o secventă cu codul pe 3 biti poate înlocui două coduri de câte 2 biti - acest lucru nu este un câstig imens dar în cazurile reale eficienta este mult mai mare.

Algorimul LZW este folosit în cadrul formatelor GIF si TIFF putând reduce dimensiunea fisierului initial cu maxim 3:1 (în cazul în care imaginea contine multe secvente repetitive se poate ajunge si la rate de compresie de ordinul a 10:1).

Compresia aritmetică

Această tehnică, ca si în cazul algoritmului Huffman prezentat mai înainte, foloseste coduri mai scurte pentru caracterele ce apar mai frecvent. În orice caz este o tehnică mult mai eficientă, care ca si LZW, comprimă secventele de valori si nu valorile în sine. Ea se apropie foarte mult de limitele teoretice ale compresiei.

Există câteva variatii pe tema compresiei aritmetice, toate abordările fiind mult prea complexe pentru a putea fi explicate pe larg în acest cadru. Simplistic vorbind, se întâmplă ca fiecare secventă diferită să indice spre o regiune de pe o linie imaginară care se află între 0 si 1. Această regiune va fi reprezentată ca si o fractie binară de precizie variabilă (număr de biti). Caracterele ce apar cu o frecvetă mai mică, în fisierul de comprimat, vor avea nevoie de un număr de precizie mai mare (mai multi biti). Compresia aritmetică poate reduce dimensiunea unui fisier în mod dramatic astfel că o rată de 100:1 nu este ceva neobisnuit. Compresia aritmetică este protejată prin câteva brevete de inventie care au ca autor concernul IBM si nu este foarte răspândită ca urmare a problemelor de licentiere.


(C) Copyright Computer Press Agora