Transcript Capitolul 2
UNIVERSITY POLITEHNICA of BUCHAREST DEPARTMENT OF COMPUTER SCIENCE Conf. Dr. Ing. Costin-Anton Boiangiu <[email protected]> Codarea Shannon-Fano Are avantajul simplitatii Suboptimal Se bazeaza pe teoria Shannon 1. Codul este construit astfel: mesajele sursei s(i) si probabilitatile asociate p(i) sunt listate in ordine descrescatoare a probabilitatilor 2. Lista este divizata pentru a forma doua grupuri de probabilitati egale 3. Fiecare mesaj din primul grup receptioneaza (primeste) 0 ca prim simbol al cuvantului de cod, iar mesajele din lista a doua vor avea cuvintele de cod incepand cu 1 4. Fiecare din sub-listele obtinute sunt divizate dupa acelasi criteriu si se aloca (asigneaza) simboluri suplimentare 5. Procesul se continua pana cand se obtin sub-liste cu un singur mesaj 2 Codarea Shannon-Fano Lungimea cuvantului de cod este –log(p(x)) daca este posibil sa se divizeze in subgrupuri de probabilitate egala Cand acest lucru nu este posibil, unele din cuvintele de cod vor avea lungimi de (-log(p(x)) +1) Codul Shannon-fano furnizeaza o lungime medie a cuvintelor de cod ce satisface relatia : H(S) l H(S) 1 3 Codarea Shannon-Fano 0 0 1 1 1 1 a b c d e f 9 8 6 5 4 2 0 4 1 a b c d e f 9 8 6 5 4 2 Codarea Shannon-Fano 0 0 1 1 1 1 a b c d e f 9 8 6 5 4 2 0 0 5 1 a b 9 8 1 c d e f 6 5 4 2 Codarea Shannon-Fano 00 01 1 1 1 1 a b c d e f 9 8 6 5 4 2 0 0 6 1 a b 9 8 1 c d e f 6 5 4 2 Codarea Shannon-Fano 00 01 1 1 1 1 a b c d e f 9 8 6 5 4 2 0 0 7 1 1 0 1 a b c d e f 9 8 6 5 4 2 Codarea Shannon-Fano 00 01 10 10 11 11 a b c d e f 9 8 6 5 4 2 0 0 8 1 1 0 1 a b c d e f 9 8 6 5 4 2 Codarea Shannon-Fano 00 01 10 10 11 11 a b c d e f 9 8 6 5 4 2 0 0 9 1 1 a b 9 8 0 0 1 1 c d 6 5 e f 4 2 Codarea Shannon-Fano 00 01 100 101 11 11 a b c d e f 9 8 6 5 4 2 0 0 10 1 1 a b 9 8 0 0 1 1 c d 6 5 e f 4 2 Codarea Shannon-Fano 00 01 100 101 11 11 a b c d e f 9 8 6 5 4 2 0 0 11 1 1 a b 9 8 0 0 1 1 0 1 c d e f 6 5 4 2 Codarea Shannon-Fano 00 01 100 101 110 111 a b c d e f 9 8 6 5 4 2 0 0 12 1 1 a b 9 8 0 0 1 1 0 1 c d e f 6 5 4 2 Codari Prefix Optimale Codari optimale 1. Simbolurile care apar mai frecvent vor avea coduri mai scurte 2. Ultimele 2 cele mai putin frecvente simboluri vor avea coduri de lungimi egale Demonstratie: 1. Vrem sa demonstram faptul ca in acest caz codul este clar suboptimal 2. Presupunem opusul Fie X, Y cele mai putin frecvente simboluri si |cod(X)| = k, |cod(Y)| = k+1 Atunci Datorita decodificarii unice (UD), cod(X) nu poate fi prefix pt cod(Y) Deasemenea toate celelalte coduri sunt mai scurte Eliminand ultim bit al lui|cod(Y)| ar genera un nou cod scurt unic decodificabil, ceea ce contrazice presupunerea initiala de optimalitate 13 Codificare Huffman Algoritmul Huffman ia ca intrare o lista de ponderi ne-negative {w(1), ... ,w(n) } si construieste un arbore binar complet ale carui frunze sunt numerotate cu ponderi un arbore binar este complet daca fiecare nod are zero sau 2 ramificatii Ponderile reprezinta probabilitatile asociate simbolurilor sursei Initial arborele are numai doua noduri, cele corespunzatoare ponderilor celor mai mici La fiecare pas in algoritm, cele mai mici ponderi definesc un nou nod cu ponderea w(i)+w(j) si a carui radacina (root) are doi sub-arbori, reprezentati de w(i) si w(j) Ponderile w(i) si w(j) sunt indepartate din lista si locul lor este preluat de w(i)+w(j) Procesul continua pana cand se obtine o lista cu o singura valoare. 14 Codificare Huffman Algoritmul Huffman (1952) constituie un algoritm optimal, în sensul că nici un alt algoritm nu asigură o mai mică lungime medie a cuvintelor Sunt situaţii în care şi alţi algoritmi pot da o lungime medie egală cu cea dată de algoritmul Huffman, dar niciodată mai mică Exemplu: Litera Cod Probabilitate a 0.2 b 0.4 c 0.2 d 0.1 e 0.1 Set Prob Set 15 Codificare Huffman Initializare: Creeaza o multime din fiecare litera Litera Letter Cod Code Probabilitate Probability Set ProbProb Set Set a 0.2 a 0.2 b 0.4 b 0.4 c 0.2 c 0.2 d 0.1 0.1 d 0.1 e 0.1 0.1 e 0.1 16 Codificare Huffman 1. Litera Letter Sorteaza multimile dupa probabilitate Cod Code Probabilitate Probability Set ProbProb Set Set a 0.2 d a 0.1 0.2 b 0.4 e b 0.1 0.4 c 0.2 ca 0.2 d 0.1 0.1 c d 0.2 0.1 e 0.1 0.1 b e 0.4 0.1 17 Codificare Huffman 2. Insereaza prefixul ‘1’ in codurile literelor din prima multime Litera Letter Probabilitate Probability Set ProbProb Set Set a 0.2 d 0.1 0.1 b 0.4 e 0.1 0.1 c 0.2 a 0.2 0.1 0.1 c 0.2 0.1 0.1 b 0.4 d e Cod Code 1 18 Codificare Huffman 3. Insereaza prefixul ‘0’ in codurile literelor din a doua multime Litera Letter Cod Code Probabilitate Probability Set ProbProb Set Set a 0.2 d 0.1 0.1 b 0.4 e 0.1 0.1 c 0.2 a 0.2 d d 11 0.1 0.1 cc 0.2 0.2 e e 0 0.1 0.1 b b 0.4 0.4 19 Codificare Huffman 4. Litera Letter Uneste primele 2 multimi Cod Code Probabilitate Probability Set ProbProb Set Set a 0.2 de d 0.2 0.1 b 0.4 a e 0.2 0.1 c 0.2 ac 0.2 d 11 0.1 0.1 d c 0.4 0.2 e 0 0.1 0.1 b 0.4 20 Codificare Huffman 1. Sorteaza crescator multimile dupa probabilitate Litera Cod Probabilitate Set Prob Set a 0.2 de 0.2 b 0.4 a 0.2 c 0.2 c 0.2 b 0.4 d 1 0.1 e 0 0.1 21 Codificare Huffman 2. Insereaza prefixul ‘1’ in codurile literelor din prima multime Litera Letter Cod Code Probabilitate Probability Set ProbProb Set Set a 0.2 de 0.2 b 0.4 a 0.2 c 0.2 c 0.2 b 0.4 d 11 1 0.1 0.1 e 10 0 0.1 0.1 22 Codificare Huffman 3. Insereaza prefixul ‘0’ in codurile literelor din a doua multime Litera Letter Probabilitate Probability Set ProbProb Set Set 0.2 de 0.2 b 0.4 a 0.2 c 0.2 c 0.2 b 0.4 a Cod Code 0 d 11 11 0.1 0.1 e 10 10 0.1 0.1 23 Codificare Huffman 4. Litera Letter Uneste primele 2 multimi Probabilitate Probability Set ProbProb Set Set 0.2 dea de 0.4 0.2 b 0.4 ac 0.2 c 0.2 b c 0.4 0.2 b 0.4 a Cod Code 0 d 11 11 0.1 0.1 e 10 10 0.1 0.1 24 Codificare Huffman 1. Sorteaza crescator multimile dupa probabilitate Litera Letter Probabilitate Probability Set ProbProb Set Set 0.2 c dea 0.2 0.4 b 0.4 dea c 0.4 0.2 c 0.2 b 0.4 a Cod Code 0 d 11 11 0.1 0.1 e 10 10 0.1 0.1 25 Codificare Huffman 2. Insereaza prefixul ‘1’ in codurile literelor din prima multime Litera Letter a Cod Code 0 b Probabilitate Probability Set ProbProb Set Set 0.2 c 0.2 0.4 dea 0.4 b 0.4 c 1 0.2 d 11 11 0.1 0.1 e 10 10 0.1 0.1 26 Codificare Huffman 3. Insereaza prefixul ‘0 in codurile literelor din a doua multime Litera Letter a Cod Code 00 0 b Probabilitate Probability Set ProbProb Set Set 0.2 c 0.2 0.4 dea 0.4 b 0.4 c 11 0.2 d 011 11 0.1 0.1 e 001 10 0.1 0.1 27 Codificare Huffman 4. Litera Letter a Uneste primele 2 multimi Cod Code 00 b Probabilitate Probability Set ProbProb Set Set 0.2 cdea c 0.6 0.2 0.4 b dea 0.4 b 0.4 c 11 0.2 d 011 011 0.1 0.1 e 010 010 0.1 0.1 28 Codificare Huffman 1. Sorteaza crescator multimile dupa probabilitate Litera Letter a Cod Code 00 b Probabilitate Probability Set ProbProb Set Set 0.2 b cdea 0.4 0.6 0.4 cdea b 0.6 0.4 c 11 0.2 d 011 011 0.1 0.1 e 010 010 0.1 0.1 29 Codificare Huffman 2. Insereaza prefixul ‘1’ in codurile literelor din prima multime Litera Letter Cod Code Probabilitate Probability Set ProbProb Set Set a 00 0.2 b 0.4 b 1 0.4 cdea 0.6 c 11 0.2 d 011 011 0.1 0.1 e 010 010 0.1 0.1 30 Codificare Huffman 3. Insereaza prefixul ‘0’ in codurile literelor din a doua multime Litera Letter Cod Code Probabilitate Probability Set ProbProb Set Set a 000 00 0.2 b 0.4 b 11 0.4 cdea 0.6 c 01 1 0.2 d 0011 011 0.1 0.1 e 0010 010 0.1 0.1 31 Codificare Huffman 4. Litera Letter Uneste primele 2 multimi Cod Code Probabilitate Probability Set ProbProb Set Set a 000 0.2 abcde b 1.0 0.4 b 11 0.4 cdea 0.6 c 01 01 0.2 d 0011 0011 0.1 0.1 e 0010 0010 0.1 0.1 Sfarsit 32 Codificare Huffman Statistici exemplu: Lungime medie cod l = 0.4x1 + 0.2x2 + 0.2x3 + 0.1x4 + 0.1x4 = 2.2 bits/symbol Entropie H = s=a..eP(s) log2P(s) = 2.122 bits/symbol Redundanta l - H = 0.078 bits/symbol Peformantele sunt identice cu cele obtinute folosind codarea Shannon- Fano Diferenta consta in faptul ca prin codarea Huffman se garanteaza obtinerea unui cod optimal 33 Arbore Huffman 0 Litera 1 Cod a 000 b 1 c 01 d 0011 e 0010 0 0 a 0.2 1 1 0 b 0.4 c 0.2 1 e d 0.1 0.1 34 Arbore Huffman Litera Letter Cod Code b a 0.4 b c c d 1 e 0 0.2 a 0.2 0 0.2 1 e d 0.1 0.1 35 Arbore Huffman Litera Letter a Cod Code b 0 0.4 b c d 11 1 e 10 0 0 a 0.2 0.4 0 c 1 0.2 0.2 1 e d 0.1 0.1 36 Arbore Huffman Litera Letter a Cod Code 00 0 0 b c 1 d 011 11 e 010 10 0 a 0.2 0.4 0 0.6 b 1 0.4 c 1 0.2 0.2 1 e d 0.1 0.1 37 Arbore Huffman 0 Litera Letter 1.0 1 Cod Code a 000 00 b 1 c 01 1 d 0011 011 e 0010 010 0 0 a 0.2 0.4 0 0.6 b 1 0.4 c 1 0.2 0.2 1 e d 0.1 0.1 38 Arbore Huffman alternativ (1) Litera Letter Cod Code b a 0.4 b c 0 d 1 e 0 0.2 1 a c e d 0.2 0.2 0.1 0.1 39 Arbore Huffman alternativ (1) Litera Letter a Cod Code b 0 0.4 b c 1 d 11 e 0 0 0.4 1 0 0.2 1 a c e d 0.2 0.2 0.1 0.1 40 Arbore Huffman alternativ (1) Litera Letter a Cod Code 0 00 0 0.6 b 1 0.4 b c 01 1 d 11 1 e 10 0 0 0.4 1 0 0.2 1 a c e d 0.2 0.2 0.1 0.1 41 Arbore Huffman alternativ (1) 0 Litera Letter 1 Cod Code a 000 00 b 1 c 001 01 d 011 11 e 010 10 0 0 0.4 0.6 1 b 1 0.4 0 0.2 1 a c e d 0.2 0.2 0.1 0.1 Lungime medie cod l = 0.4x1 + (0.2 + 0.2 + 0.1 + 0.1)x3= 2.2 bits/symbol 42 Arbore Huffman alternativ (2) Litera Cod 1 0 a 00 b 11 c 01 d 101 a c e 100 0.2 0.2 0 0.4 1 0 0 Lungime medie cod 0.6 1 b 0.2 0.4 1 e d 0.1 0.1 l = 0.4x2+ (0.2 + 0.2)x2 + (0.1 + 0.1)x3= 2.2 bits/symbol 43 Arbori Huffman Minimali Codurile Huffman nu sunt unice Toate versiunile produc acceasi lungime medie Pe care sa il folosim? Pe acela cu varianta minima in lungimile codurilor Adica cel cu arborele cu cea mai mica inaltime De ce? Va asigura cel mai mic grad de variabilitate in fluxul codificat Cum se poate realiza? In timpul sortarii, solutioneaza egalitatile prin plasarea seturilor mici mai sus in arbore Alternativ, plaseaza seturile noi cat de jos posibil 44 Coduri Huffman Extinse Se considera sursa: A = {a, b, c}, P(a) = 0.8, P(b) = 0.02, P(c) = 0.18 H = 0.816 bits/symbol Codul Huffman: a b c 0 11 10 l = 1.2 bits/symbol Redundanta = 0.384 bits/symbol (47%!) Se poate si mai bine? 45 Coduri Huffman Extinse Incercam codificarea secventelor de 2 litere in loc de codificarea individuala a literelor Litera Probabilitate Cod aa 0.6400 0 ab 0.0160 10101 ac 0.1440 11 ba 0.0160 101000 bb 0.0004 10100101 bc 0.0036 1010011 ca 0.1440 100 cb 0.0036 10100100 cc 0.0324 1011 l = 1.7228/2 = 0.8614 Red. = 0.0045 bits/symbol 46 Coduri Huffman Extinse Ideea se poate extinde mai departe Se considera toate secventele nm posibile (am facut 32) In teorie, considerand mai multe secvente putem imbunatati compresia In realitate, cresterea exponentiala a alfabetului face acest lucru imposibil Ex., pentru lungime 3 avem 2563 = 224 = 16M secvente posibile Majoritatea secventelor vor avea frecventa zero 47 Codificare Huffman Dinamica Compresia dinamica (sau adaptiva) Huffman foloseste un arbore de codare ce este actualizat de fiecare data cand un simbol este citit din fisierul de intrare Arborele creste (se dezvolta, evolueaza) la fiecare simbol citit din fisierul de intrare Modul de evolutie al arborelui este identic la compresie si la decompresie Eficienta metodei se bazeaza pe o proprietate a arborilor Huffman, cunoscuta sub numele de proprietatea „fiilor” („sibling property”) 48 Codificare Huffman Dinamica Proprietate (sibling): Fie T un arbore Huffman cu n frunze. Atunci nodurile lui T pot fi aranjate intr-o secventa (x0, x1, ..., x2n-2) astfel incat: Secventa ponderilor (weight(x0), weight(x1), ..., weight(x2n-2)) sa fie in ordine descrescatoare Pentru orice i (0 ≤ i ≤ n-1), nodurile consecutive x2i+1 si x2i+2 sunt siblings (fii ai aceluiasi parinte) Compresia si decompresia utilizeaza arborele dinamic Huffman pornind de la un caracter virtual, notat – de exemplu – prin VIRT, sau NTI Acesta este intotdeauna nod terminal (frunza) 49 Codificare Huffman Dinamica De fiecare data cind un simbol este citit din fisierul de intrare se efectueaza urmatoarele operatii: Se scrie in fisierul destinatie codul simbolului: 1. Daca simbolul citit este nou, atunci se scrie codul caracterului virtual (NTI) (determinat din arborele de codare) urmat de codificarea in binar (ASCII) pe 9 biti a simbolului respectiv In caz contrar, se scrie cuvantul de cod al simbolului, determinat din arborele de codare Numai la primul simbol se scrie direct codul ASCII al acestuia pe 9 biti. 50 Codificare Huffman Dinamica Se introduce simbolul citit in arborele de codare: 2. Daca simbolul curent citit este nou, atunci din nodul virtual vor pleca doi fii: unul pentru simbolul citit si unul pentru simbolul virtual Nodul care a fost folosit ca nod virtual devine nod intermediar In caz contrar, se incrementeaza frecventa de aparitie a acestuia, prin marirea ponderii nodului corespunzator simbolului citit 51 Codificare Huffman Dinamica 3. Se ajusteaza arborele pentru indeplinirea proprieatatii sibling Trebuie considerate urmatoarele doua aspecte: la cresterea ponderii unui nod, frunza sau intermediar, trebuie modificate si ponderile ancestorilor sai pentru a pastra ordinea descrescatoare a ponderilor se judeca astfel: fie nodul frunza n ce are ponderea cu unu mai mare decat valoarea anteriora, deci el este cel care s-a modificat la pasul curent Pentru indeplinirea primei conditii a proprietatii sibling, nodul n este schimbat cu cel mai apropiat nod m (m < n) din lista, astfel incat weight(m) < weight(n) Apoi, aceeasi operatie este efectuata asupra parintelui lui n, pana cand se obtine nodul radacina sau este indeplinita primaconditia. Vezi COMENTARII pentru mai multe detalii! 52 Decodificarea Huffman Dinamica La decompresie, textul comprimat este verificat cu arborele de codare. Tehnica se numeste „parsing” La inceputul decompresiei, nodul curent este initializat cu radacina, ca la algoritmul de compresie, si – apoi – arborele evolueaza simetric La fiecare citire a unui simbol 0 se parcurge arborele in jos spre stanga; se parcurge arborele spre dreapta daca simbolul citit este 1 Cand se ajunge la un nod terminal (frunza) simbolul asociat este scris in fisierul de iesire si se ajusteaza arborele, la fel ca in faza de compresie Vezi COMENTARII pentru mai multe detalii! 53 Exemplu Input: aardvark Output: Simbol Cod NTI NTI 0 51 a r d v Coduri implicite putin mai eficiente sunt posibile (combinatie 4-/5-bit) k a b c d e 00000 00001 00010 00011 00100 f g h i j 00101 00110 00111 01000 01001 k l m n o 01010 01011 01100 01101 01110 p q r s t 01111 10000 10001 10010 10011 u v w x y 10100 10101 10110 10111 11000 54 Exemplu Input: aardvark 1 Output: 00000 Simbol 51 Cod NTI 0 a 1 NTI 0 1 49 50 a r d v k a b c d e 00000 00001 00010 00011 00100 f g h i j 00101 00110 00111 01000 01001 k l m n o 01010 01011 01100 01101 01110 p q r s t 01111 10000 10001 10010 10011 u v w x y 10100 10101 10110 10111 11000 55 Exemplu Input: aardvark 2 Output: 000001 Simbol 51 Cod NTI 0 a 1 NTI 0 2 a 49 50 r d v k a b c d e 00000 00001 00010 00011 00100 f g h i j 00101 00110 00111 01000 01001 k l m n o 01010 01011 01100 01101 01110 p q r s t 01111 10000 10001 10010 10011 u v w x y 10100 10101 10110 10111 11000 56 Exemplu Input: aardvark 3 Output: 000001010001 Simbol 51 Cod NTI 00 a 1 r 01 2 49 50 0 1 47 48 NTI d 1 v a r k a b c d e 00000 00001 00010 00011 00100 f g h i j 00101 00110 00111 01000 01001 k l m n o 01010 01011 01100 01101 01110 p q r s t 01111 10000 10001 10010 10011 u v w x y 10100 10101 10110 10111 11000 57 Exemplu Input: aardvark 4 Output: 0000010100010000011 Simbol NTI 51 Cod 000 a 1 r 01 1 d 001 47 2 2 49 50 1 a r 48 v k NTI 1 d 0 45 a b c d e 00000 00001 00010 00011 00100 f g h i j 00101 00110 00111 01000 01001 k l m n o 01010 01011 01100 01101 01110 46 p q r s t 01111 10000 10001 10010 10011 u v w x y 10100 10101 10110 10111 11000 58 Exemplu 4 51 Input: aardvark Output: 0000010100010000011000 Simbol NTI Cod 000 a 1 r 01 d 001 2 49 50 2 1 47 48 1 a r 1 d 45 v 2 46 k 1 v 0 NTI 43 a b c d e 00000 00001 00010 00011 00100 f g h i j 00101 00110 00111 01000 01001 44 k l m n o 01010 01011 01100 01101 01110 p q r s t 01111 10000 10001 10010 10011 u v w x y 10100 10101 10110 10111 11000 59 Exemplu 4 51 Input: aardvark Output: 0000010100010000011000 Simbol NTI Cod 000 a 1 r 01 d 001 2 49 50 2 1 47 48 1 a r 1 d 45 v 2 46 k 1 v 0 NTI 43 a b c d e 00000 00001 00010 00011 00100 f g h i j 00101 00110 00111 01000 01001 44 k l m n o 01010 01011 01100 01101 01110 p q r s t 01111 10000 10001 10010 10011 u v w x y 10100 10101 10110 10111 11000 60 Exemplu 4 51 Input: aardvark Output: 0000010100010000011000 Simbol NTI 3 2 49 50 Cod 1 000 a 1 r 01 d 001 a 2 r 47 48 1 1 d 45 v 46 k NTI 1 v 0 43 a b c d e 00000 00001 00010 00011 00100 f g h i j 00101 00110 00111 01000 01001 k l m n o 01010 01011 01100 01101 01110 44 p q r s t 01111 10000 10001 10010 10011 u v w x y 10100 10101 10110 10111 11000 61 Exemplu 4 51 Input: aardvark Output: 0000010100010000011000 Simbol NTI 3 2 49 50 Cod 1 000 a 1 r 01 d 001 a 2 r 47 48 1 1 d 45 v 46 k NTI 1 v 0 43 a b c d e 00000 00001 00010 00011 00100 f g h i j 00101 00110 00111 01000 01001 k l m n o 01010 01011 01100 01101 01110 44 p q r s t 01111 10000 10001 10010 10011 u v w x y 10100 10101 10110 10111 11000 62 Exemplu 5 51 Input: aardvark Output: 000001010001000001100010101 Simbol NTI 2 a 3 50 49 Cod 1 1100 2 r 47 48 a 0 r 10 d 111 1 v 1101 45 1 d 46 k NTI 1 v 0 43 a b c d e 00000 00001 00010 00011 00100 f g h i j 00101 00110 00111 01000 01001 k l m n o 01010 01011 01100 01101 01110 p q r s t 01111 10000 10001 10010 10011 44 u v w x y 10100 10101 10110 10111 11000 63 Exemplu 6 51 Input: aardvark 3 Output: 0000010100010000011000101010 3 a 49 50 Simbol NTI Cod 1 1100 2 r 47 48 a 0 r 10 d 111 1 v 1101 45 1 d 46 k NTI 1 v 0 43 a b c d e 00000 00001 00010 00011 00100 f g h i j 00101 00110 00111 01000 01001 k l m n o 01010 01011 01100 01101 01110 p q r s t 01111 10000 10001 10010 10011 44 u v w x y 10100 10101 10110 10111 11000 64 Codificare Huffman Adaptiva 7 51 Input: aardvark Output: 000001010001000001100010101010 Simbol NTI a 3 4 50 49 Cod 1100 2 2 r 47 a 0 r 10 d 111 1 v 1101 45 48 1 d 46 k NTI 1 v 0 43 a b c d e 00000 00001 00010 00011 00100 f g h i j 00101 00110 00111 01000 01001 k l m n o 01010 01011 01100 01101 01110 p q r s t 01111 10000 10001 10010 10011 44 u v w x y 10100 10101 10110 10111 11000 65 Exemplu 7 51 3 a 4 50 Input: aardvark 49 Output: 000001010001000001100010101010 1100 Simbol NTI 2 r 2 48 47 Cod 2 1100 1 d 45 a 0 r 10 d 111 1 v 1101 43 46 1 v 44 k NTI 0 1 41 42 k 66 Exemplu 7 51 3 a 4 50 Input: aardvark 49 Output: 000001010001000001100010101010 1100 Simbol NTI 2 r 2 48 47 Cod 2 1100 1 d 45 a 0 r 10 d 111 1 v 1101 43 46 1 v 44 k NTI 0 1 41 42 k 67 Exemplu 8 51 3 Input: aardvark Output: 000001010001000001100010101010 110001010 Simbol NTI a 5 50 49 2 r 3 48 47 Cod a 0 r 10 d 110 v 1111 k 11101 k 01010 2 1 d 11100 45 46 1 v 1 43 NTI 44 0 1 41 42 k 68 Exemplu Decodificare Output: Input: 000001010001000001100010101010 110001010 Simbol Cod NTI NTI 0 51 a r d v k a b c d e 00000 00001 00010 00011 00100 f g h i j 00101 00110 00111 01000 01001 k l m n o 01010 01011 01100 01101 01110 p q r s t 01111 10000 10001 10010 10011 u v w x y 10100 10101 10110 10111 11000 69 Exemplu Decodificare Output: a 1 Input: 000001010001000001100010101010 110001010 Simbol Cod NTI 0 a 1 51 NTI 0 1 49 50 a r d v k a b c d e 00000 00001 00010 00011 00100 f g h i j 00101 00110 00111 01000 01001 k l m n o 01010 01011 01100 01101 01110 p q r s t 01111 10000 10001 10010 10011 u v w x y 10100 10101 10110 10111 11000 70 Exemplu Decodificare Output: aa 2 Input: -----1010001000001100010101010 110001010 Simbol Cod NTI 0 a 1 51 NTI 0 2 a 49 50 r d v k a b c d e 00000 00001 00010 00011 00100 f g h i j 00101 00110 00111 01000 01001 k l m n o 01010 01011 01100 01101 01110 p q r s t 01111 10000 10001 10010 10011 u v w x y 10100 10101 10110 10111 11000 71 Exemplu Decodificare Output: aa 2 Input: ------010001000001100010101010 110001010 Simbol Cod NTI 0 a 1 51 NTI 0 2 a 49 50 r d v k a b c d e 00000 00001 00010 00011 00100 f g h i j 00101 00110 00111 01000 01001 k l m n o 01010 01011 01100 01101 01110 p q r s t 01111 10000 10001 10010 10011 u v w x y 10100 10101 10110 10111 11000 72 Exemplu Decodificare Output: aar 3 Input: -------10001000001100010101010 110001010 Simbol 51 Cod NTI 00 a 1 r 01 2 49 50 0 1 47 48 NTI d 1 v a r k a b c d e 00000 00001 00010 00011 00100 f g h i j 00101 00110 00111 01000 01001 k l m n o 01010 01011 01100 01101 01110 p q r s t 01111 10000 10001 10010 10011 u v w x y 10100 10101 10110 10111 11000 73 Exemplu Decodificare Output: aar 3 Input: ------------000001100010101010 110001010 Simbol 51 Cod NTI 00 a 1 r 01 2 49 50 0 1 47 48 NTI d 1 a r v k a b c d e 00000 00001 00010 00011 00100 f g h i j 00101 00110 00111 01000 01001 k l m n o 01010 01011 01100 01101 01110 p q r s t 01111 10000 10001 10010 10011 u v w x y 10100 10101 10110 10111 11000 74 Exemplu Decodificare Output: aard 4 Input: --------------0001100010101010 110001010 Simbol NTI 51 Cod 000 a 1 r 01 1 d 001 47 2 2 49 50 1 a r 48 v k NTI 1 d 0 45 a b c d e 00000 00001 00010 00011 00100 f g h i j 00101 00110 00111 01000 01001 k l m n o 01010 01011 01100 01101 01110 46 p q r s t 01111 10000 10001 10010 10011 u v w x y 10100 10101 10110 10111 11000 75 Exemplu Decodificare Output: aard 4 Input: -------------------00010101010 110001010 Simbol NTI 51 Cod 000 a 1 r 01 1 d 001 47 2 2 49 50 1 a r 48 v k NTI 1 d 0 45 a b c d e 00000 00001 00010 00011 00100 f g h i j 00101 00110 00111 01000 01001 k l m n o 01010 01011 01100 01101 01110 46 p q r s t 01111 10000 10001 10010 10011 u v w x y 10100 10101 10110 10111 11000 76 Exemplu Decodificare 4 51 Output: aardv Input: ----------------------10101010 110001010 Simbol NTI Cod 000 a 1 r 01 d 001 2 49 50 2 1 47 48 1 a r 1 d 45 v 2 46 k 1 v 0 NTI 43 a b c d e 00000 00001 00010 00011 00100 f g h i j 00101 00110 00111 01000 01001 44 k l m n o 01010 01011 01100 01101 01110 p q r s t 01111 10000 10001 10010 10011 u v w x y 10100 10101 10110 10111 11000 77 Exemplu Decodificare 5 51 Output: aardv Input: ---------------------------010 110001010 Simbol NTI 2 a 3 50 49 Cod 1 1100 2 r 47 48 a 0 r 10 d 111 1 v 1101 45 1 d 46 k NTI 1 v 0 43 a b c d e 00000 00001 00010 00011 00100 f g h i j 00101 00110 00111 01000 01001 k l m n o 01010 01011 01100 01101 01110 p q r s t 01111 10000 10001 10010 10011 44 u v w x y 10100 10101 10110 10111 11000 78 Exemplu Decodificare 6 51 Output: aardva Simbol NTI a 3 Input: ---------------------------010 110001010 3 50 49 Cod 1 1100 2 r 47 48 a 0 r 10 d 111 1 v 1101 45 1 d 46 k NTI 1 v 0 43 a b c d e 00000 00001 00010 00011 00100 f g h i j 00101 00110 00111 01000 01001 k l m n o 01010 01011 01100 01101 01110 p q r s t 01111 10000 10001 10010 10011 44 u v w x y 10100 10101 10110 10111 11000 79 Decodificare Huffman Adaptiva 7 51 Output: aardvar Simbol a 3 Input: ---------------------------10 110001010 4 50 49 Cod 1100 2 r 2 a 0 48 47 r 10 d 111 1 v 1101 45 NTI 1 d 46 k NTI 1 v 0 43 a b c d e 00000 00001 00010 00011 00100 f g h i j 00101 00110 00111 01000 01001 k l m n o 01010 01011 01100 01101 01110 p q r s t 01111 10000 10001 10010 10011 44 u v w x y 10100 10101 10110 10111 11000 80 Exemplu Decodificare 7 51 Output: aardvar Simbol a 3 Input: ----------------------------110001010 4 50 49 Cod 1100 2 r 2 a 0 48 47 r 10 d 111 1 v 1101 45 NTI 1 d 46 k NTI 1 v 0 43 a b c d e 00000 00001 00010 00011 00100 f g h i j 00101 00110 00111 01000 01001 k l m n o 01010 01011 01100 01101 01110 p q r s t 01111 10000 10001 10010 10011 44 u v w x y 10100 10101 10110 10111 11000 81 Exemplu Decodificare 7 51 Output: aardvark 3 Input: ---------------------------01010 Simbol a 4 50 49 Cod 1100 2 r 2 a 0 48 47 r 10 d 111 2 v 1101 45 NTI 1 d 46 k 1 v 1 43 k 01010 44 0 NTI 41 1 k 42 82 Exemplu Decodificare 8 51 3 a 5 50 Simbol 49 Cod 11100 2 r 3 a 0 48 47 r 10 d 110 v 1111 k 11101 NYT 2 1 d 45 46 1 v 1 43 NTI 44 0 1 41 42 k 83 Senzitivitatea la erori ale canalului de comunicatie Modelul de canal ales, fara erori, nu este un model foarte realist pentru un sistem de comunicatie De aceea, un criteriu de comparatie al diferitelor coduri este cel al sensibilitatii la erori Se pot considera doua tipuri de erori: erori de faza, in care un simbol este pierdut sau introdus in plus erori de amplitudine, in care un simbol al codului este schimbat Gradul in care aceste tipuri de erori degradeaza transmisia este un criteriu important in alegerea metodei de compresie 84 Senzitivitatea la erori ale canalului de comunicatie In cazul codurilor statice bloc-bloc o eroare de amplitudine duce la o decodare incorecta iar o eroare de faza duce la desincronizare si – ca efect - la decodari incorecte Totusi, codurile Huffman sunt autocorectoare La aparitia unei erori, se va decoda gresit cuvantul de cod unde a aparut eroarea si un numar de cuvinte dupa cel eronat, insa, la o distanta mare de eroare, decodarea nu mai introduce erori Solutia utilizata de codurile Huffman consta in adaugarea unei secvente de sincronizare la fiecare cuvant de cod De exemplu, o succesiune de 1 sau doi de 11, adaugate la sfarsitul fiecarui cuvant de cod permite stoparea propagarii erorii, deci obtinerea unor coduri auto-sincronizatoare, asa cum se intampla in cazul codurilor Fibonacci 85 Senzitivitatea la erori ale canalului de comunicatie Codurile adaptive sunt afectate mai mult de erorile de transmisie decat codurile statice, intrucat – la aparitia unei erori – se schimba radical tabele locala de codare Una din solutiile utilizate este impachetarea codurilor de compresie cu coduri detectoare si/sau corectoare de erori. 86 Compresia Huffman a Imaginilor Exemple Imagini: 256x256 pixels, 8 bits/pixel, 65,536 bytes Codificare Huffman a valorilor pixelilor Imagine Sena Earth Sensin Omaha Bits/pixel ytes) Rata Compresie Marime(b Sena 7.01 57,504 1.14 Sensin 7.49 61,430 1.07 Earth 4.94 40,534 1.62 Omaha 7.12 58,374 1.12 87 Compresia Huffman a Imaginilor Observatii Algoritmul Huffman standard produce rezultate modeste, cu exceptie pentru cazul Earth Multi pixeli negri produc o distributie convenabila Nu luam in considerare corelatii evidente ale valorilor pixelilor Codificare Huffman a diferentelor pixelilor Imagine Bits/pixel Marime (bytes) Rata Compresie Sena 4.02 32,968 1.99 Sensin 4.70 38,541 1.70 Earth 4.13 33,880 1.93 Omaha 6.42 52,643 1.24 88 Huffman (2 iteratii) vs Huffman Adaptiv 2 iteratii Adaptiv Imagine Bits/pixel Marime (bytes) Rata Compresie Sena 4.02 32,968 1.99 Sensin 4.70 38,541 1.70 Earth 4.13 33,880 1.93 Omaha 6.42 52,643 1.24 Imagine Bits/pixel Marime (bytes) Rata Compresie Sena 3.93 32,261 2.03 Sensin 4.63 37,896 1.73 Earth 4.82 39,504 1.66 Omaha 6.39 52,321 1.25 89 Compresia Huffman a textelor PDF(letters): US Constitution vs. Chapter 3 0 .1 2 P(Consitution) P(Chapter) 0 .1 0 Probability 0 .0 8 0 .0 6 0 .0 4 0 .0 2 0 .0 0 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Letter 90 Compresia Audio Huffman Codificare Huffman: 16-bit CD audio (44,100 Hz) x 2 canale (bits) Est. Marime Fisier Compresat (bytes) Rata Compresie 939,862 12.8 725,420 1.16 Cohn 402,442 13.8 349,300 1.15 Mir 884,020 13.7 759,540 1.30 Est. Marime Fisier Compresat (bytes) Rata Compresie Marime Initiala Entropie (bytes) Mozart Fisier Codificare Huffman a Diferentei Fisier Marime Initiala (bytes) Entropia Dif. (bits) Mozart 939,862 9.7 569.792 1.65 Cohn 402,442 10.4 261,590 1.54 Mir 884,020 10.9 602,240 1.47 91 Coduri Golomb Folosite pentru codificarea secventelor de numere intregi, unde probabilitatea de aparitie a numerelor este invers proportionala cu marimea acestora Cu cat numarul este mai mare, cu atat probabilitatea sa de aparitie este mai mica Ex.:cod unar Reprezentarea unara a unui numar urmata de ‘0’ 00 1 10 2 110 3 1110 … Identic cu codul Huffman pentru {1, 2, 3, …} si P(k) = 1/2k Optimal pentru modelul probabilistic 92 Coduri Golomb Familie de coduri bazata pe un parametru m Pentru a reprezenta un numar n, calculam: q = n/m (catul) r = n - qm (restul) Reprezentam q in cod unar, urmat de r in log2m bits Daca m nu e putere a lui 2 atunci folosim log2m bits Si mai bine, putem folosi: Reprezentarea in log2m-bits pentru 0 ≤ r ≤ 2 log2m-m-1, si Reprezentarea in log2m-bits a numarului r + 2 log2m-m pentru restul intervalului 93 Exemplu m=6 log2m = 2 log2m = 3 Coduri 2-bit pentru 0 r 2 log26-6-1 0 r 1 Coduri 3-bit de r+2 log26-6 pentru restul r+2 n q r 0 0 0 Cod 000 94 Exemplu m=6 log2m = 2 log2m = 3 Coduri 2-bit pentru 0 r 2 log26-6-1 0 r 1 Coduri 3-bit de r+2 log26-6 pentru restul r+2 n q r Cod 0 0 0 000 1 0 1 001 95 Exemplu m=6 log2m = 2 log2m = 3 Coduri 2-bit pentru 0 r 2 log26-6-1 0 r 1 Coduri 3-bit de r+2 log26-6 pentru restul r+2 n q r Cod 0 0 0 000 1 0 1 001 2 0 2 0100 96 Exemplu m=6 log2m = 2 log2m = 3 Coduri 2-bit pentru 0 r 2 log26-6-1 0 r 1 Coduri 3-bit de r+2 log26-6 pentru restul r+2 n q r Cod 0 0 0 000 1 0 1 001 2 0 2 0100 3 0 3 0101 97 Exemplu m=6 log2m = 2 log2m = 3 Coduri 2-bit pentru 0 r 2 log26-6-1 0 r 1 Coduri 3-bit de r+2 log26-6 pentru restul r+2 n q r Cod 0 0 0 000 1 0 1 001 2 0 2 0100 3 0 3 0101 4 0 4 0110 98 Exemplu m=6 log2m = 2 log2m = 3 Coduri 2-bit pentru 0 r 2 log26-6-1 0 r 1 Coduri 3-bit de r+2 log26-6 pentru restul r+2 n q r Cod 0 0 0 000 1 0 1 001 2 0 2 0100 3 0 3 0101 4 0 4 0110 5 0 5 0111 99 Exemplu m=6 log2m = 2 log2m = 3 Coduri 2-bit pentru 0 r 2 log26-6-1 0 r 1 Coduri 3-bit de r+2 log26-6 pentru restul r+2 n q r Cod 0 0 0 000 1 0 1 001 2 0 2 0100 3 0 3 0101 4 0 4 0110 5 0 5 0111 n q r 6 1 0 Cod 1000 100 Exemplu m=6 log2m = 2 log2m = 3 Coduri 2-bit pentru 0 r 2 log26-6-1 0 r 1 Coduri 3-bit de r+2 log26-6 pentru restul r+2 n q r 0 0 0 1 0 2 Cod n q r Cod 000 6 1 0 1000 1 001 7 1 1 1001 0 2 0100 3 0 3 0101 4 0 4 0110 5 0 5 0111 101 Exemplu m=6 log2m = 2 log2m = 3 Coduri 2-bit pentru 0 r 2 log26-6-1 0 r 1 Coduri 3-bit de r+2 log26-6 pentru restul r+2 n q r 0 0 0 1 0 2 Cod n q r Cod 000 6 1 0 1000 1 001 7 1 1 1001 0 2 0100 8 1 2 10100 3 0 3 0101 4 0 4 0110 5 0 5 0111 102 Exemplu m=6 log2m = 2 log2m = 3 Coduri 2-bit pentru 0 r 2 log26-6-1 0 r 1 Coduri 3-bit de r+2 log26-6 pentru restul r+2 n q r 0 0 0 1 0 2 Cod n q r Cod 000 6 1 0 1000 1 001 7 1 1 1001 0 2 0100 8 1 2 10100 3 0 3 0101 9 1 3 10101 4 0 4 0110 5 0 5 0111 103 Exemplu m=6 log2m = 2 log2m = 3 Coduri 2-bit pentru 0 r 2 log26-6-1 0 r 1 Coduri 3-bit de r+2 log26-6 pentru restul r+2 n q r 0 0 0 1 0 2 Cod n q r Cod 000 6 1 0 1000 1 001 7 1 1 1001 0 2 0100 8 1 2 10100 3 0 3 0101 9 1 3 10101 4 0 4 0110 10 1 4 10110 5 0 5 0111 104 Exemplu m=6 log2m = 2 log2m = 3 Coduri 2-bit pentru 0 r 2 log26-6-1 0 r 1 Coduri 3-bit de r+2 log26-6 pentru restul r+2 n q r 0 0 0 1 0 2 Cod n q r Cod 000 6 1 0 1000 1 001 7 1 1 1001 0 2 0100 8 1 2 10100 3 0 3 0101 9 1 3 10101 4 0 4 0110 10 1 4 10110 5 0 5 0111 11 1 5 10111 105 Coduri Golomb: Alegerea lui m Se considera o secventa binara Se poate codifica numarand subsecventele de cifre identice (de 0 sau 1) A.k.a. run-length encoding (RLE) Ex. 00001001100010010000000001001110000100001000100 ---4 -2 0--3 -2 --------9 -2 00---4 ---4 --3 -2 4,2,0,3,2,9,2,0,0,4,4,3,2 35 zerouri, 12 unu; P(0) = 35/(35+12) = 0.745 P(0) = 35/(35+12) = 0.745 log 2 1 p m log 2 p log 2 1 0.745 m 2 log 2 0.745 106 Concluzii Tabel comparativ Huffman static-dinamic, aplicatiile de compresie a textelor: Criteriul de comparatie Huffman static Huffman dinamic Codarea arborelui statica Dinamica Simbolul END Se adauga la sfarsitul mesajului si se codifica in binar. Se adauga la sfarsitul mesajului si se codifica in binar. Memorarea arborelui Da. Se salveaza la inceputul mesajului. Se transmite odata cu mesajul Codurile simbolurilor din mesaj Constante Variabile Complexitate + Raport de compresie + in 107