Documente Academic
Documente Profesional
Documente Cultură
Codarea Lempel-Ziv
Cuprins
Introducere
Ideea compresiei bazate pe dictionar. Exemplu.
Algoritmul Lempel-Ziv
Algoritmul Lempel-Ziv-Welch
Implementare si Exemple
Concluzii
Introducere
Folosit in compress -uncompress, gzip-gunzip din UNIX , sau WinZip din Windows.
Un dictionar static este construit si transmis odata cu textul comprimat si este folosit
ca referintele citate intr-o lucrare stiintifica. Un dictionar static este construit inaintea
efectuariii compresiei si ramane neschimbat pe toata durata acesteia.
Dezavantajul folosirii unui dictionar static apare la compresia fisierelor mici, cand,
din cauza transmisiei/memorarii atat a dictionarului cat si a fisierului comprimat,
raportul de compresie nu este foarte bun, de multe ori chiar subunitar. De aceea, cei
mai raspanditi sunt algoritmii de compresie bazati pe dictionare adaptive.
Cel mai folosit algoritm de compresie bazat pe dictionar este cel propus de Jacob Ziv
si Abraham Lempel, in doua variante: prima din 1977, cunoscuta sub numele de
LZ77, si – a doua, din 1978, cunoscuta sub numele de LZ78.
1
Un exemplu: Fie mesajul „Titlul acestui capitol este compresia datelor”.
Fie conventia reprezentarii unui cuvant dintr-o carte prin doua atribute, sub forma:
(Numarul_paginii) / (numarul_cuvantului_din_pagina).
Cuvantul „Titlul” este inlocuit prin 500/3, ceea ce reprezinta al treilea cuvant de pe
pagina 500.
n = [log2(NP)] + [log2(NR)].
8 NS 8
RC( biti )
log( NP ) log( NR ) NS log( NP ) log( NR )
Exemplu numeric: Fie NP = 2200 pagini; sunt necesari log2(2200) = 11.03 -> 12 biti
pentru a coda numarul paginii.
Fie NR = 256. Pentru reprezentarea binara a unui cuant este nevoie de log 2(256) = 8
biti.
320biti
Raportul de compresie este RC( biti ) 3.06 .
120biti
■
2
Algoritmul Lempel-Ziv
001101100011010101001001001101000001010010110010110
1). Se imparte mesajul in subsiruri, astfel incat la fiecare definitie a unui subsir sa
nu existe repetitiii, deci el sa nu fi fost definit anterior.
1.1 La inceputul sirului se pune o virgula pentru a evidentia sirul de lungime zero.
1.2 Se pune apoi o virgula dupa primul zero, intrucat nu a mai aparut.
1.3. Al doilea bit este zero si se considera si al doilea simbol, obtinandu-se sirul 01.
Intrucat acesta este sir nou se pune virgula.
1.4 Urmeaza simbolul 1, care fiind caracter nou, atrage virgula dupa el.
,0,01,1,011,00,0110,10,101,001,0010,
01101,000,00101,001011,0010110
Mesaj = 110010101000111101010100101011101011
Dictionar = ,1,10,0,101,01,00,011,11,010,1010,0101,0111,01011
3) C
odarea sirurilor, astfel obtinute. Se completeaza un tabel de forma de mai jos, in
care se definesc: sirul, numarul ce arata pozitia sirului, prefixul, numarul ce arata
pozitia prefixului, si codul sirului. Codul sirului este obtinut considerand numarul ce
arata pozitia prefixului urmat de ultimul bit al sirului considerat.
3
Nr. Codarea Codarea
sirului Sirul pozitiei Prefix pozitiei Sir
sirului prefixului codat
1. 0 0001 empty 0 = 0000 0000+0 = 00000
2. 01 0010 0 1 = 0001 0001+1 = 00011
3. 1 0011 empty 0 = 0000 0000+1 = 00001
4. 011 0100 01 2 = 0010 00101
5. 00 0101 0 1 = 0001 00010
6. 0110 0110 011 4 = 0100 01000
7. 10 0111 1 3 = 0011 00110
8. 101 1000 10 7 = 0111 01111
9. 001 1001 00 5 = 0101 01011
10. 0010 1010 001 9 = 1001 10010
11. 01101 1011 0110 6 = 0110 01101
12. 000 1100 00 5 = 0101 01010
13. 00101 1101 0010 10 = 1010 10101
14. 001011 1110 00101 13 = 1101 11011
15. 0010110 1111 001011 14 = 1110 11100
Secventa comprimata este format prin concatenarea tuturor sirulor codate, aflate in
ultima coloana a tabelului de mai sus. Se obtine:
00000-00011-00001-00101-00010-01000-00110-01111
01011-10010-01001-01010-10101-11011-11100
15 * 8
RC 1 .6
15 * 5
4
Algoritmul Lempel-Ziv-Welch
Dictionarul = 'a' 'b' 'ab' 'bb' 'ba' 'aa' 'abb' 'baa' 'aba' 'abba' 'aaa'
'aab' 'baab' 'bba'
code = '1' '2' '2' '1' '3' '5' '3' '7' '6' '6' '8' '4'
23 * 8 184
RC 3.53
13* 4 52
■
D= 'a' 'b' 'c' 'ab' 'ba' 'abc' 'cb' 'bab' 'baba' 'aa' 'aaa' 'aaaa'
code = '1' '2' '4' '3' '5' '8' '1' '10' '11'
5
17 * 8 136
RC 2.61
13* 4 52
■
Exemplul 3 (Tema pentru acasa): Fie alfabetul A /, W, E, D, T, B si mesajul
in /WED/WE/WEE/WEB/WET . Rezultatele:
Dictionarul = '/' 'W' 'E' 'D' 'T' 'B' '/W' 'WE' 'ED' 'D/' '/WE' 'E/'
'/WEE' 'E/W' 'WEB' 'B/' '/WET'
code = '1' '2' '3' '4' '7' '3' '11' '12' '8' '6' '11'
■
CONCLUZII
LZW scrie datele compresate sub forma de octeti si nu ca si cuvinte, ceea ce face ca
datele comprimate sa fie independente de platforma.
Cand se comprima fisiere text, LZW initializeaza primele 256 intrari ale dictionarului
cu codul ASCII ca fiind fraze (siruri de lungime 1). Mai departe, toate subsirurile
sunt construite pe baza simbolurilor individuale, definite anterior.
Pentru secvente de intrare foarte mari lungimea dictionarului poate creste foarte mult.
De aceea, in practica, dimensiunea dictionarului este limitata la 4096 cuvinte, ceea ce
corespunde la o reprezentare a indexului (codul cuvintelor sir din dictionar) de 12
biti.
6
Anexa 2 – Codul Matlab pentru codarea LZW (Lempel-Ziv-Welch)
clc; clear;
% se considera initializat dictionarul cu ASCII de la 0-255;
A = 'ab' ; % alfabetul
in = 'abbaabbaababbaaaabaabba'; % secventa de intrare;
for i=1:length(A), D(i) = {A(i)}; end; % initializare dictionar:
% initializari:
i=1;
gata = 0;
code=[];
% Rezultate:
code-corect = '1-2-2-1-3-5-3-7-6-6-8-4-1';
7
dictionar-corect = 'a-b-ab-bb-ba-aa-abb-baa-aba-abba-aaa-aab-baab-bba';