compresia informatiei textuale
TRANSCRIPT
ANALIZA ALGORITMILOR PENTRU COMPRESIA INFORMAŢIEI TEXTUALE
ŞI A EFICIENŢEI PROGRAMELOR DE ARHIVARE
CUPRINS
ABREVIERI.........................................................................................................................................3
LISTA TABELELOR ŞI GRAFICELOR............................................................................................4
ADNOTARE........................................................................................................................................6
CUVINTE-CHEIE...............................................................................................................................6
INTRODUCERE..................................................................................................................................8
CAPITOLUL 1. METODE DE COMPRESIE..................................................................................10
1.2. ALGORITMI ENTROPICI.....................................................................................................13
1.2.1. CODAREA BINARĂ HUFFMAN STATICĂ................................................................15
1.2.2. CODAREA BINARĂ SHANNON – FANO...................................................................17
1.2.3. CODAREA BINARĂ HUFFMAN DINAMICĂ (ADAPTIVĂ)....................................18
1.2.4. COMPRESIA ARITMETICĂ.........................................................................................19
1.3. ALGORITMI PE BAZĂ DE DICŢIONAR............................................................................25
1.3.1. ALGORITMUL LZ77......................................................................................................28
1.3.2. ALGORITMUL LZ78......................................................................................................31
1.3.3. ALGORITMUL LZW......................................................................................................33
CAPITOLUL 2. COMPRESIA FIŞIERELOR DE UZ GENERAL..................................................37
2.1 WinRAR...................................................................................................................................37
2.2 WinZIP.....................................................................................................................................38
2.3. 7-Zip FILE MANAGER.........................................................................................................39
2.3.1. ZIP....................................................................................................................................40
2.3.2. FORMATUL 7z...............................................................................................................41
2.3.3. LZMA...............................................................................................................................41
2.4. POWER ARCHIVER 2009.....................................................................................................42
2.5. COMPARAREA EFICIENŢEI PROGRAMELOR DE ARHIVARE...................................42
CAPITOLUL 3. COMPRESIA FIŞIERELOR DIGITIZATE...........................................................43
3.1. COLECŢIILE DIGITALE – O NOUĂ POSIBILITATE DE ACCES LA INFORMAŢIE...43
3.2. FORMATELE UZUALE ALE FIŞIERELOR SCANATE....................................................47
3.3. DjVu: UN SISTEM DE COMPRESIE TIP IMAGINE PENTRU DISTRIBUIREA
DOCUMENTELOR NUMERICE.................................................................................................48
3.4. EFICIENŢA TEHNICII DE COMPRESIEI DjVu.................................................................52
3.4.1. REZULTATE: IW44 PENTRU IMAGINI NATURALE...............................................54
3.4.2. REZULTATE: JB2 PENTRU IMAGINI ÎN DOUĂ NUANŢE......................................54
3.4.3. REZULTATE: DjVu PENTRU DOCUMENTELE COLOR..........................................56
CAPITOLUL 4. IMPLEMENTĂRI PRACTICE..............................................................................58
4.1. ALGORITMUL HUFFMAN STATIC (ALGORITM ENTROPIC)......................................58
4.1.1. CODUL SURSĂ AL ALGORITMULUI HUFFMAN ÎN VISUAL C++.......................59
4.2. ALGORITMUL LZW (ALGORITM PE BAZĂ DE DICŢIONAR).....................................64
4.2.1. CODUL SURSĂ AL ALGORITMULUI LZW ÎN VISUAL C++..................................65
CONCLUZIE.....................................................................................................................................74
BIBLIOGRAFIE................................................................................................................................76
2
ABREVIERI
ACM Association for Computing Machinery
ACRL Association of College & Research Libraries
ALA American Library Association
BMP Windows bitmap
CD-ROM Compact Disk read-only memory
CNI Coalition for Networked Information
DARPA Defence Advanced Research Projects Agency
DjVu déjà vu format
DLF Digital Library Federation
DLI Digital Library Initiatives
dpi dots per inch
EBCOT Embedded Block Coding with Optimal Truncation
EZW Embedded Zerotree Wavelet
GIF Graphics Interchange Format
GPL General Public License
IEEE Institute of Electrical and Electronics Engineers
IFLA International Federation of Library Associations
IW44 Wavelet based compression algorithm
JB2 bi-level image compression algorithm
JBIG Joint Bi-level Image Experts Group
JISC Joint Information Systems Committee, U.K
JPEG Joint Photographic Experts Group
LZW Lempel-Ziv-Welch
MMR Min–Min-Roughness algorithm
MMR Modified Modified READ (READ is Relative Element Address Designate codes)
NASA National Aeronautics and Space Administration
NSF National Science Foundation, U.S
ODLIS Online Dictionary for Library and Information Science
PDF Portable Document Format
RGB Modelul de culori Red-Green-Blue
SPIHT Set Partitioning in Hierarchical Trees
TIFF Tagged Image File Format
WDL World Digital Library
3
LISTA TABELELOR ŞI GRAFICELOR
Figura 1.1.1. Structura compresiei statice fără pierdere de informaţie..............................................12
Figura 1.1.2. Structura compresiei adaptive fără pierdere de informaţie (lossless compression)......12
Figura 1.2.1.1. Procedeul de codare Huffman...........................................................................16
Figura 1.2.2.1. Procedeul de codare Shannon – Fano.......................................................................18
Figura 1.2.4.1. Procesul de codificare aritmetică...............................................................................22
Figura 1.2.4.2. Procesul de decodificare aritmetică...........................................................................23
Tabelul 1.3.1. Formarea dicţionarului................................................................................................26
Tabelul 1.3.2. Cele mai frecvente 30 de perechi de caractere dintr-un document de 41.364 caractere
............................................................................................................................................................27
Tabelul 1.3.3. Cele mai frecvente 30 de perechi de caractere dintr-un program C de 65.983 caractere
............................................................................................................................................................27
Figura 1.3.1.1. Procedeul codării algoritmului LZ77.........................................................................29
Figura 1.3.1.2. Poziţionarea iniţială a secvenţei în fereastră pentru LZ77.........................................29
Figura 1.3.1.3. Deplasarea ferestrei cu o poziţie pentru căutarea unei asemănări.............................29
Figura 1.3.1.4. Deplasarea ferestrei cu l+1 poziţii pentru căutarea unei noi asemănări.....................30
Figura 1.3.1.5. Decodarea primului triplet.........................................................................................30
Figura 1.3.1.6. Decodarea celui de-al doilea triplet...........................................................................30
Figura 1.3.1.7. Decodarea ultimului triplet........................................................................................30
Figura 1.3.2.1. Procedeul codării algoritmului LZ78.........................................................................31
Tabelul 1.3.2.1. Formarea dicţionarului aplicând algoritmul LZ78...................................................32
Tabelul 1.3.3.1. Exemplu de dicţionar iniţial pentru codarea LWZ...................................................33
Tabelul 1.3.3.2. Exemplu de dicţionar complet pentru codarea LZW...............................................34
Tabelul 1.3.3.3. Procedeul de decodare LZW....................................................................................35
Tabelul 1.3.3.4. Exemplu de codare LZW ........................................................................................35
Tabelul 2.3.1. Formatele suportate (compatibile) ale aplicaţiei 7-ZIP...............................................39
Tabelul 2.3.2.1. Metodele integrate curent în 7z................................................................................41
Tabelul 2.5.1. Compararea eficienţei programelor de arhivare..........................................................42
Figura 3.3.1. Divizarea prim-plan/fundal ..........................................................................................49
Figura 3.3.1.1. Proiecţiile succesive converg către un punct de intersecţie a două subspaţii convexe
reprezentând (a) imagini de potrivire a imaginii iniţiale în afara măştii, şi (b) imagini ale căror
coeficienţi mascaţi wavelet sunt zero.................................................................................................51
Figura 3.4. Descărcarea fişierului printr-un modem de 56 K: decompresia progresivă mai întâi a
textului, apoi a fundalului cu o creştere continuă a calităţii ..............................................................53
4
Tabelul 3.4.1.1. Raportul semnal/zgomot obţinut cu diferite metode de compresie..........................54
Tabelul 3.4.2.1. Comparaţii între MMR/G4 şi JB2 după mărimea fişierelor.....................................55
Tabelul 3.4.2.2. Comparaţii între MMR/G4 şi JB2 după rata de compresie......................................55
Tabelul 3.4.2.3. Rata de compresie a JB2 în raport cu rata de compresie relativă a G4...................56
Tabelul 3.4.2.4. Comparaţii între MMR/G4 şi JB2 după mărimea medie a unei pagini....................56
Tabelul 3.4.3.1. Mărimea fişierelor (în KB) obţinute la digitizare utilizând diferiţi algoritmi..........56
Tabelul 3.4.3.2. Rezultatele compresiei utilizând diferiţi algoritmi ..................................................57
5
ADNOTARE
Compresia datelor se ocupă cu reprezentarea informaţiei într-o formă compactă. Acest lucru se
realizează prin identificarea şi extragerea redundanţei din date.
Modelarea statistică a unei surse discrete de informaţie constă în asocierea unei probabilităţi de
apariţie a 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ă şi dinamică, codificarea aritmetică.
Aceşti algoritmi sunt descrişi în capitolul 1.
Metodele de compresie bazate pe modelarea lingvistică a surselor discrete au la bază ideea 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. Din această categorie fac parte algoritmii LZ77, LZ78, LZW, o descriere mai detaliată
este în capitolul 1 al tezei date.
Un compresor de date este o aplicaţie care, pe baza unuia sau mai multor algoritmi de
compresie, diminuează spaţiul necesar stocării informaţiei utile conţinute de un anumit set de date.
Pentru orice compresor de date este necesară condiţia de existenţă a cel puţin unui decompresor
care, pe baza informaţiilor furnizate de compresor, să poată reconstitui informaţia care a fost
comprimată. În cazul în care nu există un decompresor, atunci datele comprimate devin inutile
pentru utilizator deoarece acesta nu mai are acces la informaţia stocată în arhivă (o arhivă
reprezintă rezultatul obţinut în urma utilizării unui compresor). Aplicaţiile de arhivare de uz general
sunt tratate în capitolul 2.
Apariţia necesităţii digitizării publicaţiilor de patrimoniu, a manuscriselor etc. impune crearea
unei tehnici de compresie pentru fişierele scanate. Stocarea acestor fişiere în format DjVu care în
acest moment permite cel mai bun raport de compresie/calitate a fişierului standard este o
posibilitate analizată în această lucrare în capitolul 3.
Ultimul capitol conţine implementările practice ale algoritmilor Huffman static şi LZW.
CUVINTE-CHEIE
Compresia datelor, algoritmi, codare statică, codare adaptivă, Huffman, Shannon-Fano, tehnici
de dicţionar, LZW, arhivatori, DjVu.
6
ABSTRACT
Data compression deals with the representation of information in a compact form. This is
achieved by identifying and extracting the redundancy from the data.
Statistical modelling of discrete sources of information is a combination of probabilities of each
symbol of the source alphabet followed by assigning code words with a fewer bits to the words with
a higher probability of occurrence. In this category is included Shannon-Fano coding, static and
dynamic Huffman coding, arithmetic coding. These algorithms are described in the Chapter 1.
Compression methods based on language modelling of discrete sources based on the idea of
building a dictionary of words associated with the source language. Subsequently inserting a word
in the dictionary for any occurrences of this word is replaced with information about its position in
the dictionary. In this category take part algorithms like LZ77, LZ78, LZW, a more detailed
description is in the Chapter 1 of this thesis.
A data compression is an application which on the basis of one or several compression
algorithms reduces storage space needed useful information contained in a data set. For any data
compression is necessary condition of existence of at least one decompresor, on the basis of
information supplied by the compressor can reconstruct information that has been compressed. If
there is no a decompresor, then compressed data become unnecessary for the user because this has
no access to the information stored in the archive (an archive is the result of the using a
compressor). Archiving applications of general using are treated in the Chapter 2.
The appearance of the necessity to digitize the patrimony publications, manuscripts, etc. it
requires the creation of a compression technique for the scanned files. Storing these files in DjVu
format that currently allows as the best report compression / quality of the standard file is a
possibility examined in the chapter 3 of this thesis.
The final chapter contains practical implementations of the static Huffman and LZW
algorithms.
KEYWORDS
Data compression, algorithms, static coding, adaptive coding, Huffman, Shannon-Fano,
dictionary techniques, LZW, archivers, DjVu.
7
INTRODUCERE
Compresia de date este ansamblul prelucrărilor ce se aplică unor date în scopul reducerii
dimensiunii reprezentării acestora fără a pierde informaţie importantă. Diminuarea poate fi obţinută
fie prin aplicarea unui algoritm fără pierdere, în acest caz datele originale sunt reobţinute la
decompresie, fie prin aplicarea unui algoritm cu pierdere, în acest caz datele recuperate după
compresie reprezintă o reconstruire satisfăcătoare a datelor originale. Reducerea volumului de date
permite stocarea mai multor informaţii pe un singur produs media, sau ia mai puţin timp pentru a le
transfera în reţea. În unele cazuri, volumul de date este prea mare, încât aproape e imposibil de
prelucrat şi reprezentat fără a le compresa.
Compresia informaţiei textuale necesită algoritmi fără pierdere, deoarece se schimbă sensul
informaţiei. Dacă la compresia sunetelor, imaginilor, secvenţelor video se admit careva pierderi de
informaţie, uneori chiar se cere suprimarea datelor ce nu pot fi percepute de om şi se ajunge la un
raport de compresie de 50:1, în ceea ce priveşte compresia unui text se poate obţine un raport de
aproximativ 2:1.
Raportul de compresie este egal cu raportul dintre dimensiunea reprezentării datelor în lipsa
compresiei şi dimensiunea reprezentării datelor obţinute în urma ei.
Sunt multe tehnologii de compresie a informaţiei textuale, dar trebuie de ţinut cont că trebuie de
reconstruit aceasta informaţie, căci altfel nu au nici o valoare datele comprimate. Iar faptul că
datele trebuie recuperate 100% face dificilă această misiune.
Codul Morse – o metodă veche de compresie nu este utilizat în prezent decât în situaţii foarte
rare, telegramele sunt neglijate odată cu venirea mesajelor electronice şi a Internetului. Rutele
poştale sunt înlocuite cu legături prin satelit de mare debit, cu o creştere a criptării. Chiar şi tipul
mesajelor s-a schimbat. De la scrisori oficiale telegrafice noi am trecut la o comunicare mai bogată:
documente, texte, imagini, sunet, muzică şi video. Apariţia Internetului şi în general a sistemelor
multimedia a transformat enorm modul nostru de comunicare. Noi trăim într-o societate numerică.
Noi comunicăm utilizând telefoane mobile numerice, noi trimitem mesaje prin poşta electronică.
Noi putem citi o carte care se află într-o bibliotecă la celălalt capăt al lumii vizitând site-ul ei web
(bibliotecă virtuală). Putem să avem o colecţie respectabilă de cărţi stocată pe un USB flash de
mărimea unei brichete.
Nu este necesar de a relata despre modul în care tehnologiile informaţionale transformă modul
nostru de a trăi, de a aborda relaţiile interpersonale, voi insista doar asupra faptului că aceste
transformări sunt rezultatul reuşitelor tehnologice bazate pe schimbul eficace al informaţiei. Acest
schimb nu poate avea loc dacă utilizăm date în forma lor brută. De fapt, toate aceste date, care sunt
la baza revoluţiei numerice, sunt în stare brută, prea voluminoase pentru a fi prelucrate aşa cum sunt
8
ele, cu toate că tehnologiile de stocare şi de telecomunicaţie s-au ameliorat foarte mult. Pentru a nu
încărca reţelele, trebuie să comprimăm imaginile, sunetul şi video într-un mod eficace.
E ştiut faptul că şi codurile s-au schimbat. Nu mai utilizăm punctele, liniile şi pauzele codului
Morse, noi manipulăm bitul. În prezent codurile noi sunt elaborate cu ajutorul biţilor. Un bit este
unitatea de bază a informaţiei.
Majoritatea imaginilor, în stare necompresată au mărimea de sute de kilo-octeţi, uneori chiar şi
zeci de mega-octeţi. O piesă muzicală numerică de calitate compact-disc, „cântăreşte” zeci de
mega-octeţi. Video de calitate medie, măsoară sute de mega-octeţi pe minută. Chiar şi o simplă
conversaţie telefonică, utilizând aceeaşi bandă a sistemelor telefonice actuale, cere aproximativ 8
kilo-octeţi pe secundă, pentru a fi de calitate satisfăcătoare.
În lucrarea dată sunt analizaţi doar algoritmii de compresie textuală, motivaţia fiind specialitatea
finisată: „Informatică şi Limbi Moderne Aplicate” (Licenţa în Informatică - 4 ani), ce presupune
cunoştinţe practice ample despre prelucrarea textelor.
Metodele de compresie sunt desfăşurate în primul capitol, este dat câte un exemplu pentru o
înţelegere mai sigură a materialului expus. Capitolul II conţine informaţii despre programele de
arhivare, compatibilitatea lor cu SO, eficienţa compresiei obţinută.
În următorul capitol sunt descrise succint tendinţele internaţionale în ceea ce priveşte crearea
bibliotecilor digitale ce răspund cerinţelor de informare ale utilizatorilor secolului XXI. Sunt
prezentate cele două componente din care se constituie bibliotecile digitale: colecţiile digitale
obţinute prin digitizarea moştenirii culturale şi ştiinţifice a omenirii pentru extinderea accesului la
aceasta şi colecţiile digitale create direct în format electronic, în special în universităţi, cu scopul de
oferi accesul rapid la informaţia academică, ştiinţifică, educaţională.
Capitolul III conţine informaţie şi despre formatul DjVu utilizat pentru cărţile digitale stocate în
biblioteci virtuale.
Ultimul capitol conţine rezultatele implementărilor practice ale algoritmilor Huffman (algoritm
entropic) şi LZW (bazat pe dicţionar) cât şi explicarea codului sursă elaborat în C++.
9
CAPITOLUL 1. METODE DE COMPRESIE
1.1. CONCEPTE GENERALE DESPRE COMPRESIA DATELOR
Noţiunea de comprimare a datelor a apărut din necesitatea evidentă de a atinge rate mari de
transfer în reţele sau de a stoca o cantitate cât mai mare de informaţii folosind cât mai puţin spaţiu.
Compresia datelor este necesară în zilele noastre şi este foarte des folosită, mai ales în domeniul
aplicaţiilor multimedia.
Un compresor de date este o aplicaţie care, pe baza unuia sau mai multor algoritmi de
compresie, diminuează spaţiul necesar stocării informaţiei utile conţinute de un anumit set de date.
Pentru orice compresor de date este necesară condiţia de existenţă a cel puţin unui decompresor
care, pe baza informaţiilor furnizate de compresor, să poată reconstitui informaţia care a fost
comprimată. În cazul în care nu există un decompresor, atunci datele comprimate devin inutile
pentru utilizator deoarece acesta nu mai are acces la informaţia stocată în arhivă (o arhivă
reprezintă rezultatul obţinut în urma utilizării unui compresor).
Un compresor de date este format din următoarele elemente:
- una sau mai multe surse de informaţie;
- unul sau mai mulţi algoritmi de compresie;
- una sau mai multe transformări.
Sursa de informaţie pentru un compresor poate fi constituită de unul sau mai multe fişiere sau de
un flux de date care a fost transmis compresorului prin intermediul unei reţele. Datele arhivate
urmează să fie stocate într-o arhivă care urmează să fie păstrată local sau urmează să fie transmisă
mai departe.
Există două categorii principale de algoritmi pentru compresia datelor:
1. algoritmi de compresie fără pierderi de date
1.1. algoritmi entropici de compresie a datelor (algoritmi care elimină redundanţa din cadrul
seturilor de date):
- algoritmul Huffman
- algoritmul Shannon-Fano
- algoritmi de compresie aritmetică (acesta este cel mai performant algoritm entropic
cunoscut).
1.2. algoritmi bazaţi pe dicţionare
- Lempel Ziff 77 (LZ77), Lempel Ziff 78 (LZ78)
- variante ale algoritmilor din categoria LZ
1.3. transformări fără pierderi de date
- Run Length Encoding (RLE)
10
- Burrow-Wheeler Transform (BWT)
- transformarea delta
2. algoritmi de compresie cu pierderi de date
2.1. algoritmi folosiţi pentru compresia audio care se bazează pe proprietăţile undelor sonore şi
perceperea lor de către om;
2.2. algoritmi utilizaţi pentru compresia imaginilor digitale;
2.3. algoritmi utilizaţi pentru compresia datelor video.
Algoritmii de compresie aparţinând celei de-a doua clase (cea cu pierderi de date) se folosesc
împreună cu cei din prima pentru atingerea unor rate mari de compresie [14].
Metodele de compresie text pot fi împărţite în doua categorii: statistice şi ne-statistice.
Metodele statistice utilizează un model probabilistic al sursei de informaţie. Astfel de coduri sunt
Shannon-Fano sau Huffman. Metodele ne-statistice utilizează alte principii de codare cum sunt cele
bazate pe dicţionare, deci nu folosesc probabilităţile simbolurilor.
In cazul metodelor statistice, un punct important în compresia datelor fără pierdere de
informaţie este dat de posibilitatea organizării/descompunerii compresiei în două funcţii: modelare
şi codificare. Metoda statistică are la bază folosirea probabilităţilor simbolurilor în stabilirea
cuvintelor de cod. Daca modelul sursei este stabilit înaintea etapei de codare, şi rămâne neschimbat
în timpul codării, metoda de compresie este una statică. Algoritmul de compresie este unul
„mecanic” prin înlocuirea fiecărui simbol la sursei cu cuvântul de cod corespunzător, şi transmiterea
acestuia pe canal. Metodele statice presupun transmiterea pe canal a informaţiilor despre modelului
sursei şi/sau a codului folosit, astfel încât decodorul să poate efectua operaţia de decodare. Canalul
de comunicaţie se considera fără erori.
O metodă statică este aceea în care transformarea mulţimii mesajelor în cuvinte de cod este
fixată înainte de începerea transmisiei, astfel încât un mesaj dat este reprezentat prin acelaşi cuvânt
de cod de fiecare data când apare în mesajul global. Un exemplu de codare statică, bazată de
cuvinte de cod, este codarea Huffman (statică). Aici asignarea cuvintelor la mesajele sursei este
bazată pe probabilităţile cu care mesajele sursei apar în mesajul global. Mesajele care apar mai
frecvent sunt reprezentate prin cuvinte de cod mai scurte; mesajele cu probabilităţi mici sunt
reprezentate de cuvinte de cod mai lungi.
La fiecare pas de codare este necesar să se estimeze probabilităţile de utilizare a simbolurilor
sursei. Codorul preia distribuţia de probabilitate şi stabileşte codul folosit pentru compresie. Se
estimează probabilităţile de utilizare a simbolurilor sursei. Codorul preia distribuţia de probabilitate
şi stabileşte codul folosit pentru compresie.
11
Figura 1.1.1. Structura compresiei statice fără pierdere de informaţie
Figura 1.1.2. Structura compresiei adaptive fără pierdere de informaţie (lossless compression)
Un cod este dinamic (dynamic) dacă codarea mulţimii mesajelor sursei primare se schimbă în
timp. De exemplu, codarea Huffman dinamică presupune estimarea probabilităţilor de apariţie în
timpul codării, în timp ce mesajul este procesat. Asignarea cuvintelor de cod mesajului de transmis
(de codificat) se bazează pe frecvenţele de apariţie la fiecare moment de timp. Un mesaj x poate fi
reprezentat printr-un cuvânt de cod scurt la începutul transmisiei pentru că apare frecvent la
începutul transmisiei, chiar dacă probabilitatea sa de apariţie raportată la întreg ansamblu este mică.
Mai târziu, cuvintele de cod scurte pot fi asignate altor mesaje dacă frecvenţa de apariţie se
schimbă.
Codurile dinamice se mai numesc şi coduri adaptive, care va fi folosit mai departe, întrucât ele
se adaptează la schimbările mesajului în timp. Toate metodele adaptive sunt metode într-un singur
pas: numai o singura trecere (scan) a realizării sursei este necesară. În opoziţie, codarea Huffman
statică este în doi paşi: un pas pentru determinarea probabilităţilor şi determinarea codului, şi – al
12
doilea par, pentru codare. Metodele într-un singur pas sunt mai rapide. În plus, în cazul metodelor
statice, codul determinat la primul pas trebuie transmis decodorului, împreună cu mesajul codat.
Codul se poate transmite la începutul fiecărei transmisii sau acelaşi cod poate fi folosit pentru mai
multe transmisii.
În metodele adaptive, codorul defineşte şi redefineşte dinamic cuvintele de cod, în timpul
transmisiei. Decodorul trebui să definească şi să redefinească codarea în acelaşi mod, în esenţa prin
„învăţarea” cuvintelor de cod în momentul recepţionării acestora. Dificultatea primară a utilizării
codării adaptive este necesitatea folosirii unui buffer între sursă şi canal. Reţelele de date alocă,
deci, resurse de comunicaţie sursei, în sensul alocării de memorie (buffere) ca parte a sistemului de
comunicaţie.
În final există şi metode hibride, care nu sunt complet statice sau complet dinamice. Într-un
astfel de caz simplu, emiţătorul şi receptorul folosesc o mulţime de coduri statice (codebooks). La
începutul fiecărei transmisii, emiţătorul alege şi trebuie să transmită numărul (numele,
identificatorul) codului folosit.
Compresia textelor este un subset al compresiei datelor şi se ocupă cu acei algoritmi care au
proprietatea ca toată informaţia prezentă în fişierul original, fişier necompresat, este prezentă în
fişierul comprimat şi deci în fişierul expandat. Nu se acceptă o pierdere de informaţie, chiar dacă
algoritmul de compresie poate adăuga informaţie redundantă necesară pentru a efectua în bune
condiţii decompresia (expandarea). Aceste tehnici garantează obţinerea unui fişier expandat identic
cu cel original, existent înaintea compresiei. Aceşti algoritmi se numesc fără pierderi ( lossless),
reversibili sau fără zgomot (noiseless).
Termenul text trebuie interpretat în sens larg. Este clar că un text poate fi scris în limbaj natural
sau poate fi generat de translatoare (aşa cum fac diverse compilatoare). Un text poate fi considerat
că o imagine (rezultată dintr-o scanare, aşa cum este cazul telefaxului) sau alte tipuri de structuri ce
furnizează date în fişiere liniare.
1.2. ALGORITMI ENTROPICI
Majoritatea surselor de informaţie din domeniul calculatoarelor şi al aplicaţiilor internet sunt
discrete. Pentru a descrie o sursă discretă fără memorie (SDFM) sunt necesare două mărimi:
alfabetul sursei şi probabilităţile de furnizare a fiecărui simbol:
; (1.2.1.)
13
Dacă numărul de simboluri este finit, sursa se numeşte discretă. Dacă la un moment dat se emite
sigur un simbol atunci sursa este completă. Sursa este fără memorie dacă evenimentele sk sunt
independente, adică furnizarea unui simbol la un moment dat nu depinde de simbolurile furnizate
anterior. Totalitatea simbolurilor unei surse formează alfabetul sursei. Orice succesiune finită de
simboluri, în particular un singur simbol, se numeşte cuvânt. Totalitatea cuvintelor formate cu un
anumit alfabet se numeşte limbaj.
Informaţia furnizată de un simbol al sursei este:
[biţi] (1.2.2)
Entropia este informaţia medie pe simbol sau, altfel formulat, este incertitudinea medie asupra
simbolurilor sursei S, sau informaţia medie furnizată de un simbol.
[bit/simbol] (1.2.3)
Noţiunea de informaţie trebuie legată şi de timp, întrucât, cel puţin din punct de vedere al
utilizatorului informaţiei, nu este indiferent dacă furnizarea unui simbol are loc într-o oră sau într-
un an. În acest sens, se defineşte debitul de informaţie al unei surse discrete.
Definiţie - Debitul de informaţie cantitatea medie de informaţie furnizată în unitatea de timp.
(1.2.4)
unde este durata medie de furnizare a unui simbol:
(1.2.5)
Definiţie: Redundanţa unei surse discrete de informaţie este diferenţa dintre valoarea maximă
posibilă a entropiei şi entropia sa:
R(S)= max{H(S)} - H(S) biti / simbol (1.2.6)
In cadrul compresiei se are în vedere sistemul de transmitere a informaţiei din figura 1.1.1.
Procesul de transformare a mesajelor sursei într-un mesaj codat se numeşte codare (coding sau
encoding, în engleza). Algoritmul care construieşte transformarea se numeşte codor (encoder, în
engleza). Decodorul realizează transformarea inversă, generând mesajul în forma sa originală.
Canalul se consideră fără erori, deci este canal fără perturbaţii. Alfabetul codului este, în
general, X={xk | k=1,2,...,D}. Pentru cazul compresiei sa va considera cazul binar.
14
Codificarea a apărut ca o necesitate de schimbare a formei de prezentare a informaţiei în scopul
prelucrării sau transmiterii acesteia. Codificarea poate fi uniformă (bloc), dacă se foloseşte aceeaşi
lungime a cuvintelor de cod, sau neuniformă (variabilă), când lungimea cuvintelor de cod nu este
constantă. Operaţia inversă codificării se numeşte decodificare, adică transformarea inversă ce
permite obţinerea formei iniţiale de reprezentare a informaţiei.
1.2.1. CODAREA BINARĂ HUFFMAN STATICĂ
Acest procedeu se bazează pe ideea de a partiţiona mulţimea mesajelor
sursei S = {s1, s2 ,..., sN} în submulţimile S0 şi S1 , astfel încât suma probabilităţilor
mesajelor incluse în S0 să fie cât mai apropiată de suma probabilităţilor
mesajelor incluse în S1. La rândul lor, submulţimile S0 şi S1 pot fi partiţionate în
submulţimile S00 şi S01 , respectiv S10 şi S11 astfel încât suma probabilităţilor
mesajelor incluse în cele patru submulţimi să fie cât mai apropiate posibil.
Procedeul se continuă în mod similar până când se obţin submulţimi ce conţin
un singur mesaj.
În felul acesta, pentru orice distribuţie a sursei S ce urmează a fi codată se
va obţine un cod compact, adică lungimi medii ale cuvintelor de cod ce nu mai
pot fi micşorate prin nici un alt
procedeu de codare.
Pentru ca partiţiile să satisfacă condiţiile menţionate, se procedează astfel:
1. Se ordonează mulţimea mesajelor sursei S în ordinea descrescătoare a
probabilităţilor, obţinându-se astfel mulţimea ordonată R0 = {s1, s2, …, sN} ,
cu p(s1) ≥ p(s2) ≥ … p(sN), cu schimbarea eventuală a indicilor mesajelor
pentru realizarea ordonării respective;
2. Se reunesc ultimele două mesaje (de probabilităţile cele mai mici) într-un
nou mesaj, notat cu r1, căruia i se alocă o probabilitate egală cu suma
probabilităţilor mesajelor componente.
Se ordonează din nou mesajele în ordinea descrescătoare a
probabilităţilor, formându-se astfel prima sursă restrânsă R0 = {s1, s2,…,r1,…}
, cu p(s1) ≥ p(s2) ≥ … p(r1) ≥ ….
3. Se reunesc ultimele două mesaje din sursa restrânsă R1 într-un nou mesaj r2, de probabilitate
egală cu suma probabilităţilor mesajelor componente. Se ordonează mesajele în ordine
descrescătoare, formându-se astfel sursa restrânsă R2. În mod analog, din R2 se formează
sursa restrânsă R3 şi aşa mai departe, până când se obţine o sursă restrânsă formată numai
15
din două mesaje, Rn = {rn, rn-1}, cu p(rn) ≥ p(rn-1). De fapt, rn va fi S0 şi rn-1 va fi S1 sau
invers.
Din modul de formare a surselor restrânse Ri, rezultă că mulţimea S a mesajelor poate fi
partiţionată în două submulţimi rn şi rn-1 astfel încât probabilităţile p(rn) şi p(rn-1) sunt cele
mai apropiate posibil. La rândul lor, submulţimile rn şi rn-1, pot fi partiţionate în alte două
submulţimi, de probabilităţile cele mai apropiate posibil. Partiţionările se continuă până se
obţin submulţimi care conţin un singur mesaj.
4. Cuvintele de cod corespunzătoare fiecărui mesaj se obţin astfel:
- submulţimii rn i se alocă simbolul "0" (sau "1");
- submulţimii rn-1, i se alocă simbolul "1" (sau "0");
- la fiecare partiţionare se alocă arbitrar celor două submulţimi "0" sau "1", operaţia
continuându-se până se obţin submulţimi ce conţin un singur mesaj sk, k = .
Deoarece alocarea lui "0" şi "1" este arbitrară la fiecare partiţionare, rezultă că unei surse S i se
pot ataşa o multitudine de coduri instantanee, toate, însă, având aceeaşi lungime medie a cuvintelor
de cod, care nu mai poate fi micşorată prin nici un alt procedeu de codare a mesajelor luate
individual.
Dacă sursa primară S poate furniza N mesaje, atunci submulţimea restrânsă R1, va avea N-1
mesaje, submulţimea restrânsă R2 va conţine N-2 mesaje şi aşa mai departe, ultima submulţime
restrânsă Rn va conţine N − n mesaje, care sunt rn şi rn-1, adică se poate scrie:
N − n = 2 => n = N − 2 (1.2.1.1)
Dacă submulţimii rn i se alocă simbolul "0" şi submulţimii rn-1 simbolul "1", celor N-2
partiţionări putându-li-se aloca arbitrar "0" sau "1", rezultă un total de 2N−2 posibilităţi de codare.
Dacă, însă, submulţimii rn i se alocă simbolul "1", iar submulţimii rn-1 simbolul "0", mai rezultă 2N−2
posibilităţi de codare. Rezultă, deci, că prin acest procedeu de codare se pot realiza 2N−2 + 2N−2 = 2N−1
coduri instantanee, toate având toate aceeaşi lungime medie a cuvintelor de cod.
Prin definiţie, se numeşte cod compact, codul care realizează lungimea medie minimă a
cuvintelor de cod. Deoarece prin procedeul de codare Huffman se obţine cea mai mică lungime
medie a cuvintelor de cod, înseamnă că prin acest procedeu se obţin coduri instantanee compacte.
Evident, un cod absolut optimal este şi compact, reciproca nefiind totdeauna valabilă [9].
16
Exemplu: MARIA ARE MERE
a. b. c.
Figura 1.2.1.1. Procedeul de codare Huffman
1.2.2. CODAREA BINARĂ SHANNON – FANO
Acest procedeu se aplică de obicei în cazurile particulare în care probabilităţile de furnizare ale
mesajelor sunt puteri întregi pozitive ale lui (1/2), adică, de forma:
p(sk)= , (1.2.2.1)
unde lk este un număr întreg pozitiv.
Dacă relaţia (1.2.2.1) este satisfăcută, mulţimea S = {s1, s2 ,..., sN} a mesajelor sursei discrete de
informaţie ce urmează a fi codată poate fi partiţionată în două submulţimi S0 şi S1, astfel încât suma
probabilităţilor mesajelor incluse în S0, notată cu p(S0), să fie egală cu suma probabilităţilor
mesajelor incluse în S1, notată cu p(S1). Sursa S fiind totdeauna completă, se poate scrie:
(1.2.2.2)
Submulţimile S0 şi S1 se pot partiţiona la rândul lor în S00 şi S01, respectiv în S10 şi S11, astfel
încât suma probabilităţilor mesajelor incluse în cele patru submulţimi să fie aceeaşi, adică se poate
scrie relaţia:
p(S00) = p(S01) = p(S10) = p(S11) = (1.2.2.3)
Se procedează în mod analog până se obţin submulţimi care conţin un singur mesaj. Se observă
că fiecare submulţime are suma probabilităţilor mesajelor incluse egală cu o putere întreagă a lui
(1/2). Puterea întreagă este egală cu numărul indicilor submulţimii respective Dacă submulţimea
conţine un singur mesaj, sk, şi are un număr de indici egal cu lk, atunci se poate scrie:
(1.2.2.4)
17
de unde rezultă necesitatea ca sursa S ce urmează a fi codată să-şi furnizeze mesajele cu
probabilităţi egale cu 1/2 la o putere întreagă, pozitivă.
Sursa fiind completă, se poate scrie:
(1.2.2.5)
Înlocuind (1.2.2.4) în (1.2.2.5), rezultă:
(1.2.2.6)
Cuvintele de cod se vor obţine, atunci, astfel:
1. Se atribuie simbolul "0" submulţimii 0 S şi simbolul "1" submulţimii 1 S , (sau invers), astfel
că toate cuvintele corespunzătoare mesajelor incluse în S0 vor începe cu "0" şi toate
cuvintele corespunzătoare mesajelor incluse în S1 , vor începe cu "1" (sau invers);
2. Se alocă submulţimilor S00 şi S10 ca al doilea mesaj "0", iar submulţimilor S01 şi S11 ca al
doilea mesaj "1" (sau invers). În felul acesta, cuvintele de cod corespunzătoare mesajelor
incluse în S vor începe cu 00, cuvintele de cod corespunzătoare
mesajelor incluse în S10 vor începe cu 10 şi aşa mai departe, cuvintele
de cod corespunzătoare mesajelor induse în S11 vor începe cu 11.
3. Operaţia se continuă în acelaşi mod, până când în fiecare submulţime
rămâne un singur mesaj, căruia îi va corespunde cuvântul de cod
format din şirul de indici ai submulţimii respective.
Deoarece la fiecare partiţionare în două submulţimi atribuirea mesajelor
"0" şi "1" este arbitrară, rezultă că prin acest procedeu se pot obţine o
multitudine de coduri instantanee, dar toate absolut optimale.
În principiu, procedeul de codare descris s-ar putea aplica în general,
adică şi atunci când relaţia (1.2.2.6) nu este satisfăcută. În acest caz,
partiţionările în submulţimi trebuie efectuate astfel încât suma
probabilităţilor mesajelor incluse în submulţimile respective să fie cât mai
apropiate. Atribuind simbolurile "0" şi "1" ca în procedeul descris, se obţin
totdeauna coduri instantanee.
Cu cât sumele probabilităţilor mesajelor componente ale submulţimilor
respective vor fi mai apropiate, cu atât lungimea medie a cuvintelor de cod
va fi mai mică [14].
18
a. b. c. d.
Figura 1.2.2.1. Procedeul de codare Shannon – Fano
1.2.3. CODAREA BINARĂ HUFFMAN DINAMICĂ (ADAPTIVĂ)
Procedeul de codare binară Huffman descris anterior necesită cunoaşterea probabilităţilor cu
care sursa îşi furnizează mesajele. În literatura de specialitate această situaţie este cunoscută şi sub
denumirea de codare Huffman statică. În cazul în care probabilităţile de furnizare a mesajelor nu
sunt cunoscute, se foloseşte codarea Huffman dinamică sau adaptivă.
În descrierea codării Huffman dinamice sau adaptive se vor folosi următoarele notaţii şi noţiuni:
- Nodurile terminale sau externe din graful arborescent se vor numi frunze, corespunzând
mesajelor sursei;
- Cuvântul de cod pentru un mesaj se obţine parcurgând arborele de la rădăcină la frunza
corespunzătoare simbolului. Prin convenţie, zero se va aloca unei ramuri din stânga şi unu,
unei ramuri din dreapta;
- Nodurile de la extremităţile ramurilor care pleacă dintr-un nod reprezintă fiii sau copiii
nodului respectiv, numit nod părinte;
- Ponderea unui nod extern este numărul de apariţii a simbolului corespunzător frunzei
respective până la acel moment;
- Ponderea unui nod intern este suma ponderilor fiilor nodului respectiv;
- Dacă sursa ce urmează a fi codată furnizează n mesaje, în graf există 2n+1 noduri interne şi
externe, numerotate în continuare y1, …,y2n+1. Dacă xj este ponderea nodului cu numărul yj,
trebuie să existe relaţia x1 ≤ x2 ≤ …≤ x2n+1 ;
- Nodurile y2j−1 şi y2j sunt fii ai aceluiaşi nod părinte, iar numărul de ordine al părintelui este
mai mare decât y2j−1 şi y2j.
Ultimele două caracteristici se numesc de fraternitate şi orice arbore care are această proprietate
este un arbore Huffman. În codarea Huffman dinamică, nici emiţătorul, nici receptorul nu cunosc
statistica sursei la începerea transmisiei, astfel încât arborii de la transmisie şi recepţie constau
dintr-un singur nod corespunzător mesajelor încă netransmise, de pondere zero. Pe parcursul
transmisiei, nodurile corespunzătoare mesajelor transmise sunt adăugate arborelui, care este
19
reconfigurat pe baza unui procedeu de actualizare. Înaintea începerii transmiterii se stabileşte un
cod pentru fiecare mesaj, după cum urmează:
Dacă sursa furnizează mesajele s1, s2, ..., sN, se determină parametrii e şi r, astfel încât N =
2e + r, 0 ≤ r < 2e. Mesajul sk este codat prin reprezentarea pe e +1 biţi a lui k −1, dacă 1≤ k ≤ 2r, în
caz contrar, sk este reprezentarea pe e biţi a lui k − r −1. De exemplu, pentru N = 26→r =10 şi e =
4→s1 = 00000, s2 = 00001,..., s22=1011.
1.2.4. COMPRESIA ARITMETICĂ
Cea mai eficientă metodă entropică de compresie a datelor care elimină
aproape complet redundanţa unei surse de informaţie este compresia
aritmetică.
Algoritmul de compresie. Compresia aritmetică a fost descoperită de
către cercetătorii Peter Elias, Jorma J. Rissanen şi Richard C. Pasco. Ideea care
stă la baza acestei metode de compresie este aceea de codifica un şir de
simboluri folosind un singur cod şi nu câte un cod pentru fiecare simbol în
parte. De fapt, orice şir de simboluri generat de o sursă de informaţie este
codificat
folosind un număr real cuprins în intervalul [0, 1).
Datorită faptului că această metodă de compresie este entropică avem
nevoie de probabilităţile pi (0 i < m, unde m este numărul de simboluri pe
care le poate genera o sursă de informaţie S) de apariţie ale simbolurilor.
Similar algoritmului Huffman se pot construi variantele statică, semi-statică
şi dinamică ale algoritmului de compresie aritmetică.
În cazul variantei semistatice probabilităţile se calculează pe baza
simbolurilor generate de sursa de informaţie S, fiind nevoie de două parcurgeri
ale şirului de simboluri la fel ca în cazul algoritmului Huffman.
Considerăm un interval [a, b) [0, 1), b > a. Fiecărui simbol care poate fi
generat de o sursă de informaţie S i se ataşează un subinterval al lui [a, b) cu
proprietatea că lungimea subintervalului corespunzător unui simbol este direct
proporţională cu probabilitatea de apariţie a simbolului respectiv şi oricare
două subintervale corespunzătoare la două simboluri distincte nu au puncte de
intersecţie.
Fie Pi probabilitatea cumulată a simbolului Ai, P0 = 0 şi Pi = p0 + ...+ pi-1, 0
i < m, şi fie l = b - a lungimea intervalului [a, b). Din faptul că suma tuturor
20
probabilităţilor de apariţie ale simbolurilor Ai, 0 i < m este 1, rezultă că Pi
[0, 1).
Fiecărui simbol Ai i se va ataşa intervalul [a + l · Pi , a + l · (Pi + pi)).
Lungimea subintervalului corespunzător unui simbol Ai este egală cu l · pi.
În cazul în care o sursă de informaţie nu generează toate simbolurile pe care
le poate genera, atunci probabilitatea de apariţie a unor simboluri poate fi 0
deci, lungimea subintervalelor ataşate simbolurilor care nu sunt generate este
0, caz în care avem intervale degenerate, şi, dacă pi este 0 şi pi+1 este diferit de
0, atunci intersecţia dintre subintervalele corespunzătoare celor două simboluri
este diferită de mulţimea vidă şi nu mai sunt respectate condiţiile enunţate mai
sus. Dacă se elimină subintervalele de lungime 0, atunci condiţiile sunt
respectate.
Algoritmul de compresie aritmetică se bazează pe acest ă împărţire a unui
interval.
Faptul că avem intervale degenerate nu va influenţa funcţionalitatea
algoritmului, deoarece o sursă de informaţie nu va genera niciodată simboluri
care au probabilitatea de apariţie 0.
Algoritmul de codificare constă în alegerea unui subinterval al intervalului
[0, 1) corespunzător primului simbol generat de o sursă S şi apoi, ca nou
interval se consideră subintervalul ales şi se alege subintervalul corespunzător
celui de-al doilea simbol.
Algoritmul de compresie aritmetică folosit pentru a codifica un şir de
simboluri generat de o sursă de informaţie S este următorul:
1. considerăm intervalul care are extremitatea din stânga a şi lungimea l;
2. fie pi probabilităţile de apariţie ale simbolurilor care pot fi generate de o
sursă de informaţie S;
3. fie Pi probabilităţile cumulate ale simbolurilor;
4. pentru fiecare simbol Ai generat de sursa de informaţie S execută:
- a a + l · Pi;
- l l · pi;
5. rezultat a + l / 2.
În ciclul repetitiv prezentat anterior se schimbă intervalul iniţial cu
subintervalul corespunzător simbolului generat de sursa de informaţie S.
21
Datorită faptului că intervalele ataşate simbolurilor care au probabilitatea de
apariţie diferită de 0 sunt disjuncte, fiecare simbol este unic determinat de
orice număr care aparţine subintervalului corespunzător.
În teorie se foloseşte ca interval iniţial intervalul [0, 1), deci cu capătul din
stânga 0 şi lungimea 1.
După parcurgerea şirului de simboluri generat de o sursă de informaţie se
transmite un număr real din intervalul [0, 1) care reprezintă codificarea şirului
de simboluri. Numărul real trebuie transmis cu o precizie foarte mare. Acest
număr este dat, de obicei, de mijlocul ultimului interval calculat cu ajutorul
algoritmului prezentat anterior: a + l/2.
Algoritmul de codificare mai poate fi construit folosind limitele inferioară şi
superioară ale unui interval în locul limitei inferioare şi lungimii intervalului. În
acest caz, după linia în care se calculează lungimea intervalului se adaugă linia
b a + l.
Dacă intervalul iniţial este [0, 1), atunci precizia cu care trebuie calculată
limita din stânga pentru un simbol cu probabilitatea pi, 0 i < m, este de -log2
pibiţi.
Dacă analizăm modul de construire al numărului real plecând de la
intervalul [0; 1), atunci precizia cu care trebuie transmis numărul care
reprezintă mijlocul ultimului interval calculat este de biţi,
unde n reprezintă numărul de simboluri generate de sursa S.
Se poate observa foarte uşor că diferenţa dintre entropia şirului generat de
sursa de informaţie S şi numărul mediu de biţi necesari transmiterii unui simbol
este foarte mică (mai mică de 1 bit).
De exemplu, fie o sursă de informaţie S care poate genera simbolurile 'a', 'b'
şi 'c' cu probabilităţile 1/2, 1/4 şi 1/4.
În figura 1.2.4.1. se poate observa modul de codificare a şirului de simboluri
'abac'. Precizia cu care trebuie transmis rezultatul este de 7 biţi (rezultatul este
0,3046875 = 0,01001112 ceea ce înseamnă că se transmit biţii 0100111,
deoarece numărul este cuprins între 0 şi 1 şi ne interesează doar porţiunea
care se află după virgulă).
22
Figura 1.2.4.1. Procesul de codificare aritmetică
Pe lângă rezultatul obţinut în urma codificării mai trebuie transmis
dicţionarul care este format din probabilităţile de apariţie ale simbolurilor care
pot fi generate de sursa de informaţie S.
Motivul pentru care rezultatul îl reprezintă mijlocul ultimului interval
calculat, şi deci o creştere a preciziei cu un bit, este acela că în practică există
situaţii în care reprezentarea în baza 2 a celor două limite ale intervalului,
folosind aceeaşi precizie, sunt egale pentru că microprocesoarele existente
realizează operaţii cu numere reale cu o precizie finită de până la 80 de biţi.
Din punct de vedere teoretic este suficient ca rezultatul să fie constituit de
limita inferioară a ultimului interval găsit, calculată cu precizia de biţi,
deoarece, bazându-ne pe cele enunţate anterior, un simbol căruia i s-a ataşat
intervalul [a, b) este unic determinat de orice număr real care aparţine
intervalului.
Algoritmul de decompresie. Pentru a decodifica un număr real, cuprins
între 0 şi 1, a cărui lungime în biţi se cunoaşte, trebuie să avem probabilităţile
de apariţie ale simbolurilor care au fost folosite în procesul de codificare şi
numărul total n al simbolurilor care au fost codificate.
23
Figura 1.2.4.2. Procesul de decodificare aritmetică
La începutul procesului de decodificare considerăm intervalul [a, a + l),
unde a = 0 şi l = 1. Fiecărui simbol îi corespunde un subinterval al acestui
interval.
În continuare se caută subintervalul căruia îi aparţine numărul care trebuie
decodificat. După ce s-a găsit acest subinterval se transmite simbolul
corespunzător acestuia şi noul interval devine cel găsit. Acest pas se execută
până în momentul în care am decodificat n simboluri.
Dacă nu se transmite numărul n de simboluri care au fost codificate, în
momentul compresiei alfabetul sursei S de informaţie se poate extinde cu un
simbol suplimentar care are semnificaţia de sfârşitul codificării care se va
codifica după ce sursa S nu mai generează simboluri. În concluzie, în momentul
în care numărul se va afla în subintervalul corespunzător simbolului de sfârşit
de codificare, decodificarea se va încheia.
În figura 1.2.4.2. se poate observa modul de decodificare a numărului
0,3046875 pentru alfabetul format din simbolurile 'a', 'b' şi 'c', care au
probabilităţile 1/2, 1/4 şi 1/4, şi numărul de simboluri care au fost codificate n
= 4.
La primul pas se observă că numărul rez aparţine subintervalului [0, 0,5),
subinterval corespunzător simbolului 'a', deci acest simbol se va transmite şi
noul interval va deveni [0, 0,5).
24
La al doilea pas numărul rez aparţine subintervalului [0,25, 0,375) care
corespunde simbolului 'b', acest simbol se va transmite şi noul interval este
[0,25, 0,375).
La al treilea pas numărul rez aparţine subintervalului [0,25, 0,3125) care
corespunde simbolului 'a', acest simbol se va transmite şi noul interval este
[0,25, 0,3125).
La al patrulea pas numărul rez aparţine subintervalului [0,296875, 0,3125)
care corespunde simbolului 'c', acest simbol se va transmite şi noul interval
este [0,296875, 0,3125). În acest moment se încheie procesul de decodifica
decodificare deoarece au fost decodificate n = 4 simboluri. În timpul
decodificării a fost transmis şirul de simboluri 'abac'.
Detalii de implementare. Datorită faptului că pentru date de dimensiuni
mari precizia cu care trebuie transmis rezultatul devine foarte mare,
calculatoarele nu deţin resurse suficiente pentru a efectua operaţii cu numere
reale cu precizie mare. De exemplu, există situaţii când trebuie folosită o
precizie de 8 · 105 biţi sau chiar mai mare, în timp ce calculatoarele moderne
au o precizie de cel mult 128 de biţi. În acest caz, algoritmii prezentaţi anterior
nu se pot utiliza în practică.
Toate implementările performante ale acestui algoritm nu utilizează operaţii
cu numere reale, ci folosesc operaţii cu numere întregi reprezentate pe 16 sau
32 de biţi pentru a evita erorile de calcul care apar când se efectuează operaţii
cu numere reale reprezentate în virgulă mobilă. În unele implementări, cele
două operaţii de înmulţire, care apar în algoritmii prezentaţi, au fost înlocuite
cu adunări şi deplasări pe biţi. Cu toate că s-a obţinut o scădere a timpului de
execuţie pentru date de dimensiuni mari, aceşti algoritmi nu mai codifică
informaţia la fel de eficient. În practică se folosesc implementări ale algoritmilor
de codificare şi decodificare mult mai performante bazate pe folosirea
noţiunilor de aritmetică legate de modul de calcul folosind baze de numeraţie
puteri ale lui 2 (de obicei se lucrează în bazele 28 sau 216) în funcţie de tipul
de calculator şi sistem de operare pe care se va folosi programul de
compresie/decompresie.
Compresia aritmetică se foloseşte în combinaţie cu alte metode şi se obţine
o reducere considerabilă a conţinutului unui fişier sau a datelor transmise
printr-o reţea de
25
calculatoare (internet, reţea locală etc.).
Această metodă de compresie a datelor nu este foarte răspândită deoarece
compania IBM deţine patente de inventator asupra câtorva algoritmi
performanţi de compresie aritmetică.
Majoritatea programelor de compresie bazate pe codificarea aritmetică
folosesc modelul cvasi-aritmetic. În cadrul acestui model, probabilităţile
cumulate se recalculează în momentul în care cea mai mare dintre probabilităţi
atinge o valoare prag Prg, şi nu după fiecare simbol generat de o sursă de
informaţie. Acest lucru duce la o scădere a timpului necesar unui program de
compresie pentru a codifica un şir de simboluri [13].
1.3. ALGORITMI PE BAZĂ DE DICŢIONAR
Tehnicile de dicţionar ţin seama de structura datelor pentru a creşte volumul compresiei. Aceste
tehnici (atât cele statice, cât şi cele dinamice) se bazează pe construcţia unei liste cu cele mai
frecvente structuri care apar, numite modele, şi le codează prin transmiterea unui cuvânt care indică
poziţia lor în listă. Aceste metode de codare sunt utile pentru surse care generează un număr mic de
modele cu frecvenţă ridicată, cum sunt textele şi comenzile de calculator.
În multe aplicaţii ieşirea unei surse este formată din secvenţe de mesaje care formează modele
care se repetă. Un exemplu clasic este un text în care anumite expresii sau cuvinte (modele) revin
constant, în timp ce alte modele apar foarte rar. Esenţa codării pe bază de dicţionar constă în
întocmirea unei liste cu cele mai frecvente modele, acestea fiind codate prin indicarea poziţiei lor în
listă, cunoscută sub numele de index. Astfel, intrarea în codor se împarte în două părţi:
- cu modele cu apariţie frecventă;
- cu modele cu apariţie rară.
Pentru ca această tehnică să fie eficientă, clasa modelelor frecvente şi, implicit, mărimea
dicţionarului, trebuie să fie mult mai mică decât numărul total de modele.
De exemplu, dacă se presupune existenţa a 32 de caractere (litere şi semne de punctuaţie) şi se
codează caracterele individual, fiecare fiind egal probabile, ar fi necesari 5 biţi/caracter. Dacă se
presupun modele formate din 4 caractere, ar rezulta 324=2048576 modele, necesitând 20 biţi/model.
Dacă se presupune că 256 de modele sunt mai frecvente, acestea se grupează într-un dicţionar.
Pentru codarea fiecărui model din cele 256 sunt necesari 8 biţi. Pentru transmiterea unui model care
există în dicţionar, se va transmite un bit de semnalizare (fie acesta 0), urmat de un index de 8 biţi,
26
care identifică cuvântul din dicţionar. Dacă cuvântul nu este în dicţionar se trimite un bit de
semnalizare (fie acesta 1), urmat de 20 de biţi care codează modelul. Dacă modelul nu este în
dicţionar, se trimit mai mulţi biţi decât în schema originală (adică 21 în loc de 20), iar dacă este în
dicţionar, se transmit 9 biţi în loc de 20.
Eficienţa tehnicii depinde de procentul cuvintelor care se află în dicţionar. Dacă probabilitatea
unui model din dicţionar este p şi, evident, 1-p este probabilitatea ca modelul să nu fie în dicţionar,
atunci numărul mediu de biţi/model este
R=9p+21(1-p)=21-12p (1.3.1)
Pentru ca schema de codare să fie eficientă, R trebuie să fie mai mic decât 20, ceea ce se
întâmplă pentru p ≥ 0,08(3). Dacă toate modelele ar fi egal probabile, probabilitatea fiecăruia este
de aproximativ 0,00025.
În practică se doreşte o rată cât mai mică, ceea ce conduce la condiţia ca p să fie cât mai mare.
Aceasta înseamnă că modelele trebuie selectate atent dintre cele mai frecvente, ceea ce impune o
bună cunoaştere a structurii sursei.
În funcţie de cunoştinţele disponibile pentru construcţia dicţionarului, se poate folosi o codare
statică sau una dinamică.
Tehnica de codare bazată pe dicţionar static este potrivită când sunt disponibile cunoştinţe a
priori despre sursă.
O tehnică de dicţionar static este codarea digram. Dicţionarul este format din toate literele
alfabetului sursei şi cele mai frecvente perechi de două litere, numite digrame. De exemplu, se
presupune că s-a construit un dicţionar de mărime 256, format din 95 caractere ASCII şi 161
digrame care sunt cele mai frecvent utilizate perechi de două caractere. Se codează apoi cele 256 de
modele pe 8 biţi corespunzând celor 95 de caractere ASCII şi celor 161 de digrame. Dacă se
doreşte codarea unei secvenţe de caractere ASCII se citesc primele două caractere din secvenţă şi
se caută dacă există în dicţionar. Dacă da, indexul digramei este codat şi transmis. Dacă nu, primul
caracter al perechii este transmis prin codul corespunzător indexului caracterului, iar al doilea
caracter devine primul caracter al digramei următoare. Codorul mai citeşte un caracter pentru a
completa digrama şi procedura se repetă.
Exemplu:.
Fie sursa cu alfabetul S={a, b , c, d, r} . Pe baza cunoaşterii sursei, se construieşte dicţionarul
din Tabelul 1.3.1.
Tabelul 1.3.1. Formarea dicţionarului
27
Se presupune că se doreşte a coda secvenţa a b r a c a d a b r a.
Deoarece digrama ab este în dicţionar, aceasta se codează cu 101, apoi se citeşte ra, care nu
există în dicţionar, se codează r cu 100, apoi se citeşte ac, care se codează cu 110. Continuând, se
obţine: 101 100 110 111 101 100 000.
Dacă s-ar transmite pentru fiecare din cele 11 simboluri ale sursei câte 3 biţi (deoarece sunt 5
simboluri diferite), ar rezulta 33 biţi. Prin folosirea acestui dicţionar s-au transmis 7⋅3 = 21
simboluri.
Tabelul 1.3.2. Cele mai frecvente 30 de perechi de caractere dintr-un document de 41.364
caractere
Pereche Număr de
apariţii
Pereche Număr de
apariţii
eb 1128 ar 314
bt 828 at 313
bb 823 bw 309
th 817 te 296
he 712 bs 295
in 512 db 272
sb 494 bo 266
er 433 io 257
ba 425 co 256
tb 401 re 247
en 392 b$ 246
on 385 rb 239
nb 353 di 230
ti 322 ic 229
bi 317 ct 226
Tabelul 1.3.3. Cele mai frecvente 30 de perechi de caractere dintr-un program C de 65.983
caractere
28
Continuarea Tabelului 1.3.3.
Se observă că cele două tabele sunt foarte diferite. Este uşor de observat că un dicţionar
proiectat pentru compresia documentelor LATEX nu va fi foarte eficient pentru compresia unui
program C, putând conduce la o extensie în loc de compresie.
Frecvent se doreşte a se dispune de tehnici de compresie care să fie capabile să comprime
ieşirea mai multor tipuri de surse, fără cunoaşterea prealabilă a statisticii sursei. Pentru asemenea
aplicaţii se folosesc tehnici de adaptare a dicţionarului la caracteristicile sursei.
Există două tehnici de dicţionar adaptiv, LZ77 şi LZ78, care se datorează lui Jacob Ziv şi
Abraham Lempel, pe care se bazează cele mai multe metode de compresie cu dicţionar adaptiv[14].
1.3.1. ALGORITMUL LZ77
În metoda LZ77 dicţionarul este o porţiune din secvenţa codată anterior. Codorul examinează
secvenţa de intrare printr-o fereastră glisantă, care constă din două părţi:
- un buffer de căutare, care conţine o porţiune din secvenţa tocmai codată;
- un registru care conţine următoarea porţiune a secvenţei ce urmează a fi codată.
În Figura 1.3.1.1, se consideră pentru simplitate că bufferul conţine 8 simboluri, iar registrul, 7,
în practică acestea fiind mult mai mari.
29
Pentru codarea secvenţei din registru, codorul mută un pointer de căutare înapoi prin buffer,
până găseşte începutul celei mai lungi asemănări cu începutul secvenţei stocate în registru. Distanţa
dintre pointer şi registru se numeşte offset. Numărul simbolurilor consecutive din bufferul de
căutare şi din registru care coincid cu simbolurile din registru, începând cu primul caracter se
numeşte lungimea secvenţei sau a asemănării. Dacă în registru mai există coincidenţe între
caracterele deja codate şi cele ce urmează a fi codate, începând cu primul caracter din registru,
lungimea secvenţei se poate prelungi în acesta. Odată găsită această lungime, codorul codează
secvenţa cu tripletul <o,l,c> , unde o – offsetul, l – lungimea şi c – cuvântul de cod corespunzător
simbolului din registru la care s-a oprit asemănarea.
Figura 1.3.1.1. Procedeul codării algoritmului LZ77
Pentru exemplul din Figura 1.3.1.1. o= 7, l= 4, c= 4. Motivul transmiterii celui de-al treilea
element din triplet este de a evita situaţia când simbolul din registru nu este în buffer. În acest caz o
= 0, l = 0 şi c este codul simbolului însuşi.
Dacă mărimea bufferului de căutare este S , mărimea ferestrei W şi mărimea alfabetului sursei
este A, numărul de biţi necesari codării unui triplet este [log2S]+[log2W]+log2A]. Al doilea este
[log2W], şi nu [log2W-S],deoarece lungimea asemănării poate depăşi dimensiunea bufferului de
căutare.
În exemplul următor sunt evidenţiate situaţiile în care:
- nu există nici o potrivire a caracterului ce urmează a fi codat în fereastră;
- există potrivire;
- secvenţa potrivită se extinde şi în registru.
Fie secvenţa c a b r a c a d a b r a r r a r r a d… care se codează cu metoda prezentată anterior.
Se presupun S=7, W=13. Poziţionarea iniţială a secvenţei în fereastră este dată în Fig. 1.3.1.2.
Secvenţa din bufferul de căutare se transmite în clar.
Figura 1.3.1.2. Poziţionarea iniţială a secvenţei în fereastră pentru LZ77
Pentru nu se găseşte nici o asemănare în bufferul de căutare şi se transmite <0,0,c(d)>. Fereastra
se deplasează cu o poziţie, ca în Figura 1.3.1.3.
30
Figura 1.3.1.3. Deplasarea ferestrei cu o poziţie pentru căutarea unei asemănări
Căutând în buffer, se găseste potrivire cu a la un offset de 2 (cu l=1), de 4 (l=1) şi de 7, când
lungimea asemănării este 4. Se transmite tripletul <7,4,c(r)> . Se mută fereastra cu 5 caractere, care
reprezintă lungimea asemănării (l=4) + caracterul codat în clar c(r), ca în Figura 1.3.1.4.
Figura 1.3.1.4. Deplasarea ferestrei cu l+1 poziţii pentru căutarea unei noi asemănări
Acum se găseşte o asemănare pentru r la o=1 (l=1) la o=3 (l=3) în buffer, dar prelungind
căutarea şi în registru se obţine lungimea asemănării l=5 şi se transmite <3,5,c(d)> . În acest caz
fereastra se mută cu 6 caractere.
Decodarea. Se presupune că s-a decodat secvenţa c a b r a c a şi s-au recepţionat tripletele
<0,0,c(d)>, <7,4,c(r)>, <3,5,c(d)> . Primul triplet este simplu de decodat, nu există nici o asemănare
în secvenţa decodată şi următorul simbol este d. Secvenţa decodată este acum:
Figura 1.3.1.5. Decodarea primului triplet
Primul element din al doilea triplet este 7, care spune unde se plasează pointerul şi apoi se copie
4 caractere din acel punct.
Figura 1.3.1.6. Decodarea celui de-al doilea triplet
31
Secvenţa decodată este c a b r a c a d a b r a r. În final se decodează ultimul triplet. Se merge
înapoi cu 3 poziţii şi se copie 5 caractere începând cu acel punct.
Figura 1.3.1.7. Decodarea ultimului triplet
Se observă că asemănarea începe numai în bufferul de căutare, dar se poate extinde şi în
registru. Dacă ultimul caracter din registru ar fi fost r în loc de d, urmat de mai multe repetări de r
a r, întreaga secvenţă de r a r -uri ar fi putut fi codată cu un singur triplet.
Algoritmul LZ77 este o schemă adaptivă foarte simplă, care nu necesită cunoaşterea a priori a
sursei. Autorii algoritmului au arătat că performanţa algoritmului tinde asimptotic la cel mai bun
rezultat ce poate fi obţinut folosind o schemă care cunoaşte în întregime statistica sursei.
În practică există modalităţi de îmbunătăţire a performanţelor algoritmului LZ77. Cea mai
simplă modificare a algoritmului LZ77 şi una dintre cele mai folosite este de a elimina folosirea
unui triplet pentru a coda un singur caracter, ceea ce este foarte ineficient, în special când există un
număr mare de caractere care apar rar. Modificarea pentru eliminarea acestei ineficienţe este de a
adăuga un bit de semnalizare (flag) care să indice dacă ceea ce urmează este cuvânt de cod pentru
un singur simbol. Folosind acest flag, se elimină necesitatea celui de-al treilea element din triplet.
Rămâne de transmis o pereche de valori corespunzătoare offsetului şi lungimii. Acest algoritm este
cunoscut sub denumirea de LZSS.
Dintre arhivatorii uzuali care folosesc algoritmul LZ77, urmat de o codare cu lungime variabilă
sunt PKZip, Zip, LHarc, ARJ [14].
1.3.2. ALGORITMUL LZ78
Algoritmul LZ77 a presupus implicit că modele asemănătoare apar apropiate unele de altele,
folosind această structură a secvenţei stocate în buffer ca dicţionar pentru codare. Aceasta înseamnă
că orice model care apare pe o durată mai mare decât fereastra codorului, nu va fi captat. Cea mai
defavorabilă situaţie este cea în care secvenţa de codat este periodică, cu perioada mai mare decât
bufferul de căutare.
Alegerea lungimii bufferului se face în funcţie de statistica datelor ce urmează a fi codate.
Pentru exemplificare, se presupune că secvenţa de caractere are perioada 9, aşa cum se arată în
Figura 1.3.2.1.
32
Figura 1.3.2.1. Procedeul codării algoritmului LZ78
În situaţia considerată bufferul are lungimea 8, astfel încât nici un nou simbol nu se potriveşte
cu vreunul din buffer şi va fi reprezentat separat. Cum aceasta implică transmiterea mai multor
simboluri (1 bit de flag pentru LZSS şi un triplet pentru LZ77), rezultatul este o extensie, în loc de
compresie. Dacă, însă, bufferul de căutare era mai lung cu o celulă, secvenţa era comprimată
semnificativ.
Deşi aceasta este o situaţie extremă, sunt circumstanţe mai puţin drastice în care mărimea
limitată a bufferului de căutare ar putea constitui un dezavantaj. Algoritmul LZ78 rezolvă această
problemă, prin renunţarea la bufferul de căutare şi întocmirea unui dicţionar explicit. Acest
dicţionar trebuie construit atât la emisie cât şi la recepţie în acelaşi mod. Intrarea este codată cu un
dublet <i,c>, unde:
i - este indexul corespunzător apariţiei în dicţionar;
c – este codul caracterului ce urmează după secvenţa găsită în dicţionar.
Indexul 0 se foloseşte în cazul negăsirii vreunei asemănări. Fiecare nouă apariţie în dicţionar
este un nou simbol concatenat cu o apariţie deja existentă în dicţionar.
Exemplu: Să se codeze secvenţa d a b b a b/ d a b b a b/ d a b b a b/ d a b b a b/ d u u b/ d u u
b/ d u u. În secvenţa considerată caracterul b/ semnifică spaţiu. Iniţial dicţionarul este gol. Primele
trei ieşiri ale codorului, până la repetarea unuia din caracterele deja codate, sunt codate cu valoarea
indexului egal cu 0, astfel: <0,c(d)>, <0,c(a)>, <0,c(b)> .
Dicţionar iniţial este
Index apariţie
1 d
2 a
3 b
al patrulea simbol este b, care este al treilea element din dicţionar. Dacă se adaugă următorul
simbol, se obţine ba, care nu este în dicţionar, aşa încât se codează aceste 2 simboluri ca <3, 2> şi
se adaugă ca al patrulea element în dicţionar. Continuând astfel, se obţine dicţionarul din Tabelul
1.3.2.1.
Tabelul 1.3.2.1. Formarea dicţionarului aplicând algoritmul LZ78
33
Se observă că apariţiile din dicţionar devin din ce în ce mai lungi şi dacă acestea se repetă des,
(cum se întâmplă într-un cântec, de exemplu) după un timp, întreaga secvenţă ar putea fi o apariţie
în dicţionar.
Deşi algoritmul LZ78 are abilitatea de a capta modele şi de a le păstra, el are şi dezavantaje
serioase. Cum se vede din exemplu, dicţionarul poate creşte oricât de mult. În practică se doreşte
creşterea dicţionarului până la un anumit moment şi apoi fie simplificarea, fie tratarea lui ca un
dicţionar fix.
1.3.3. ALGORITMUL LZW
Cea mai cunoscută modificare a algoritmului, cunoscută sub numele de varianta LZW, este
făcută de Welch, care a propus o tehnică care înlătură necesitatea de codare a celui de-al doilea
element al perechii < i,c> . Pentru aceasta, dicţionarul trebuie încărcat cu toate literele alfabetului
sursei. În timpul codării are loc şi completarea dicţionarului, astfel: după ce se citeşte prima literă,
al cărei “model”, fie acesta m, se găseşte în dicţionar, se concatenează aceasta cu cea de-a doua
literă, fie aceasta a, pentru a forma un nou model, m*a (* - concatenare). Acest model nu se
găseşte în dicţionar, aşa că se codează m cu indexul din dicţionar şi se adaugă modelul m*a în
dicţionar, la indexul care urmează literelor alfabetului iniţial. Se începe apoi un nou model cu litera
a. Cum aceasta este în dicţionar, se concatenează cu următoarea literă din secvenţa de codat, fie
aceasta b, pentru a forma modelul a*b care se trece în dicţionar la indexul următor, şi aşa mai
departe. Dacă în procesul de completare a dicţionarului se ajunge la un model deja existent în
dicţionar, se concatenează acesta cu caracterul următor, pentru a forma un nou model care se înscrie
în dicţionar şi procesul continuă în acelaşi mod.
În general, dacă prin adăugarea unei litere, a, la un model existent, m, rezultă modelul m*a care
nu este în dicţionar, atunci indexul lui m este transmis la receptor, modelul m*a este adăugat la
dicţionar şi se începe un alt model cu litera a.
34
Se foloseşte aceeaşi secvenţă utilizată în exemplul anterior: d a b b a b/ d a b b a b/ d a b b a b/
d a b b a b/ d u u b/ d u u b/ d u u şi se codează cu algoritmul LWZ. Se presupune că alfabetul
sursei este {b/, a, b, d, u } şi dicţionarul iniţial este dat în Tabelul 1.3.3.1.
Tabelul 1.3.3.1. Exemplu de dicţionar iniţial pentru codarea LWZ
Codorul întâlneşte întâi litera d. Acest “model” este în dicţionar, aşa că se concateneaza cu litera
următoare formând da. Acest model nu este în dicţionar, aşa că se codează d cu indexul 4 din
dicţionar, se adaugă modelul da în dicţionar la indexul 6 şi se începe un nou model plecând de la
litera a. Cum a este în dicţionar, se concatenează următorul simbol b, pentru a forma modelul
ab, care nefiind în dicţionar, se introduce la indexul 7 şi se începe construcţia unui nou model cu
litera b. Se continuă în acest mod, construind modele de 2 litere până se întâlneşte litera d în a doua
secvenţă d a b b a. În acest moment, ieşirea din codor constă în întregime din indici ai dicţionarului
iniţial, adică 4 2 3 3 2 1 (la a 12-a apariţie în dicţionar). Următorul simbol este a care, concatenat cu
d, conduce la modelul da care este în dicţionar la poziţia 6, aşa că se citeşte următorul simbol, b,
obţinând modelul dab care nu este în dicţionar şi se include la poziţia 12 şi se începe un nou model
de la b. De asemenea, se codează da cu 6. Lungimea apariţiilor în dicţionar creşte pe măsură ce
are loc codarea. Cu cât apariţiile în dicţionar sunt mai lungi, cu atât dicţionarul captează mai mult
din structura secvenţei. Dicţionarul complet pentru codarea secvenţei din exemplu este dat în
Tabelul 1.3.3.2.
Tabelul 1.3.3.2. Exemplu de dicţionar complet pentru codarea LZW
35
Secvenţa codată este:
4 2 3 3 2 1 6 8 10 12 9 11 7 16 4 5 5 11 21 23 5
Decodarea. Se va decoda secvenţa anterioară, care este intrarea în decodor. Decodorul
porneşte cu acelaşi dicţionar iniţial ca şi codorul. Indexul 4 corespunde literei d, aşa că se
decodează prima literă din secvenţă şi, pentru a simula codorul, se construieşte următorul
element din dicţionar, după cum urmează: Se începe cu prima literă decodată d, care există în
dicţionar, aşa că aceasta nu se mai adăugă. Următoarea intrare este 2, care corespunde lui a. Se
decodează a şi se concatenează cu d, pentru a forma da, al şaselea element care se adaugă în
dicţionar. Următorul model va începe cu a. Următoarele patru intrări 3 3 2 1 corespund literelor
b b a b/ şi generează modelele ab, bb, ba şi ab/ care se trec în dicţionar. Următoarea intrare este
6, care este indexul pentru da şi, prin urmare, se decodează un d şi un a. Întâi se concatenează d
la modelul existent, b/ , şi se formează b/ d. Cum acesta nu există în dicţionar, se introduce la
poziţia 11. Noul model va începe cu d. Anterior s-a decodat a care, concatenat cu d, a dat da,
care este în dicţionar, aşa că se decodează următoarea intrare, care este 8, corespunzător lui bb.
Se decodează primul b şi se concatenează la modelul da pentru a obţine dab, la poziţia 12, apoi
se începe un nou model cu litera b. Decodând al doilea b şi concatenându-l la noul model,
rezultă modelul bb, care există în dicţionar, aşa că se decodează următorul element din secvenţă.
Procedeul se continuă în mod similar, până la decodarea întregii secvenţe, pe bază
dicţionarului construit arătat în Tabelul 1.3.3.3.
Tabelul 1.3.3.3. Procedeul de decodare LZW
Index Apariţie Index Apariţie Index Apariţie
1 b/ 9 a 18 abb
2 a 10 a b/ 19 ba b/ d
3 b 11 b/ d 20 uu
4 d 12 dab 21 uu
5 u 13 bba 22 u b/
6 da 14 a b/ d 23 b/ du
7 ab 15 dabb 24 uu b/
8 bb 16 ba b/ 25 b/ duu
17 bda
Decodorul LZW trebuie să conţină o operaţie de excepţie pentru a rezolva cazul particular al
decodării unui index care nu are o apariţie completă în dicţionarul decodorului [14].
36
Exemplu de codare LZW: MARIA ARE MERE
Tabelul 1.3.3.4. Exemplu de codare LZW [11]
a.
b.
c.
37
CAPITOLUL 2. COMPRESIA FIŞIERELOR DE UZ GENERAL
2.1 WinRAR
WinRAR este versiunea de 32 biţi a arhivatorului RAR pentru Windows – un instrument
puternic care permite de a crea, gestiona şi controla fişierele arhivelor. Există mai multe versiuni de
RAR, pentru diverse medii: Windows, Linux, FreeBSD, DOS, OS/2, MacOS X [18].
Există două versiuni de RAR pentru Windows :
- Versiune cu o interfaţă grafică – WinRAR.exe;
- Versiune linie de comandă (mod text) – RAR.exe.
Caracteristicile aplicaţiei WinRAR:
- Suport complet a arhivatorilor RAR şi ZIP 2.0;
- Super-puternic, algoritm de compresie specific;
- Algoritmi speciali optimizaţi pentru compresia de texte, audio, grafice, execuţii
32biţi şi 64 biţi Intel.
- Interfaţă de mediu incluzând facilitatea de a rula-plasa şi un asistent;
- Interfaţă pentru linia de comandă;
- Gestionarea altor arhive decât RAR (7Z, ACE, ARJ, BZ2, CAB, GZ, ISO, JAR,
LZH, TAR, UUE, Z) ;
- Arhivare „solidă” a cărei rată de compresie e mărită de la 10% pînă la 50% în raport
cu metodele obişnuite. (O arhivă „solidă” este o arhivă compactă cu o metodă specială de
compresie, care prelucrează toate fişierele în arhivă printr-un flux de date continuu.
Arhivele „solide” sunt suportate doar de formatul de arhivare RAR, această metodă nu e
suportată de arhivele ZIP.);
- Arhive multivolum;
- Crearea arhivelor cu auto-extragere (chiar şi multi-volum) utilizând modulele SFX
prin eroare sau în opţiune;
- Recuperarea arhivelor defectate;
- Recuperarea volumelor reconstruind părţile lipsă a arhivelor multi-volum;
- Alte funcţii de serviciu, precum criptarea, comentariile arhivelor, revista de erori, etc.
Numărul fişierelor ce poate fi adăugat la o arhivă depinde de cantitatea memoriei disponibile şi
de lungimea numelor fişierelor. Fiecare fişier arhivat într-o arhivă RAR consumă aproximativ 128
octeţi din memorie. De exemplu, este recomandat de avut 128 Mo dacă aveţi de compresat un
milion de fişiere. WinRAR a fost testat cu mai mult de 1 milion de fişiere.
38
Mărimea unei arhive RAR sau a unui fişier de arhivat într-o arhivă RAR, este limitată la 8 589
934 591 Go (9 223 372 036 854 775 807 octeţi). Remarcaţi că pentru a crea arhive mai mari de 4
Go, trebuie să utilizaţi NTFS, căci sistemele vechi nu suportă fişiere aşa mari.
Mărimea unei arhive ZIP sau a unui fişier de arhivat într-o arhivă ZIP, este limitat la 2 Go.
În general, formatul unei arhive RAR este cu mult mai performant pentru sarcini dificile ce
necesită un foarte mare număr de fişiere ce ocupă mulţi giga-octeţi pe disc.
2.2 WinZIP
WinZip permite de a utiliza fişiere ZIP şi alte formate de compresie beneficiind de utilizarea
flexibilă a sistemului Windows [20].
Câteva din funcţionalităţile lui WinZip:
1. Integrare transparentă în Windows: WinZip se integrează perfect în postul de lucru şi de
Exolorare Windows. E posibil de a utiliza funcţia Rulează/Deplasează fişierului între WinZip şi
Explorator sau de a compresa şi a decompresa fişierele direct în Explorator.
2. Internet: WinZip integrează o sarcină de formate de fişiere din cele mai curente de pe
Internet: RAR, BZ2, BZ, TBZ, TBZ2, TAR, gzip, UUencode, XXencode, BinHex et MIME. Mai
mult, programele externe asigură acceptarea fişierelor ARJ, LZH şi ARC. WinZip permite accesul
practic la toate fişierele compresate şi codate ce pot fi descărcate de pe Internet.
3. Instalarea automată a majorităţii programelor soft distribuite în fişierele Zip: dacă o
arhivă conţine un program de configurare sau de instalare, funcţia de instalare a WinZip permite de
a decompresa fişierele, de a lansa programul de instalare şi de a şterge fişierele temporare.
4. Asistent WinZip: această funcţie ca opţiune utilizează interfaţa standard şi familiară a
„asistenţilor” pentru a simplifica compresia, decompresia şi instalarea programelor distribuite sub
forma de arhive Zip. Asistentul WinZip se adresează utilizatorilor calculatoarelor personale care
descoperă arhivele Zip, de asemenea şi utilizatorilor ocazionali.
5. Dosarele preferate Zip: WinZip oferă posibilitatea de a organiza arhivele Zip sub forma
unei liste selectate pe dată, care facilitează localizarea lor, independent de locul lor de provenienţă
sau de destinaţie. Spre deosebire de fereastra de dialog standardă de Deschidere a arhivei, fereastra
de dialog Dosare Zip favorizează tratarea conţinutului mai multor dosare ca şi când ar fi un singur
dosar. O funcţie de căutare permite localizarea tuturor arhivelor Zip împrăştiate pe hard disc.
6. Suport extins de fişiere: WinZip preia formatul de fişier Zip &4biţi, ceea ce elimină toate
restricţiile practice legate de mărimea arhivelor, de asemenea si de numărul şi mărimea fişierelor
compresate într-o arhivă. Capacitatea de arhivare nu este limitată decât de resursele sistemului.
39
7. Criptare avansată: tehnologia de criptare AES 128 biţi şi 256 biţi a lui WinZip nu permite
consultarea neautorizată a conţinutului documentelor.
8. Crearea de fişiere cu auto-extragere: WinZip Self-Extractor Ediţie personală este
furnizată cu WinZip. Fişierele cu auto-extragere sunt idealul pentru a expedia fişiere compresate
cuiva care nu utilizează sau nu vrea sa utilizeze nici un program de compresie.
9. Zip şi E-mail: WinZip permite compresia fişierelor sau a mapelor şi de a le trimite, prin
poşta electronică.
WinZip© 11.1 este versiunea cea mai recentă (WinZip 11.0) şi e compatibilă cu Windows
Vista®. În afara funcţionalităţilor introduse în WinZip 11.0, WinZip 11.1:
este certificat pentru Windows Vista;
conţine o bară de instrumente şi de icon-uri de program Vista;
conţine o interfaţă de stilul Explorator Vista;
este compatibil cu Windows Vista şi XP 64 biţi, de asemenea şi cu Windows Vista,
XP şi 2000 32 biţi.
2.3. 7-Zip FILE MANAGER
7-Zip File Manager este un program pentru manipularea fişierelor şi mapelor [15].
Tabelul 2.3.1. Formatele suportate (compatibile) ale aplicaţiei 7-ZIP
Format Compressing Decompressing Filename Extensions7z X X 7z
ZIP X X zipGZIP X X gz gzip tgzBZIP2 X X bz2 bzip2 tbz2 tbzTAR X X tar
LZMA X lzmaRAR X rarCAB X cabARJ X arj
Z X z tazCPIO X cpioRPM X rpmDEB X debLZH X lzh lha
SPLIT X 001 002 ...CHM X chm chw hxs
Continuarea tabelului 2.3.1.ISO X iso
40
UDF X isoCOMPOUND X msi doc xls ppt
WIM X wim swmDMG X dmgXAR X xarHFS X hfsNSIS X exe
2.3.1. ZIP
7-Zip creează arhive compatibile în întregime cu Zip. Orişicine poate decompresa aceste fişiere
cu orice aplicaţie compatibilă Zip de decompresie. Pe parcursul compresiei 7-Zip poate utiliza una
din următoarele metode de compresie Zip:
0 - Store
8 - Deflate
9 - Deflate64
12 - BZip2
Versiunea curentă 7-Zip poate extrage orice fişier din arhiva Zip care sunt compresate cu una
din următoarele metode:
0 - Store
1 - Shrink
Implode
8 - Deflate
9 - Deflate64
12 - BZip2
Fişierele compresate cu alte metode de compresie Zip pot fi extrase de versiunea curentă a lui 7-
Zip. Dar aceste metode suportate sunt mai populare, de aceea 7-Zip poate decompresa marea
majoritate a arhivelor Zip. Pentru a extrage fişiere compresate cu metode ce nu sunt suportate de 7-
Zip va trebui de utilizat aplicaţii Zip.
7-Zip suportă extensia Zip64 a formatului ZIP.
Versiunea curentă 7-Zip nu susţine arhivele Zip multi-volum.
LZH. 7-Zip e compatibil cu arhivele LZH doar pentru citire, vizualizare şi decompresie. 7-Zip
acceptă metodele -lh0-, -lh4-, -lh5-, -lh6- şi -lh7.
2.3.2. FORMATUL 7z
7z este un nou format de arhivă, asigurând producerea unei rate înalte de compresie.
41
Principalele caracteristici ale formatului 7z:
Arhitecturi deschise
Rată înaltă de compresie
Criptare puternică AES-256
Abilitate de a utiliza orice metodă de compresie, conversie sau criptare
Suportă fişiere cu mărimea de până la 16000000000 GB
Fişiere cu nume Unicode
Compresie “solidă”
Compresia header-ilor arhivelor
7z este o arhitectură deschisă (cu acces liber), deci poate suporta orice metodă nouă de
compresie.
Tabelul 2.3.2.1. Metodele integrate curent în 7z
Metoda Descriere
LZMA Ameliorarea şi optimizarea versiunii algoritmului LZ77
PPMD PPMdH creat de Dmitry Shkarin cu mici modificări
BCJ Convertor pentru 32-bit x86 executabil
BCJ2 Convertor pentru 32-bit x86 executabil
BZip2 Algorithm standard BWT
Deflate Algorithm standard bazat pe LZ77
2.3.3. LZMA
LZMA este metoda implicită şi generală de comprimare a formatului 7z.
Principalele caracteristici ale metodei LZMA:
Rată înaltă de compresie
Mărime variabilă a dicţionarului (până la 4 GB)
Viteză de compresie: în jur de 1 MB/s pe 2 GHz CPU
Viteză de decompresie: în jur de 10-20 MB/s pe 2 GHz CPU
Necesită volum mic de memorie pentru decompresie (depinde de mărimea dicţionarului)
Mărime mică a codului de decompresie: în jur de 5 KB
Suportă procese multiple şi hiper-procese.
Algoritmul de compresie LZMA este foarte potrivit pentru aplicaţii. Dacă se doreşte utilizarea
codului LZMA, se poate cere pentru consultare codul de program adaptat, şi se poate cere licenţe
de developer de la www.7-zip.org/support.html.
2.4. POWER ARCHIVER 2009
42
PowerArchiver 2009 are o interfaţă modernă şi ergonomică si suportă practic toate formatele de
compresie şi de codare, de asemenea şi multe instrumente şi opţiuni avansate. Se presupune că
PowerArchiver 2009 este programul de arhivare cel mai complet la ziua de azi [19].
PowerArchiver 2009 conţine toate opţiunile de bază ce sunt aşteptate de la o aplicaţie de
arhivare – permite citirea şi extragerea în mai multe formate, de asemenea şi crearea arhivelor în
mai multe formate, în particular cu 7-zip care este cel mai puternic la momentul actual. Ceea ce
diferenţiază PowerArchiver faţă de aplicaţiile similare ţine de numeroasele sale opţiuni. Mai simplu,
PowerArchiver este o aplicaţie din cele mai inovatoare, şi multe funcţii ce operează în alte
programe soft au apărut cu PowerArchiver, ca extensia Shell, managerul parolei şi codarea
avansată, convertorul de arhivă, instrumentul de extragere multiplă, integrarea FTP, suportul
puternic SFX şi multe alte instrumente ce facilitează sarcina pe tot parcursul aplicaţiei. Nu este
gratuită această aplicaţie.
2.5. COMPARAREA EFICIENŢEI PROGRAMELOR DE ARHIVARE
Numerele în tabela de mai jos sunt date în scopul de comparare şi sunt aproximative[16]. Datele
în % sunt % de la “dimensiunea fişierelor compresate în comparaţie cu dimensiunea fişierelor
necompresate”: cu cât procentul este mai mic, cu atât mai bună e compresia.
Tabelul 2.5.1. Compararea eficienţei programelor de arhivare
Name Text %Text time
(s)Binaries %
Binaries time (s)
Raw images %Raw images time
(s)7-zip 19 18.8 27 59.6 50 36.4bzip2 20 4.7 37 32.8 51 20.0rar (2.01) 23 30.0 36 275.4 58 52.7advzip 24 21.1 37 70.6 57 41.6gzip 25 4.2 39 23.1 60 5.4zip 25 4.3 39 23.3 60 5.7
43
CAPITOLUL 3. COMPRESIA FIŞIERELOR DIGITIZATE
3.1. COLECŢIILE DIGITALE – O NOUĂ POSIBILITATE DE ACCES LA
INFORMAŢIE
Barierele de spaţiu şi timp în căutarea informaţiei au fost eliminate în era Internetului.
Obiectivul accesului universal la moştenirea culturală poate fi îndeplinit dacă avem în vedere
tehnologia actuală care permite construirea colecţiilor comprehensive.
În ziua de azi, majoritatea publicaţiilor sunt scrise, corectate şi aranjate în pagină cu ajutorul
calculatorului, cu procesoare de texte şi programe de tehnoredactare. Chiar şi versiunea tipărită are
la baza o versiune electronică. Exista numeroase publicaţii electronice multimedia care grupează
diferite tipuri de informaţie pe acelaşi suport, de exemplu o biografie, o bibliografie, fotografii,
imagini animate, video si sunet.
Resursele de informare ce sunt accesate intr-o bibliotecă tradiţională pot fi transpuse în formate
digitale stocate în depozite multimedia şi făcute disponibile prin servicii web.
Resursele digitale pot fi împărţite în doua mari categorii:
- documente care au fost publicate şi există deja pe suport material, ce au fost sau trebuie
digitizate, care formează patrimoniul cultural ştiinţific existent;
- documente care există şi/sau numai în format electronic („born digital”- născute electronic),
care se publică în prezent şi în formă digitală sau numai în formă digitală.
Deci publicaţiile electronice pot fi publicaţii electronice originale sau versiunea digitizată a unui
document scris sau tipărit.
Unii dintre producătorii şi editorii de publicaţii electronice sunt editorii de publicaţii clasice care
îşi diversifică astfel activitatea. Există şi furnizori noi de informaţii electronice care iau naştere
special pentru a oferi asemenea documente. Este cazul editorilor de publicaţii noi în web care nu se
găsesc decât on-line.
Tehnologia a ajuns în punctul în care sunt nu numai fezabile colecţiile digitale, dar sunt mai
puţin costisitoare decât cumpărarea şi stocarea versiunilor materiale, pe suport fizic - hârtie etc.
Conform definiţiei din dicţionarul ODLIS (Online Dictionary for Library and Information
Science) colecţia digitală este o colecţie de documente dintr-o bibliotecă sau arhivă convertite în
format citibil maşină (calculator) pentru conservare sau pentru a oferi acces electronic. Aceasta
include ziare electronice (e-zine), reviste electronice (e-journals), cărţi electronice (e-book), lucrări
de referinţă, baze de date bibliografice, alte resurse web.
Bibliotecile digitale au diverse definiţii care cuprind atât documente tipărite care devin
accesibile electronic prin transformarea lor în format digital, prin digitizare, cât şi materiale născute
44
în format electronic-digital. Convenţional, exista două posibilităţi: o bibliotecă care conţine material
în formă digitizată şi o bibliotecă care conţine material digital.
Bibliotecile digitale trebuie să se integreze şi să extindă bibliotecile tradiţionale. Ele trebuie să
fie mai mult decât portaluri cu motoare de căutare. Ca orice bibliotecă, trebuie să ofere posibilităţi
de selecţie a resurselor care îndeplinesc criteriile relevante misiunilor sale şi trebuie să ofere
servicii, inclusiv de căutare, care să faciliteze utilizarea resurselor de câtre comunitatea ţintă.
Trebuie sa fie colaborativă, permiţând utilizatorilor să contribuie activ cu cunoştinţe, fie prin
adnotări, review-uri (referate, articole de sinteză), sau pasivă oferind doar posibilitatea de acces la
resurse. În plus, trebuie să fie contextuală, exprimând extinderea web-ului inter-relaţional şi a
nivelelor de cunoştinţe care se extind de-a lungul resurselor primare.
Datorită creării bibliotecilor digitale, cercetările universitare s-au accelerat dramatic, fără a mai
exista limitarea accesului la documentul fizic. În aproape toate bibliotecile, digitizarea este
considerată ca o expunere a colecţiilor sub o alta înfăţişare, ce asigură o funcţionalitate mărită,
comoditate - posibilitatea accesului la documente de acasă, anumite considerente legate de
conservare, agregarea colecţiilor care sunt dispersate fizic şi o considerabilă extindere a accesului.
Începând din anii 90, o activitate experimentată pe scară largă a fost aceea de a concepe proiecte
de realizare a bibliotecii digitale, în special în SUA. Este perioada primei generaţii a bibliotecilor
digitale. Cheltuielile făcute în ultimii 10 ani pentru biblioteci digitale a depăşit câteva sute de
milioane de dolari. Unele fonduri pentru cercetarea în acest domeniu au provenit de la diverse
organizaţii guvernamentale, ca de exemplu în SUA, de la Digital Library Initiatives (DLI).
În 1994, Library of Congress anunţă planul sau de a crea National Digital Library, iar National
Science Foundation (NSF) alături de National Aeronautics and Space Administration (NASA) şi
Defence Advanced Research Projects Agency (DARPA) anunţă că sprijină Digital Libraries
Initiative, un efort de cercetare în care erau implicate câteva mari universităţi pentru a studia
bibliotecile digitale. Scopul era de a oferi acces universal la moştenirea culturală.
Cele mai importante progrese în ceea ce priveşte tehnicile implicate în asemenea proiecte au
fost făcute prin intermediul cercetărilor sponsorizate de U.S. National Science Foundation (NSF) şi
U.K. Joint Information Systems Committee (JISC). În 1999, aceste proiecte au început sa se extindă
internaţional, când NSF a legat programul său de cercetare în biblioteca digitală de activităţile
similare desfăşurate de JISC, rezultând JISCNSF International Digital Library Initiative.
Obiectivele acestui program de 3 ani a fost:
- adunarea colecţiilor de informaţii care nu sunt accesibile sau utilizabile altfel, din cauza
barierelor tehnice, distanţei, mărimii, structurii fragmentare sau alte limitări;
45
- crearea noii tehnologii şi punerea informaţiei la dispoziţia unui set de utilizatori distribuiţi,
pentru ca aceasta să fie furnizată şi exploatată;
- evaluarea impactului noii tehnologii şi a beneficiilor sale internaţionale.
Numeroase instituţii, organisme, organizaţii, grupuri s-au implicat în dezvoltarea tehnicii şi
tehnologiei digitale, inclusiv Uniunea Europeană, Association for Computing Machinery (ACM),
Institute of Electrical and Electronics Engineers (IEEE), International Federation of Library
Associations (IFLA), American Library Association (ALA), Coalition for Networked Information
(CNI) şi Digital Library Federation (DLF).
Aproape toate bibliotecile îşi declara intenţia de a conserva înlocuitorii digitali pe care îi
creează, iar Biblioteca Congresului s-a angajat şi la conservarea înlocuitorilor creaţi de alte
biblioteci, sub auspiciile programului Bibliotecii Digitale Naţionale. Din ce în ce mai multe
universităţi şi-au pus problema legată de “scholarly communication”, adică crearea, publicarea şi
accesul la informaţia academică, şcolară, curentă, care trece printr-o serioasă criză.
Conform ACRL (Association of College & Research Libraries), “scholarly communication”
este sistemul prin care cercetările şi alte scrieri academice sunt create, evaluate din punct de vedere
al calităţii răspândite în comunitatea academică şi conservate pentru utilizări viitoare. Una din
caracteristicile de bază ale acestor cercetări este ca sunt create ca bunuri publice pentru a facilita
cercetarea şi cunoaşterea. Criza actuală în acest domeniu are la bază faptul că firmele comerciale au
preluat controlul asupra revistelor academice din domeniul ştiinţific, tehnic şi medical.
Industria publicării acestor reviste s-a consolidat şi este dominată de un număr mic de companii
internaţionale. De aceea, preţul revistelor a crescut foarte mult, bibliotecile au fost nevoite sa reducă
numărul titlurilor abonate sau cărţilor cumpărate. În plus, a crescut şi cantitatea informaţiei
academice. Toate acestea au avut ca efect reducerea accesului la învăţământ. Au apărut o serie de
preocupări de rezolvare a acestei crize, iar în acest sens ACRL a definit o serie de principii si
strategii pentru a reforma comunicarea ştiinţifică („Principles and Strategies for the Reform of
Scholarly Communication”). Din ce în ce mai mult, această informaţie este pusă la dispoziţia
cercetătorilor, profesorilor şi studenţilor în format electronic.
Marile companii care au un cuvânt de spus în industria calculatoarelor sau a Internetului au
demarat la concurenţă o serie de proiecte împreună cu marile biblioteci ale lumii. Compania Google
lucrează, în cadrul Google Print Library Project, la scanarea colecţiilor University of Michigan,
Harvard University, Stanford University, The New York Public Library şi Oxford University.
Intenţia era de a face aceste cărţi regăsibile prin Google.
Google a anunţat sponsorizarea proiectului World Digital Library (WDL) al Bibliotecii
Congresului. Şi în Europa există preocupări pentru realizarea resurselor digitale. Astfel, site-ul
46
European Library îşi propune să fie un portal al bibliotecilor naţionale europene şi găzduieşte
proiectul European Digital Library Treasures (http://www.theeuropeanlibrary.org/portal/index.
htm), unde se prezintă câteva din documentele de patrimoniu ale acestora.
În martie 2005, Parlamentul European a aprobat programul eContentplus
(http://europa.eu.int/information_society/activities/econtentplus/index_en.htm), un program
multianual care doreşte să facă conţinutul digital al Europei mai accesibil, mai utilizabil şi mai
exploatat. Va suporta conţinut multilingv şi un serviciu on-line în Europa. Programul se adresează
unei zone specifice a pieţei care se dezvoltă mai încet şi anume conţinutul geografic, ca şi
component al conţinutului sectorului public, conţinutul educaţional, cultural, ştiinţific şi şcolar.
Programul sprijină coordonarea largă europeană a colecţiilor din biblioteci, muzee, arhive şi
conservarea, păstrarea colecţiilor digitale ca să asigure utilizarea viitoare a bunurilor şcolare
culturale şi ştiinţifice.
În marile universităţi ale lumii şi în din ce în ce mai multe universităţi chiar şi din Europa,
universităţile publică documentele destinate învăţământului în format electronic. Materialele
destinate studenţilor sunt accesibile pe baza de parole, în format electronic. Se dau examene prin
Internet, e-learning -ul este o realitate.
Biblioteci digitale locale, realizate de universităţi, institute de cercetare etc. sunt formate din
resurse electronice ca:
- e-books - cărţi full text (ale profesorilor, cercetătorilor)
- materiale didactice (cursuri, laboratoare, caiete de seminar, teste, întrebări-răspunsuri)
- articole de cercetare (preprinturi)
- reviste ştiinţifice
- conferinţe, congrese, seminarii
- anunţuri, programe, lucrările lor, prezentări, postere etc.
- date de cercetare ale unor contracte de cercetare
- înregistrări audio, video (ale marilor personalităţi din institutele respective)
- colecţii de imagini foto, desene, scheme etc.
În procesul de cercetare ştiinţifică, informaţia este resursa inestimabilă care ajută la progresul
omenirii. În acest proces, oamenii de ştiinţă se bazează pe surse de informare deja existente,
produse de omenire, dar, la rândul lor, produc documente ce pot contribui la progresul ştiinţei, la
informarea altor cercetători, profesori, studenţi.
Apariţia bibliotecii digitale reflectă dezvoltarea învăţământului la distanţă (e-learning),
alternativa virtuală a şcolii tradiţionale. Populaţia studenţească este tot mai mult îndepărtată de
campusul universitar pentru o alternativa de e-learning de-a lungul vieţii (“life long learning”).
47
Biblioteca trebuie să se dezvolte astfel ca să răspundă noii paradigme educaţionale pe măsură ce
cititorii caută noi cai pentru a regăsi mai uşor resursele de informare oriunde şi oricând. Se impune
stabilirea rolurilor, responsabilităţilor bibliotecilor şi ale altor instituţii în furnizarea accesului
publicului la acest noua tip de informaţie - informaţia digitală [7].
3.2. FORMATELE UZUALE ALE FIŞIERELOR SCANATE
Formatul în care o imagine scanată este salvată poate avea un efect semnificativ, iar mărimea
fişierului are o importanţă deosebită, daca ţinem cont de rezoluţia scannerelor moderne, care pot
crea un fişier imagine pentru un format A4 de 30 MB.
Formate de tip imagine
Când captăm o imagine cu un aparat foto sau cu un scanner, aceasta trebuie memorată într-un
„format de fişier”. Dacă informaţia binară este privită ca vehicul de comunicare, formatul de fişier
poate fi asemuit cu limbajul, sau vehiculul acestei comunicări. Informaţia poate fi citită şi înţeleasă
numai dacă programul recunoaşte formatul respectiv. Imaginile pot fi salvate în diverse formate.
Cele mai frecvent utilizate sunt:
- .jpg – Joint Photographic Experts Group
- .tif – Tagged Image File Format
- .psd – Photoshop Document
- .gif – Graphics Interchange Format.
JPEG - Standardul Industrial pentru compresia imaginilor fotografice cu tonuri continue,
pregătite pentru a fi afişate pe World Wide Web sau pentru a fi stocate atunci când spaţiul este
limitat.
Formatul JPEG foloseşte o „compresie cu pierderi” (datele şi calitatea imaginii sunt sacrificate
pentru a obţine fişiere mai mici atunci când fişierele-imagine sunt închise). Utilizatorul poate
controla valoarea compresiei. Un nivel ridicat de compresie rezultă într-o calitate mai mică a
imaginii şi un fişier de dimensiuni mai mici. Un grad scăzut de compresie conduce la imagini de
calitate mai bună, dar fişierul este mai mare. Se recomandă de folosit formatul de fişier JPEG numai
după ce se finisează de editat imaginea.
TIFF - standardul industrial pentru imaginile destinate publicării (reviste, cărţi etc.) utilizează o
tehnica de compresie „fără pierderi” (nu se pierd date şi nu scade calitatea imaginii) numită
„compresie LZW”. Deşi păstrează calitatea imaginii, tehnica LZW comprimă doar în mică măsură o
imagine.
Photoshop - un format standard utilizat de majoritatea programelor de prelucrare a imaginii. O
imagine compusă din straturi (layers) poate fi salvată ca document Photoshop. Un document
48
Photoshop este păstrat, de obicei, ca fişier de referinţă, din care deriva toate celelalte fişiere, în
funcţie de necesităţile impuse de dispozitivul de afişare.
Imaginea de fereastră (BMP - Windows bitmap) este cea mai mare, deoarece imaginea este
înregistrată cu toate culorile fără compresia acestora sau în 256 culori prin-o simplă comprimare a
codurilor de rulare. În cele mai multe cazuri trebuie evitat acest format.
Formatul GIF înregistrează imagini folosind culoarea indexată. 256 de culori sunt disponibile în
fiecare imagine. Un tabel al valorilor RGB pentru fiecare index al culorilor este înregistrat în
fişierul imagine. GIF este mai mic decât alte formate de fişier, deoarece intensitatea culorii este
scăzută, făcând o alegere bună în folosirea materialului pe Internet.
Trecerea de la formatul de tip imagine la formatul text se face cu ajutorul unui program de
recunoaştere de text. Unul dintre cele mai prietenoase, eficiente şi folosite programe de
recunoaştere de text este Abby Finereader.
Jaws for Windows este cel mai popular cititor de ecran pentru nevăzători. El permite acestora sa
folosească computerul în scopuri variate, de la instrument de lucru la locul de munca la mijloc de
recreare sau comunicare cu alţii.
În ceea ce priveşte stocarea documentelor şi compresia acestora se preferă utilizarea
programului DjVu şi a formatului PDF.
DjVu este o tehnologie de compresie a imaginilor optimizată pentru documentele scanate.
Cărţile în acest format sunt de 3 până la 8 ori mai mici decât echivalentul lor PDF.
Tehnologiile electronice actuale permit ca aceleaşi operaţii de stocare şi transmitere a
informaţiei să asigure o mai buna operativitate, flexibilitate, accesibilitate, adresabilitate, un mai
bun raport cantitate de informaţie transmisă/preţ. Suporturile de difuzare sunt CD-uri, dischete sau
Internetul, fiecare dintre ei având costuri foarte mici în raport cu hârtia tipărită.
Problemele privind depozitarea materialelor conservate şi prezervate digital sunt similare cu
cele privind digitizarea şi ridică semne de întrebare în ceea ce priveşte situaţiile financiare,
organizaţionale, tehnice şi legale [10].
3.3. DjVu: UN SISTEM DE COMPRESIE TIP IMAGINE PENTRU DISTRIBUIREA
DOCUMENTELOR NUMERICE
Un fişier DjVu reprezintă o pagină tipică a unei reviste în culori, scanată cu 300 dpi (dots per
inch) ce necesită 40-80 KB. Una din ideile esenţiale ale tehnologiei de compresie DjVu constă în
descompunerea imaginii într-un prim-plan ce conţine obiecte delimitate cu contururi evidenţiate
(text, figuri, scheme) şi un fundal ce conţine restul imaginii (fotografii, textura paginii). Pentru
compresia fiecărui plan pot fi utilizate diferite tehnici. Metodele uzuale de compresie a imaginilor
sunt concepute fie pentru imagini naturale conţinând puţine contururi (JPEG), fie imagini pentru
49
documente alb-negru, în întregime compuse din contururi puternic evidenţiate (Group 3,
MMR/Group 41, şi JBIG). Sistemul DjVu integrează două noi tehnici: JB2 şi IW44 pentru a
codifica diverse planuri [3].
Figura 3.3.1. Divizarea prim-plan/fundal [2]
Algoritmul de separare prim-plan/fundal produce 3 ieşiri: o mască în două nuanţe de rezoluţie
înaltă (în general de 300 dpi), o imagine color reprezentând fundalul cu o rezoluţie medie (în
general de 100 dpi), şi o structură care codifică culoarea obiectelor din prim-plan. Dacă un pixel al
măştii este zero, pixelul ce corespunde imaginii reconstruite ia culoarea extrasă a imaginii de fundal
în locul corespunzător, daca nu - ia o culoare definită de prim-plan.
Masca este codificată cu un nou algoritm de imagine în două nuanţe, numit JB2, care este de
fapt un descendent al propunerii originale a AT&T pentru standardul JBIG-2. algoritmul consta în
identificarea formelor individuale care compun imaginea şi de a le grupa în categorii similare.
Formele reprezentative a fiecărei clase sunt codificate utilizând o metodă similară standardului
JBIG. Fiecare pixel al formei este codificat cu ajutorul unei tehnici de codificare aritmetică adaptivă
numită ZP-Coder. Codificatorul aritmetic utilizează un context format de pixelii vecini transmişi 1 Un set de standarde pentru fax publicat de ITU-T în 1984. Grupa IV, faxuri extrem de specializate şi relativ scumpe pentru sisteme computaţionale concepute să utilizeze circuite digitale în vederea îmbunătăţirii calităţii şi a vitezei de transmitere, de la 64 kbps. Grupa IV, faxuri, de asemenea, este compatibilă cu grupa III şi se poate conecta la circuite analogice.
50
deja pentru a prezice valoarea pixelului ce trebuie codificat, şi pentru a transmite valoarea sa
utilizând un număr optimal de biţi. Formele, altele decât prototipul ce aparţine unei clase sunt
codificate utilizând un context mărit care include valoarea pixelilor formei prototipului. Aceasta
strategie reduce numărul de biţi utilizaţi, deoarece majoritatea pixelilor sunt similari pixelilor
formei prototipului. Foarte rar se cere reconstruirea exactă a imaginii originale, de aceea ratele de
compresie pot fi semnificativ mărite înlocuind aceste forme cu forma prototipului a căror diferenţe
sunt suficient de slabe pentru a fi sesizate. Poziţiile în care trebuie să fie afişate formele în imagine
sunt, de asemenea, codificate aritmetic. Codificatorul adaptiv ZP-Coder este foarte rapid şi
furnizează rate de compresie medii situate cu aproximare de 5% faţă de limita teoretică a lui
Shannon. În cazul când documentul conţine mai multe pagini, este avantajos de a construi un
dicţionar cu forme prototip partajate între pagini, şi un dicţionar propriu fiecărei pagini care conţine
forme care nu apar decât în pagina considerată. JB2 utilizează o metodă foarte rapidă pentru a face
aceasta.
Pentru imaginea de fundal, DjVu utilizează un algoritm de compresie wavelet, numit IW44, care
prezintă mai multe avantaje importante faţă de alte metode de compresie a imaginii naturale. În
primul rând, IW44 utilizează o transformată wavelet bazată pe metoda de „lifting” care e foarte
rapidă2. În al doilea rând această transformată este implementată în aşa mod încât ea necesită
multiplicare, bazându-se exclusiv pe adăugări şi decalaje. Aceasta reduce mult timpul de calcul. În
al treilea rând, structura datelor interne a imaginilor IW44 permite ameliorarea progresivă a
coeficienţilor wavelet pe măsura recepţiei lor, utilizând o cantitate de memorie proporţională
numărului de coeficienţi ne nuli (şi nu a numărului de pixeli). Această structură de date permite, în
orice moment, în timpul sau după transmitere, de a reconstrui un segment oarecare al imaginii, cu o
rezoluţie oarecare. Aceasta permite de a reconstrui doar o parte a imaginii afişate la ecran. În sfârşit,
tehnica de mascare prin proiectări succesive permite evitarea cheltuielilor de biţi pentru codificarea
regiunilor de pe fundal care sunt invizibile căci sunt acoperite de obiectele situate în prim-plan.
Algoritmul IW44 utilizează de asemenea ZP-Coder pentru codificarea finală a datelor.
Culoarea obiectelor din prim-plan poate fi codificată prin două metode diferite. Prima metodă
constă din identificarea unei culori unice pentru fiecare formă ce apare în mască, şi a o codifica cu
ajutorul lui ZP-Coder. Aceasta furnizează un cod foarte compact, dar necesită o segmentare aproape
perfectă, şi nu funcţionează decât dacă componentele din prim-plan sunt uniform colorate. A doua
metodă constă în utilizarea IW44 pentru codificarea unei imagini de rezoluţie foarte joasă (în
general de 25 dpi sau 1 p/mm). Interpretarea imaginii din prim-plan este exact simetrică celei de pe
2 Bell (T.C), Clearz (J.G.) et Witten (I.H), Text Compression, Prentice-Hall, 1990.
51
fundal: masca utilizează de bază „canalul Alpha” pentru a mixa imaginile de pe fundal şi cele din
prim-plan. A doua metodă este similară sugestiilor standardului MRC-T.443.
3.3.1. ALGORITMUL DE SEGMENTARE
Prima fază de segmentare prim-plan/fundal e bazată pe Câmpul Markov Causa bidimensional, a
cărui stări reprezintă prim-planul şi fundalul. Fiecare stare descrie local distribuirea pixelilor din
prim-plan sau fundal cu ajutorul unei gaussiene unice determinată de culoarea medie a pixelilor şi
variaţiile lor.
Această fază iniţială realizează de fapt o pre-segmentare pentru a selecta toate obiectele care ar
putea merita sa fie codificate în prim-plan. Drept consecinţă, unele părţi de contrast evidenţiat ale
fotografiilor sau unele urme (linii) ale imprimantei pot fi referite incorect categoriei obiectelor din
prim-plan. O succesiune de filtre euristice sunt apoi aplicate pentru a exclude obiectele care din
greşeală au fost clasificate pentru prim-plan [3].
Figura 3.3.1.1. Proiecţiile succesive converg către un punct de intersecţie a două subspaţii
convexe reprezentând (a) imagini de potrivire a imaginii iniţiale în afara măştii, şi (b) imagini
ale căror coeficienţi mascaţi wavelet sunt zero4.
Criteriile deciziilor implementate de către filtrul principal sunt bazate pe principiul Lungimii
Minimale a Descrierii (Minimum Description Length5). Acest principiu permite minimizarea
numărului de parametrii euristici pentru optimizarea manuală comparând sute de imagini de diferite
tipuri. Este suficient de ştiut dacă se preferă de codificat fiecare candidat ca obiect din prim-plan
sau de pe fundal. Costul codificării asociat fiecărei posibilităţi este obţinut adăugând costul
codificării parametrilor unui model generativ al imaginii compresate şi costul resturilor ce permit
3 Bazer (B.E.), An optimum method for two level rendition of continuous-tone pictures. In: Internal Conference on Communications 1973.4 Léon Bottou, Patrick Haffner, Paul G. Howard, Patrice Simard, Yoshua Bengio and Yann LeCun, High Quality Document Image Compression with DjVu, AT&T Labs, Lincroft, NJ, July 13, 1998
5 W. Niblack, J.Sheinvald, B. Dom and D. Steele, Unsupervised image segmentation using the minimum description length principle. In Proceedings of ICPR 92, 1992
52
reconstruirea imaginii iniţiale. Posibilitatea ce prezintă costul codificării minime este reţinută.
Codificarea unui candidat pe fundal necesită un model al imaginii de pe fundal. Codificarea unui
candidat ca obiect din prim-plan necesită un model al imaginii din prim-plan, un model al imaginii
de pe fundal situat sub obiectul din prim-plan şi un model al imaginii mască.
Modelul reţinut pentru imaginea de pe fundal presupune că culoarea fiecărui pixel este o medie
a pixelilor celor mai apropiaţi de pe fundal de deasupra şi din partea stângă a pixelului. Modelul
reţinut pentru imaginea din prim-plan presupune o culoare uniformă pentru obiect. Costul
codificării asociate modelului măştii este evaluat euristic pornind de la lungimea perimetrului
obiectului candidat. Modelul de pe fundal autorizează variaţiile continue caracteristice zonelor pe
care dorim să le conservăm pe fundal. Modelul din prim-plan favorizează obiectele bine mărginite
de culoare uniformă.
Cu toate ca s-ar putea dori modele ce ar reproduce mai fin caracteristicile algoritmilor de
codificare utilizaţi de DjVu, aceste trei modele oferă un bon compromis între timpul de execuţie şi
calitatea segmentării. Segmentarea completă a unei imagini color de 300 dpi (pagina unei reviste de
exemplu) are loc în aproximativ 3 secunde.
3.4. EFICIENŢA TEHNICII DE COMPRESIEI DjVu
Déjà vu a fost de la început conceput pentru a stoca imagini scanate conţinând texte sau desene
liniare. Tehnologia sa permite separarea textului de fundal, încărcare progresivă etc. Diferenţa între
DjVu şi PDF vizează în principal faptul că DjVu este de tip raster, iar PDF de tip vector. Acest
lucru înseamnă că un text în PDF poate fi mărit oricât fără alterarea calităţii, în timp ce mărirea
DjVu este limitată.
Trebuie de remarcat faptul că DjVu este un format proprietate şi realizarea de fişiere DjVu nu se
poate realiza decât cu aplicaţia producătorului, pe când PDF este format standardizat, nu este
dependent de proprietar şi este uşor de realizat chiar prin aplicaţii gratuite.
53
3.1sec/23k: masca (text, 23K) s-a încărcat 4.8sec/35K: fundalul e încă neclar
9.4sec/67K: Încărcarea s-a terminat.
Figura 3.4. Descărcarea fişierului printr-un modem de 56 K: decompresia progresivă mai
întâi a textului, apoi a fundalului cu o creştere continuă a calităţii [2]
54
3.4.1. REZULTATE: IW44 PENTRU IMAGINI NATURALE
Performanţa lui IW44 este tipică algoritmilor de compresie wavelet a imaginilor, dar a fost
optimizat pentru accelerarea vitezei de decodificare şi minimizarea memoriei utilizate, mai mult
decât pentru maximizarea compresiei. Spaţiul ocupat de o imagine IW44 este în general de la 30%
până la 50% mai mic decât cel al unei imagini JPEG la acelaşi raport semnal/zgomot.
Tabelul 3.4.1.1. prezintă raporturile semnal/zgomot obţinute cu IW44 pentru două imagini test
standard (lena şi goldhill), le compară cu JPEG şi cu alte metode wavelet: EZW, SPIHT şi EBCOT.
Pentru imaginea Lena, IW44 depăşeşte JPEG cu aproximativ 2 dB. IW44 depăşeşte de
asemenea EZW, dar este cu puţin mai puţin optimal faţă de SPIHT şi EBCOT. Aceasta e cauzat de
faptul că arhitectura lui IW44 şi filtrele de undă utilizate sunt optimizate în aşa fel încât să se obţină
o accelerare a vitezei de decodare.
Tabelul 3.4.1.1. Raportul semnal/zgomot obţinut cu diferite metode de compresie
Imagine IW44 JPEG EZW SPIHT EBCOTLenaLenaLena
33.6236.6139.67
31.6734.8437.94
33.1736.2839.55
34.1137.2140.46
34.2837.4340.61
GoldhillGoldhill
30.2532.56
29.2331.03
n/an/a
30.5633.12
n/an/a
3.4.2. REZULTATE: JB2 PENTRU IMAGINI ÎN DOUĂ NUANŢE
Un test independent de compresie „fără pierdere” al imaginilor alb-negru efectuat pe o largă
colecţie de documente a măsurat rata medie de compresie de 26.5 pentru JB2 v2.0. aceasta poate fi
comparată cu rate de 13.5 obţinută pentru MMR/Group 4 şi 19.4 pentru JBIG. Câştiguri mai
importante pentru imaginile ce conţin mult text şi mai mici pentru imaginile ce conţin mai multe
desene.
Tabelele 3.4.2.1.- 3.4.2.4. prezintă rezultatele obţinute de DjVu în două nuanţe şi le compară cu
MMR6/CCITT7-GroupIV. Ratele obţinute de DjVu v3.0. utilizat pentru mai multe pagini cu
dicţionar partajat sunt de 4.5 la 10 ori mai superioare decât MMR/G4. Mărimea medie a unei pagini
este de la 5 până la 11 kilo-octeţi, în funcţie de document.
Utilizând formatul PDF pentru documente alb-negru scanate obţinem mărimi similare ca
MMR/G4, deoarece PDF nu face decât încapsularea documentului MMR/G4 într-un format PDF.
Primele 6 documente din tabel sunt brevete. Documentul Nisp10 este în mod deosebit
interesant, căci este caracteristic unei publicaţii ştiinţifice tipice. Având 1090 pagini, fişierul
6 Modified Modified READ (MMR; READ Relative Element Address Designate codes) – dezvoltat pentru a sprijini utilizarea internaţională a faxurilor, adică, "Grupul 4 aparate de fax".7 Standard dezvoltat de ITU (International Telecommunication Union) în 1984-85 în grupul filială numit apoi The International Telegraph and Telephone Consultative Committee (CCITT) şi azi cunoscut ca ITU-T (International Telecommunication Union-Telecommunication Standardization Sector).
55
TIFF/G4 (sau echivalentul său PDF) are mărimea de aproximativ 76 MB, în DjVu el este redus la
13MB. Mărimea medie a unei pagini este de aproximativ 10KB, ceea ce permite prevederea unei
stocări a 60000 de pagini pe un CD-ROM (aproximativ 50 de volume de acest tip).
Fişierul Snowbird este diferit de celelalte prin faptul că el nu a fost digitalizat de pe hârtie, dar
convertit direct de la un fişier PostScript. Convertit în TIFF/G4 el ocupă 10.7 MB, compresat cu
DjVu cu dicţionar partajat, el este redus la 728 KB [3].
Tabelul 3.4.2.1. Comparaţii între MMR/G4 şi JB2 după mărimea fişierelor
Tabelul 3.4.2.2. Comparaţii între MMR/G4 şi JB2 după rata de compresie
Tabelul 3.4.2.3. Rata de compresie a JB2 în raport cu rata de compresie relativă a G4
56
Tabelul 3.4.2.4. Comparaţii între MMR/G4 şi JB2 după mărimea medie a unei pagini
3.4.3. REZULTATE: DjVu PENTRU DOCUMENTELE COLOR
La compresia unui document în culori, sistemul DjVu cu separarea prim-plan/fundal ajunge la
rate de 300:1 şi 1000:1. Tabelul 3.4.3.1. arată mărimile fişierelor DjVu corespunzătoare unor
documente digitalizate în culori cu 300 dpi. Documentele obişnuite ocupă între 30KB şi 80 KB.
Tabelul 3.4.3.1. Mărimea fişierelor (în KB) obţinute la digitizare utilizând diferiţi algoritmi
Tabelul 3.4.3.2. Rezultatele compresiei utilizând diferiţi algoritmi [2]
57
Descrierea imaginii
Detaliul imaginii
neprelucrat
JPEG,300 dpi,
quality 20
JPEG,100dpi,
size=DjVu
IW44,300dpi,
size=DjVu
DjVucompressed
Magazine Add% image= 56
ads-freehand-30020640K 292K 70:1 50K 412:1 61K 338:1 52K 396:1
Brattain Notebook% image= 22brattain-0001
9534K 116K 82:1 17K 560:1 20K 476:1 19K 501:1Scientific Article
% image= 46graham-001 22013K 383K 57:1 41K 536:1 43K 511:1 38K 579:1
Newspaper Article% image= 50lrr-wpost-1 12990K 250K 51:1 38K 341:1 42K 309:1 40K 324:1
Cross-Section ofJupiter
% image= 73planets-jupiter 24405K 284K 85:1 47K 519:1 52K 469:1 47K 519:1
XVIIIth Century book
% image= 45cuisine-p006 12128K 206K 58:1 35K 346:1 39K 310:1 37K 327:1
US FirstAmendment% image= 30usa-amend1 31059K 388K 80:1 77K 403:1 78K 398:1 73K 425:1
Pornind de la o imagine a unui document de 300 dpi şi 24bits/pixel, segmentarea produce trei sub-imagini: masca în două nuanţe (1bit/pixel) care este de 24 de ori mai mică decât imaginea originală, imaginea de pe fundal (100dpi) este de 3 x 3 = 9 ori mai mică, imaginea din prim-plan (25 dpi) este de 12 x 12 =144 ori mai mică decât originalul. Adunând mărimile necompresate ale acestor sub-imagini, obţinem o rată de compresie de 6.25:1 în raport cu imaginea originală.
Un mare număr de exemple pot fi consultate on-line din biblioteca digitală DjVu la adresa http://www.djvu.org.
58
CAPITOLUL 4. IMPLEMENTĂRI PRACTICE
4.1. ALGORITMUL HUFFMAN STATIC (ALGORITM ENTROPIC)
Algoritmul Huffman ia ca intrare o lista de ponderi ne-negative {w(1), ... ,w(n) } şi
construieşte un arbore binar complet (un arbore binar este complet daca fiecare nod are zero sau 2
ramificaţii), ale cărui frunze sunt numerotate cu ponderi. Ponderile reprezintă probabilităţile
asociate simbolurilor sursei. Iniţial arborele are numai doua noduri, cele corespunzătoare ponderilor
celor mai mici. La fiecare pas în algoritm, cele mai mici ponderi definesc un nou nod cu ponderea
w(i)+w(j) şi a cărui rădăcina (root) are doi sub-arbori, reprezentaţi de w(i) si w(j). Ponderile w(i) si
w(j) sunt indepartate din lista şi locul lor este preluat de w(i)+w(j). Procesul continua până când se
obţine o listă cu o singură valoare [9].
Observaţii:
Pentru marcarea sfârşitului de mesaj comprimat se foloseşte un simbol auxiliar cu semnificaţie
de sfârşit de mesaj comprimat. Fie acesta END. In acest fel, numărul total de simboluri ce trebuie
reprezentate este: 256 (de la codul ASCII) + 1 (pentru END). Rezultă un număr de 257 simboluri
pentru care este nevoie de k >= log2 257 = 8.005 -> 9 simboluri binare.
Simbolul END codificat binar pe 9 biţi este: “1.0000.0000”. Pentru a obţine coduri pe 9
simboluri binare pentru caracterele ce au cod ASCII, se va pune un 0 în faţa codului ASCII pe 8
biţi. De exemplu, codul ASCII al lui “A” este 41H = 0100.0001 iar codul binar pe 9 biţi va fi
“0.0100.0001”.
Pentru codarea arborelui se parcurge arborele de sus în jos şi, apoi, de la stânga la dreapta prin
scrierea tuturor nodurilor, astfel:
- daca nodul nu este frunză (nod terminal) atunci se scrie 0 altfel 1;
- daca nodul este frunză se scrie, apoi, codul simbolului corespunzător nodului
considerat;
Există mai multe soluţii de a parcurge sigur un astfel de arbore:
1. Odată considerat un nod se taie cu un X;
2. La considerarea unui nod care nu este terminal se considera că – de fapt – au apărut două
noduri fii: unul spre stânga şi unul spre dreapta.
3. Se consideră un traseu de parcurgere al grafului, aşa cum este prezentat în figura de mai jos,
şi se scriu numai nodurile corespunzătoare pantei negative a traseului.
4. La codificarea mesajului, la sfârşitul mesajului, se pune codul lui END rezultat din arborele
de codare, delimitându-se astfel sfârşitul mesajului codat.
5. La codarea arborelui se pot folosi două metode de evidenţiere a sfârşitului codului arborelui:
59
- Să se forţeze ca simbolul END sa fie tot timpul ultimul caracter din dreapta al grafului de
codare. La apariţia codului acestuia, bin(END,9) se decide ca s-a terminat de scris arborele;
- Pentru arbore se defineşte, în mod normal, o structură de date cu trei câmpuri: nod şi cei doi
fii. După scrierea valorilor unui fiu, mai devreme sau mai târziu, se va citi şi nodul pereche,
astfel încât, se poate calcula a priori numărul de valori ce trebuie scrise pentru a parcurge în
mod independent arborele de codare.
4.1.1. CODUL SURSĂ AL ALGORITMULUI HUFFMAN ÎN VISUAL C++
//Building the Tree in encoding
void En_Decode::BuildHufTree()
{
int NodeCounter = 256;
int i;
for (i = 0; i < NodeCounter; i++)
{
OurTree[i].parent = -1;
OurTree[i].right = -1;
OurTree[i].left = -1;
}
while (1)
{
int MinFreq0 = -1;
int MinFreq1 = -1;
for (i = 0; i < NodeCounter; i++)
{
if (i != MinFreq0)
{
if (OurTree[i].freq > 0 && OurTree[i].parent == -1)
{
if (MinFreq0 == -1 || OurTree[i].freq < OurTree[MinFreq0].freq)
{
if (MinFreq1 == -1 || OurTree[i].freq < OurTree[MinFreq1].freq)
MinFreq1 = MinFreq0;
MinFreq0 = i;
60
}
else if (MinFreq1 == -1 || OurTree[i].freq < OurTree[MinFreq1].freq)
MinFreq1 = i;
}
}
}
if (MinFreq1 == -1)
{
NumOfRootNode = MinFreq0;
break;
}
//Combine two nodes to form a parent node
OurTree[MinFreq0].parent = NodeCounter;
OurTree[MinFreq1].parent = NodeCounter;
OurTree[NodeCounter].freq = OurTree[MinFreq0].freq + OurTree[MinFreq1].freq;
OurTree[NodeCounter].right = MinFreq0;
OurTree[NodeCounter].left = MinFreq1;
OurTree[NodeCounter].parent = -1;
NodeCounter++;
}
}
//Decode Data
void En_Decode::Output1Bit(int bit)
{
if (BitCounter == 8 || bit == -1)
{
while (BitCounter < 8)
{
BitContainer <<= 1;
BitCounter += 1;
}
out_file.put(BitContainer);
BitCounter = 0;
}
61
BitContainer = (BitContainer << 1) | bit;
BitCounter++;
}
void En_Decode::Compress1Byte(int node, int child)
{
if (OurTree[node].parent != -1)
Compress1Byte(OurTree[node].parent, node);
if (child != -1)
{
if (child == OurTree[node].right)
Output1Bit(0);
else if(child == OurTree[node].left)
Output1Bit(1);
}
}
void En_Decode::Encode()
{
char c;
unsigned char uc;
int idx;
FREQCOUNTER OrigBytes = 0;
int ActiveSymbs = 0;
while (!in_file.eof())
{
in_file.get(c);
uc = static_cast<unsigned char>(c);
if (OurTree[uc].freq == 0)
{
ActiveSymbs++;
}
OurTree[uc].freq++;
OrigBytes++;
62
}
out_file.write(reinterpret_cast<const char *>(&OrigBytes), sizeof(FREQCOUNTER));
out_file.write(reinterpret_cast<const char *>(&ActiveSymbs), sizeof(ActiveSymbs));
for (idx = 0; idx < 256; idx++)
{
if (OurTree[idx].freq > 0)
{
uc = static_cast<char>(idx);
out_file.put(uc);
out_file.write(reinterpret_cast<const char *>(&OurTree[idx].freq), sizeof(FREQCOUNTER));
}
}
BuildHufTree();
temp_file.seekg(0, std::ios::beg);
while(1)
{
temp_file.get(c);
if (temp_file.eof())
break;
uc = static_cast<unsigned char>(c);
Compress1Byte(uc, -1);
}
Output1Bit(-1);
}
void En_Decode::Decode()
{
FREQCOUNTER OrigBytes = 0;
int ActiveSymbs = 0;
in_file.read(reinterpret_cast<char *>(&OrigBytes), sizeof(FREQCOUNTER));
in_file.read(reinterpret_cast<char *>(&ActiveSymbs), sizeof(int));
char c;
63
unsigned char uc;
while (ActiveSymbs--)
{
in_file.get(c);
uc = static_cast<unsigned char>(c);
in_file.read(reinterpret_cast<char *>(&OurTree[uc].freq), sizeof(FREQCOUNTER));
}
BuildHufTree();
while (OrigBytes--)
{
int NumOfTgtSymb;
NumOfTgtSymb = NumOfRootNode;
while (OurTree[NumOfTgtSymb].right != -1)
{
if (BitCounter == 0)
{
in_file.get(c);
BitContainer = static_cast<unsigned char>(c);
if (in_file.eof())
return;
BitCounter = 8;
}
if (BitContainer & 0x80)
NumOfTgtSymb = OurTree[NumOfTgtSymb].left;
else
NumOfTgtSymb = OurTree[NumOfTgtSymb].right;
BitContainer <<= 1;
BitCounter--;
}
out_file.write(reinterpret_cast<const char *>(&NumOfTgtSymb), sizeof(char));
}
}
64
4.2. ALGORITMUL LZW (ALGORITM PE BAZĂ DE DICŢIONAR)
Algoritmul LZW încearcă totdeauna să genereze coduri pentru şiruri deja
cunoscute. Şi de fiecare dată când este generat un cod nou, un sir nou se
adaugă în tabelul de şiruri [5].
ALGORITM DE CODARE LZW:
1. STRING = get input character
2. WHILE there are still input characters DO
3. CHARACTER = get input character
4. IF STRING+CHARACTER is in the string table then
5. STRING = STRING+character
6. ELSE
7. output the code for STRING
8. add STRING+CHARACTER to the string table
9. STRING = CHARACTER
10. END of IF
11. END of WHILE
12. output the code for STRING
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 eficienta algoritmului LZW rezidă în faptul că la
decomprimare nu este necesară cunoaşterea/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 translaţie de mari
dimensiuni.
ALGORITM DE DECODARE LZW:
1. Read OLD_CODE
2. output OLD_CODE
65
3. CHARACTER = OLD_CODE
4. WHILE there are still input characters DO
5. Read NEW_CODE
6. IF NEW_CODE is not in the translation table THEN
7. STRING = get translation of OLD_CODE
8. STRING = STRING+CHARACTER
9. ELSE
10. STRING = get translation of NEW_CODE
11. END of IF
12. output STRING
13. CHARACTER = first character in STRING
14. add OLD_CODE + CHARACTER to the translation table
15. OLD_CODE = NEW_CODE
16. END of WHILE
4.2.1. CODUL SURSĂ AL ALGORITMULUI LZW ÎN VISUAL C++
// Construction/Destruction
void CLZWCompression::Init()
{
m_dictionary = NULL;
m_SavedData = 0;
m_TotalBits = 0;
m_MaxBits = 9;
}
CLZWCompression::~CLZWCompression()
{
ClearDictionary();
}
//This function was added to send log information to the view
void CLZWCompression::Log(CString data)
{
//Put something inside the log if exist
if (p_Log != NULL)
p_Log->Add(data);
66
}
//Create a new dictionary
void CLZWCompression::CreateDictionary()
{
Log("Creating dictionary!");
m_dictionary = new CDictionary;
}
//Remove the existing dictionary
void CLZWCompression::ClearDictionary()
{
if (m_dictionary != NULL)
{
Log("Clear dictionary!");
delete[] m_dictionary;
m_dictionary = NULL;
}
}
BOOL CLZWCompression::Compress(CFile &source, CFile &destination)
{
long prefix = 0;
long result = 0;
BYTE readByte = 0;
unsigned long filetotal = 0;
CString logString;
DWORD resAdd = 256;
//Initialize the necessary data
Init();
//Get the total file size
filetotal = source.GetLength();
//Create the dictionary (if not created already)
67
if (m_dictionary == NULL)
{
CreateDictionary();
}
//Read the first byte from the file
source.Read(&prefix, 1);
//Go over the rest of the file and read it
while (source.GetPosition() < filetotal)
{
//Read the second byte
source.Read(&readByte, 1);
//Check if the prefix and readByte combination exist in the dictionary
result = m_dictionary->GetEntry(prefix, readByte);
//If not exist
if (result == -1)
{
//Add the new combination
resAdd = m_dictionary->AddEntry(prefix, readByte);
//Calculate the new bit size needed to encode the file
CalculateBitSize(resAdd);
//To show a log in the view
logString.Format("Adding combination of %d and %d to dictionary to entry %d.",
prefix, readByte, resAdd);
Log(logString);
//Send the prefix for compression in to the destination file
CompressData(destination, prefix);
//Set the prefix as the readByte
68
prefix = readByte;
//Initiate the result
result = -1;
}
else
{
//Set the prefix as the result
prefix = result;
readByte = 0;
}
}
//Compress the remaining information in the refix into the destination file
CompressData(destination, prefix);
//Close the destination file
CloseCompressedFile(destination);
//Remove the existing dictionary
ClearDictionary();
return TRUE;
}
void CLZWCompression::CompressData(CFile &dest, long toSave)
{
DWORD writeData = 0;
//Move the data you want to write few bits to the left
//and combine it with the already existing data in the buffer
m_SavedData |= (DWORD) toSave << (32 - m_MaxBits - m_TotalBits);
//Add the new added number of bits to the total bits counter
m_TotalBits += m_MaxBits;
//Check if it's possible to enter the data to the file
69
//(over and equal a byte of data)
while (m_TotalBits >= 8)
{
//Get the byte we want to write
writeData = m_SavedData;
writeData >>= 24;
dest.Write(&writeData, 1);
//remove the byte from the buffer
m_SavedData <<= 8;
//Remove the byte from the counter
m_TotalBits -= 8;
}
}
BOOL CLZWCompression::Decompress(CFile &source, CFile &destination)
{
DWORD prefix = 0, data = 0;
CString logString;
CByteArray decodeString;
BYTE writeData = 0, character = 0;
int counter = 0;
Init();
//Create the dictionary (if not already created)
if (m_dictionary == NULL)
{
CreateDictionary();
}
//Get the first prefix information
prefix = DecompressData(source);
70
//Save the prefix as the last used character (since we're writing it in the destination file)
character = (BYTE)prefix;
//Write the prefix in the destination file (the first byte inside a LZW copressed file is always
//the first byte of the original file)
destination.Write(&prefix, 1);
//While the recieve data is not the maximum bit data possible
while ((data = DecompressData(source)) != m_MaxCode[m_MaxBits])
{
//Check if the code exist in the dictionary
//if not
if (!m_dictionary->IsCodeExist(data))
{
//Get the last used character into the decod buffer
decodeString.Add((BYTE)character);
//Decode the existing prefix into a known string of data
m_dictionary->GetBytesFromCode(&decodeString, prefix);
}
else
{
//Decode the data into the decode buffer
m_dictionary->GetBytesFromCode(&decodeString, data);
//Get the last letter inside the data, as the last used letter
character = decodeString.GetAt(decodeString.GetSize() - 1);
}
//Go over the decode buffer, from the end to the start,
//and write the information into the destination file
counter = decodeString.GetSize();
while (counter > 0)
{
writeData = (BYTE)decodeString.GetAt(--counter);
destination.Write(&writeData, 1);
71
//To show a log in the view
logString.Format("Adding character code %d with know visualisation of: %s"
writeData, convertASCIIToText(writeData));
//logString.Format("Adding byte %d to file.", writeData);
Log(logString);
}
//Clear the decode buffer
decodeString.RemoveAll();
//Add the new combination into the dictionary
m_dictionary->AddEntry(prefix, (BYTE)character);
//Calculate the new buffer size to read now
CalculateBitSize(m_dictionary->GetMaxCode()+1);
//Set the new prefix to use
prefix = data;
}
return TRUE;
}
// Decompress Data
DWORD CLZWCompression::DecompressData(CFile &source)
{
DWORD returnValue;
BYTE readByte = 0;
//If the source file still contains information
if (source.GetPosition() < source.GetLength())
{
//check if the number of bits in the read buffer is >= 24
while (m_TotalBits <= 24)
{
//Read one byte
72
source.Read(&readByte, 1);
//Add the byte to the read buffer
m_SavedData |= (DWORD) readByte << (24 - m_TotalBits);
//Add byte to the bit counter
m_TotalBits += 8;
}
}
else
{
//If there is no more data, and there are no more bits to read
//while the file is over, then return the maximum bit number
//to end the decompression process
if (m_SavedData == 0 && m_TotalBits == 0)
return m_MaxCode[m_MaxBits];
}
//calculate the return information
returnValue = m_SavedData >> (32 - m_MaxBits);
//Remove the returned information from the buffer
m_SavedData <<= m_MaxBits;
//Remove the return information bit size from the bit counter
m_TotalBits -= m_MaxBits;
//Return the data
return returnValue;
}
void CLZWCompression::CloseCompressedFile(CFile &source)
{
//Insert to the file the maximum number of bit (for signaling the end of the compression/
//decompression)
CompressData(source, m_MaxCode[m_MaxBits]);
//Flash the rest of the file with 0
CompressData(source, 0);
73
}
void CLZWCompression::CalculateBitSize(DWORD value)
{
//Check the value of the parameter against the Maximum number possible
//and then returns the counter
//This can also be acheived by right shifting the value until we get 0
//and counting the number of times we doing it.
BYTE counter;
for (counter = 0; counter < 32; counter++)
{
if (value <= m_MaxCode[counter])
break;
}
m_MaxBits = counter;
if (m_MaxBits < 9)
m_MaxBits = 9;
}
//Added for using the log from the application
BOOL CLZWCompression::CompressWithLog(CFile &source, CFile &destination, CStringArray
*pLog)
{
p_Log = pLog;
return Compress(source, destination);
}
BOOL CLZWCompression::DecompressWithLog(CFile &source, CFile &destination,
CStringArray *pLog)
{
p_Log = pLog;
return Decompress(source, destination);
}
CONCLUZIE
74
Compresia se realizează prin schimbarea modului de reprezentare a datelor având deci de a face
cu un caz particular de codare. Această codare se face în raport cu un anumit model al datelor, se
căută modelul optimal. Eficienţa compresiei obţinută cu o metodă oarecare poate fi apreciată prin
raportul de compresie – raportul dintre dimensiunea reprezentării datelor în lipsa compresiei şi
dimensiunea reprezentării datelor obţinute în urma compresiei.
Cea mai generală clasificare a metodelor de compresie se face după eroarea de refacere a
datelor. În raport cu acest criteriu distingem două categorii mari de metode: metode fără pierderi –
în care datele se refac în totalitate şi metode cu pierderi – în care datele se refac în limita unor erori
considerate acceptabile.
În funcţie de modul cum evoluează în timp modelul sursei de date, metodele de compresie se
pot diviza în metode statice (în care modelul este fix, nu evoluează în timp ce este construit apriori,
pe baza unor mesaje considerate tipice), semistatice (în care modelul este construit înaintea codării
pe baza datelor ce urmează să fie comprimate şi este nemodificat pe durata acesteia) şi dinamice (î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).
Modelarea statistică a unei surse discrete de informaţie constă în asocierea unei probabilităţi de
apariţie a 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ă şi dinamică, codificarea aritmetică.
Metodele de compresie bazate pe modelarea lingvistică a surselor discrete au la bază ideea 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. Din această categorie fac parte algoritmii LZ77, LZ78, LZW.
În lucrul cu fişiere de dimensiuni mari este important sa se poată asigura compresia datelor
astfel încât acestea să ocupe un spaţiu de stocare minim. Pentru prelucrarea datelor respective,
acestea trebuie însa restaurate în forma decomprimată, recunoscută de aplicatiile care gestionează
acele tipuri de informatii.
Aplicaţiile au rolul de a facilita munca utilizatorului cu arhive de fişiere (arhivele sunt fişiere
care contin alte fisiere, comprimate prin intermediul unui algoritm de compresie). Procesul de
compresie reduce dimensiunile fisierelor astfel încât să ocupe un spaţiu minim sau să poată fi
copiate pe suporturi de capacitate mică şi transmise în reţea în timp real.
WinRAR este versiunea de 32 biţi a arhivatorului RAR pentru Windows – un instrument
puternic care permite de a crea, gestiona şi controla fişierele arhivelor. Numărul fişierelor ce poate
fi adăugat la o arhivă depinde de cantitatea memoriei disponibile şi de lungimea numelor fişierelor.
75
Mărimea unei arhive RAR sau a unui fişier de arhivat într-o arhivă RAR, este limitată la 8 589 934
591 Go.
WinZip se integrează perfect în postul de lucru şi de explorare Windows. WinZip integrează o
sarcină de formate de fişiere din cele mai curente de pe Internet: RAR, BZ2, BZ, TBZ, TBZ2, TAR,
gzip, UUencode, XXencode, BinHex et MIME. Mai mult, programele externe asigură acceptarea
fişierelor ARJ, LZH şi ARC. WinZip permite accesul practic la toate fişierele compresate şi codate
ce pot fi descărcate de pe Internet.
WinZip preia formatul de fişier Zip &4biţi, ceea ce elimină toate restricţiile practice legate de
mărimea arhivelor, de asemenea şi de numărul şi mărimea fişierelor compresate într-o arhivă.
Capacitatea de arhivare nu este limitată decât de resursele sistemului.
WinZip se caracterizează printr-o criptare avansată: tehnologia de criptare AES 128 biţi şi 256
biţi a lui WinZip nu permite consultarea neautorizată a conţinutului documentelor.
7-Zip creează arhive compatibile în întregime cu Zip. Orişicine poate decompresa aceste
fişiere cu orice aplicaţie compatibilă Zip de decompresie. Fişierele compresate cu alte metode de
compresie Zip pot fi extrase de versiunea curentă a lui 7-Zip. Dar aceste metode suportate sunt mai
populare, de aceea 7-Zip poate decompresa marea majoritate a arhivelor Zip. 7-Zip suportă extensia
Zip64 a formatului ZIP.
PowerArchiver 2009 conţine toate opţiunile de bază ce sunt aşteptate de la o aplicaţie de
arhivare – permite citirea şi extragerea în mai multe formate, de asemenea şi crearea arhivelor în
mai multe formate, în particular cu 7-zip care este cel mai puternic la momentul actual. Ceea ce
diferenţiază PowerArchiver faţă de aplicaţiile similare ţine de numeroasele sale opţiuni.
Apariţia necesităţii digitizării publicaţiilor de patrimoniu, a manuscriselor etc. impune crearea
unei tehnici de compresie pentru fişierele scanate. Stocarea acestor fişiere în format DjVu care în
acest moment permite cel mai bun raport de compresie/calitate a fişierului standard este o
posibilitate analizată în această lucrare. Fişierele .djvu pot fi vizualizate cu ajutorul unui browser
web având plugin-ul corespunzător instalat. Un fişier .tif color de 32 Mb ajunge la 100 Kb în format
djvu fără pierdere semnificativă de rezoluţie.
Un algoritm de compresie poate fi evaluat în funcţie de necesarul de memorie pentru
implementarea algoritmului, viteza algoritmului pe o anumită maşină, raportul de compresie,
calitatea reconstrucţiei. De obicei, ultimele două criterii sunt esenţiale în adoptarea algoritmului de
compresie, iar eficienţa lui este caracterizată de compromisul criteriilor enumerate.
76
BIBLIOGRAFIE
[1] Bottou Léon, Patrick Haffner and Yann LeCun, Efficient Conversion of Digital Documents to
Multilayer Raster Formats, AT&T Labs – Research.
[2] Bottou Léon, Patrick Haffner, Paul G. Howard, Patrice Simard, Yoshua Bengio and Yann
LeCun, High Quality Document Image Compression with DjVu, AT&T Labs, Lincroft, NJ, July
13, 1998.
[3] Bottou Léon, Patrick Haffner, Yann LeCun, Paul Howard, Pascal Vincent, Bill Riemers, DjVu:
Un Système de Compression d’Images pour la Distribution Réticulaire de Documents
Numérisés, AT&T Labs, Research 100 Schulz Drive, Red Bank, NJ 07701 USA.
[4] Likforman-Sulem Laurence, Apport du traitement des images à la numérisation des documents
manuscrits anciens, Ecole Nationale Supérieure des Télécommunications Département TSI, 46
rue Barrault, 75013 Paris.
[5] Nelson Mark, Data Compression, Dr. Dobb's Journal, October 1st, 1989.
[6] Nelson Mark and Jean-loup Gailly, The Data Compression Book, 2nd edition, M&T Books,
New York, NY,1995.
[7] Ostafe Doina, Biblioteca viitorului - colecţiile digitale, Revista Româna de Biblioteconomie şi
Ştiinţa Informării, Anul 3, nr. 2, 2007, p.15-18.
[8] Pigeon Steven, Contribution à la compression de données, Thèse presentée à la Faculté des arts
et sciences en vue de l’obtention du grade Philosophiæ Doctor (Ph. D.) en Informatique,
Université de Motréal, Décembre 2001.
[9] Radescu Radu, Compresia fara pierderi, Editura MATRIX ROM, Bucuresti, 2003.
[10] Repanovici Angela, Gabriela Mailat, Corina Pop, Valorificarea si protejarea documentelor de
patrimoniu prin digitizare, Revista Româna de Biblioteconomie şi Ştiinţa Informării, nr. 2,
2007, p.27-29.
[11] Roxin Ioan, Daniel Mercier, Multimédia : Les fondamentaux. Introduction à la représentation
numérique, Vuibert, Paris, 2004, p.30-65.
[12] Soroiu Claudiu, Compresia datelor, serial Gazeta de informatică nr.13/1, Cluj-Napoca,
ianuarie 2003.
[13] Soroiu Claudiu, Compresia datelor, serial Gazeta de informatică nr.13/2, Cluj-Napoca,
februarie 2003.
77
Referinţe web:
[14] Tărniceriu Daniela prof. dr. ing., Cursul de Compresie şi Criptare de la Facultatea de
Electronică şi Telecomunicaţii, Universitatea Tehnică "Gh. Asachi" Iaşi,
http://telecom.etc.tuiasi.ro/pns/cc/, consultat 19.03.2010.
[15] 7-zip Help, www. 7-zip .org , consultat 23.04.2010.
[16] Compararea aplicaţiilor de arhivare, http://en.wikipedia.org/wiki/Comparison_of_file_
archivers, consultat 23.04.2010.
[17] Compresia datelor, http://www.datacompression.info/, consultat 26.04.2010.
[18] Contens WinRAR, http://download.cnet.com/WinRAR-32-bit/3000-2250_4-10007677. html,
consultat 23.04.2010.
[19] PowerArhiver Help, www. powerarchiver .com , consultat 23.04.2010.
[20] ZIP Help, www. winzip .com , consultat 23.04.2010.
78