Documente Academic
Documente Profesional
Documente Cultură
1. 2.
asigneaza acestui nod valoarea v( n x ) = p( x ) 3. ataseaza aceste noduri unei multimi T reprezentand o colectie de arbori. 4. repeta urmatorii pasi pana cand in multimea T ramane un singur arbore: i. Verifica valorile v( ni ) ale nodului radacita pentru ficare arbore. Gaseste cei doi arbori ( n a si n b ) cu cele mai mici valori v( n i ) . ii. Extrage din T cei doi arbori.
pentru fiecare
nx
iii.
Creeaza un nou nod n c si ataseaza nodurile n a si n b la stanga si la dreapta acestuia. Se va crea astfel un nou arbore. iv. Asigneaza noului arbore valoarea v( n c ) = v( n a ) + v( nb ) v. Insereaza noua valoare in arborele T .
n arborele obinut prin parcurgerea pailor anteriori se asigneaz simbolurile binare 0 i 1 pentru fiecare pereche de ramuri care pleac dintr-un nod intermediar. Cuvntul de cod pentru fiecare simbol poate fi citit ca secvena binar determinat prin parcurgerea nodurilor dinspre rdcin pn la nodurile terminale asociate simbolurilor. Figura 1.1 ilustreaza algorimul utilizat pentru crearea arborelui Huffman. Cele patru nivele contin colectia de arbori din multimea T dupa parcurgerea fiecarui pas al algoritmului.
A .125 A .125 .250 A .125 B .125 A .125 C .250 A .125 D .5 5 A .125 D .5 5 A .125
A .125 A .125
B .125 A .125
C .250 A .125
.5 5 A C .250 .125 .250 A A .125 B .125 .125 A .125 1.0 D .5 .5 5 50 A C A .250 .125 .250 .125 A .125 B .125
D .5 5 A .125
Cel mai simplu mod de a coda date utilizand aceasta metoda este de a crea un tabel cu doua valori pentru fiecare caracter (o valoare reprezentand lungimea codului in biti si cea de a doua reprezentand codul stocat in exemplul de mai jos pe 8 biti in practica se recomanda 32 biti). Litera A B C D Lungime cod 3 3 2 1 cod 11100000 11000000 10000000 00000000
Pentru decodare pornind de la radacina se urmaresc ramurile fiecarui nod conform bitilor secventei pana se atinge un nod terminal. Apoi se reporneste procedura de la radacina. Codul pentru compresia fisierelor va utiliza operatia logica OR pentru inserarea codului si operatiile Shift stanga - Shift dreapta pentru aliniere. Exemplu de pseudocode:
integer outputWord=0; integer bitsUsedInOutput=0; integer maxBitsInWord=32; integer[] integer[] codeWords; codeLengths;
integer temp; char codeMe; while more characters are uncoded do begin codeMe=get next character; temp=codeWords[codeMe]; if maxBitsInWord); then begin temp=rightshift(temp, bitsUsedInOutput); outputWord=OR(outputWord, temp); store outputWord in file; outputWord=leftshift(codeWords[codeMe], maxBitsInWord - bitsUsedInOutput); bitsUsedInOutput =maxBitsInWord bitsUsedInOutput; -codeLength[codeMe] + (bitsUsedInOutput + codeLengths[codeMe] >
end else begin temp=rightshift(temp, bitsUsedInOutput); outputWord=OR(outputWord, temp); bitsUsedInOutput=bitsUsedInOutput codeLength[codeMe]; end; end; +
2.
Pentru fiecare nod, ataseaza un string nul c( n x ) in care se va scrie codul final pentru fiecare caracter.
3. Considera N o multime care contine toate nodurile 4. Aplica recursiv multimii N urmatorii pasi:
i.
Imparte N in doua submultimi N 1 si N 2 , astfel incat suma probabilitatilor caracterelor din multimea N 1 ( W ( N 1 ) ) sa fie aproximativ egala cu cea aferenta multimii N 2 ( W ( N 2 ) )
ii.
Adauga un 0 la sfarsitul lui c( n x ) pentru toate n x din N 1 . Adauga cate un 1 la sfarsitul lui c( n x ) pentru toate n x din N 2 Aplica recursiv aceasta functie lui N 1 si N 2 separat.
iii.
Exemplu de pseudocode:
make_codes( N ); if else
N =1 then N[0];
Exemplul #1 Se considera o sursa cu opt mesaje: s1, s2, s3, s4, s5, s6, s7, s8; cu probabilitatile: Mesaj s1 s2 s3 s4 s5 s6 s7 s8 pi 0,4 0,18 0,10 0,10 0,07 0,06 0,05 0,04 a) Sa se realizeze compresia utilizand metodele Huffman / Shannon-Fano:
b)
eficienta codului =
H ( x) , redundanta = n H ( x ) n
N 1 , lungimea medie n = p i n i , pi i =1
Solutie:
Mesaj pi Log(1/pI) Shannon-Fano si* Huffman
s1 s2 s3 s4 s5 s6 s7 s8
Metoda Shannon-Fano:
Metoda Huffman:
In faza de decompresie succesiunea operatiilor este urmatoarea: baleierea fluxului de intrare la nivel de pointeri frazele din dictionar indicate de pointeri sunt extrase si inscrise pe fluxul de iesire
Dintre algoritmii de compresie bazati pe utilizarea dictionarelor statistice, in cadrul acestui paragraf se va descrie algoritmul LZW Lempel-Ziv-Welch. Algoritmul de compresie se poate sintetiza in urmatorul pseudocode:
word=; while not end of file; x=read next character; if word + x is in the dictionary // + concatenare word=word + x; else send the dictionary number for word add word + x to the dictionary word=x end of while loop
Pentru a elimina prezenta simbolurilor din cadrul codurilor emise, se propune preancarcarea dictionarului cu 256 simboluri (din pozitia 0 pana in pozitia 255). Simbolurile sunt asezate in ordine lexicografica. Codul original al fiecarui simbol coincide chiar cu indexul pozitiei sale in dictionar. Deoarece dimensiunea dictionarului este superioara valorii 256, numarul de biti asociati unui cod este de cel putin 9. In cazul dictionarului liniar, emisia unui cod se efectueaza cu cel putin un pas intarziere fata de momentul citirii datelor de pe fluxul de intrare. Dimensiuinea frazei creste cu fiecare simbol citit, in cazul in care a fost depistata o coincidenta. Procesul de crestere a dimensiunii frazei necriptate inceteaza odata cu primul simbol adaugat care produce imposibilitatea identificarii noii fraze in dictionar. In acest moment se cripteaza fraza curenta, mai putin ultimul ei simbol. Fluxul de iesire este ocupat numai de coduri de tip index . Exemplul #2 . Fie sirul de caractere: BABY AT BAT. Sa se aplice algoritmul Lempel-Ziv-Welch pe acest sir de caractere. Solutie:
Simbol curent citit (x) Cod emis Fraza adaugata dictionarului /index valoare
B A B Y space A T space B A T -
B A B Y space A T space B BA T -
Compresia se realizeaza prin inlocuirea grupului BA prin codul 257. Intrarile in dictionar se pot stoca intr-un arbore indexat alfabetic:
A T 262 A 261
T sp 263
Exemplul #3 Fie sirul de caractere: BOB BOOTS BOOMBOX BOATS. Sa se aplice algoritmul Lempel-Ziv-Welch . Solutie:
Simbol curent citit (x) Cod emis Fraza adaugata dictionarului /index valoare
none 257=BO 258=OB 259=B 260= B 261=BOO 262=OT 263=TS 264=S 265= BO 266=OO 267=OM 268=MB 269=BOX 270=X 271= BOA 272=AT 273=TS -
Observatie: Daca se utilizeaza n=9 biti pentru fiecare cod In cazul exemplului #2 - 184 biti (23 litere) sunt comprimati in 162 biti . Procedura de decompresie aferenta primului exemplu este prezentata in urmatorul tabel:
Cod curent citit valoare Fraza adaugata dictionarului /index Simbol emis
B A B Y space A T space BA T
none 257=BA 258=AB 259=BY 260=Y 261= A 262=AT 263=T 264= B 265=BAT
B A B Y space A T space B A T
In cazul codarii aritmetice, se asociaza un singur numar fractionar pentru un intreg bloc de simboluri.
Algoritmul de compresie:
se construieste alfabetul asociat setului de date si o tabela a frecventelor asociate fiecarui simbol notata cu: p ( s ) se construieste o partitie disjuncta a intervalului [0,1) folosind sirul frecventelor de aparitie. Fiecarui simbol i se aloca cate un interval al partitiei, de lungime proportionala cu frecventa sa de aparitie, pozitionat in functie de locul ocupat de simbol in alfabet. Se noteaza cu L( s ) = [m( s ), M ( s ) ) intervalul asociat simbolului s . Lungimea sa este egala cu p ( s ) , adica p ( s ) = M ( s ) m( s )
se imparte setul de date in blocuri de lungime fixa, k pentru fiecare bloc de simboluri se construieste cate un numar fractionar folosind urmatoarea procedura: Constructia incepe cu determinarea limitelor superioara si inferioara intre care va fi incadrat numarul fractionar, in functie de primul simbol al blocului. Pe masura ce se citesc noi simboluri, limitele se apropie din ce in ce mai mult, ajungand in final sa coincida pe un anumit numar de zecimale. Ajustarea limitelor se realizeaza astfel: Fie { a k } multimea limitelor inferioare si superioare.
{ Ak }
multimea limitelor
a k = a k 1 + ( Ak 1 a k 1 ) m( s k ) Ak = a k 1 + ( Ak 1 a k 1 ) M ( s k )
Algoritmul de decompresie:
se construieste alfabetul asociat setului de date si o tabela a frecventelor asociate fiecarui simbol notata cu: p ( s ) .Se construieste o partitie disjuncta a intervalului [0,1) folosind sirul frecventelor de aparitie. Pentru fiecare bloc k de simboluri ce urmeaza a fi decriptat, se citeste codul fractionar corespondent r1 . Celelalte numere ale multimii se evalueaza pe masura ce sunt decriptate simbolurile s k :
rk =
m( s k ) rk < M ( s k )
Algoritmul se opreste dupa decriptarea tuturor simbolurilor.
Exemplul #4 Fie caracterele{A, B, C, D} carora le corespund probabilitatile {1/2, 1,4, 1/8, 1/8}. Sa se comprime prin codaj aritmetic. Solutie: Arborele Huffman de codare este urmatorul:
. 0 1 . . C 0 1 1 0 1 1 B 1 A
C 1/8
D 1/8
B 1/4
A 1/2
Rezultatul compresiei sirului ABCDC este prezentat in urmatorul tabel (codul Huffman este adaugat pentru comparatie). Simbol A B C D C Sau: Simbol A B C Cod Huffman 1 01 000 Limita inferioara .1 2 .101 2 .101000 2 Limita superioara 1.0 2 .11 2 .101001 2 Cod Huffman 1 01 000 001 000
1/2 1/2 + 1/2x1/4 1/2 + 1/2x1/4 1/2 + 1/2x1/4 1/2x1/4x1/8x1/8 1/2 + 1/2x1/4 1/2x1/4x1/8x1/8 + +
Limita inferioara
1
Limita superioara
1/2 +1/2x1/4 + !/4x1/2 1/2 + 1/2x1/4 + 1/2x1/4x1/8 1/2 + 1/2x1/4 + 1/2x1/4x1/8x1/4 1/2 + 1/2x1/4 + 1/2x1/4x1/8x1/8+1/2x1/4x1/8x1/8x1/ 8
D C
001 000
.101000001 2 .101000001000 2
.10100001 2 .101000001001 2
Exemplul #5 : Fie literele {A, B, C, D} cu probabilitatile de aparitie {.7, .12, .1, . 08}.}. Sa se comprime prin codaj aritmetic. Solutie: Arborele Huffman de codare este urmatorul:
. 0 1 . . C 0 1 1 0 1 1 B 1 A
C .08
D .1
B .12
A .7
Rezultatul compresiei sirului AAAB este prezentat in urmatorul tabel (codul Huffman este adaugat pentru comparatie). Simbol A A A B Cod Huffman 1 1 1 01 Limita inferioara .3 .3+.3x.7 .3+.3x.7+.3x.7x.7 . 3+.3x.7+.3x.7x.7+.18x.7x.7x.7 =.71874 Limita superioara 1 1 1 . 3+.3x.7+.3x.7x.7+.3x.7x.7x.7=.7599
Arobrele Huffman va comprima sirul de caractere prin 11101. Codarea aritmetica reduce sirul de caractere in limitele: .71874=.10110111111111111 2 si .
7599=.1100001010001 2 . Cea mai scurta fractie binara in acest interval este .11 2 de unde rezulta ca prin compresia aritmetica se poate reduce un string de 4 caractere la 2 biti. Exemplul#6: Prin aceeasi metoda sa se comprime sirul ABCDC. Solutie: Simbol Cod Huffma n 1 01 000 001 Limita inferioara Limita superioara
A B C D
000
Limitele finale sunt: .43277376=.011011101100101001000010111 2 .43284096=.01101110110011101010101001 2 O valoare in intervalul considerat (cea mai scurta val. binara) este: .01101110110011 2 care necesita 14 biti cu doi biti mai mult decat compresia Huffman. 2. Chestiuni de studiat/Mod de lucru a.Aplicarea programului de tip H, S.F, Ca. LZ pe urmatoarele tipuri de fisiere text: text limba romana, text limba engleza, texte cu figuri, formulare economice(siruri de numere), compresie antet . fisiere sursa (C, Vb...) b. Calculul ratei de compresie pentru fiecare caz in parte c. Concluzii privind recomandarea unui anume program de compresie Pe modelul a. Comparatie intre diferite tipuri de programe de arhivare standard: zip rar ace