Transcript LZW

Készítette: Lakos Péter
LZW-algoritmus:
Veszteségmentes tömörítő eljárás
Abraham Lempel és Jacob Ziv 1978-ban publikálták az LZ78
algoritmust
Az LZW ennek továbbfejlesztett változata, amit Terry Welch
publikált
1984-ben
Az LZW-algoritmust használja a compress / uncompress
parancs
UNIX rendszereken
Az LZW-algoritmus továbbfejlesztéseiből születtek a zip, gzip
és
bzip tömörítések
Feladat:
Adott egy T input string és egy S szótár
Az S a T-ben lévő betűkhöz és szavakhoz természetes
számokat
rendel
Készítsük el T kódját S kibővítésével, hogy az output kisebb
méretű
legyen, mint T!
Példa tömörítésre
T:
abababababab
Puffer:
-
S:
0:a
1:b
 Tegyük a beolvasott karaktereket a pufferba, amíg a
puffer tartalma + a következő karakter már nincs benne
a szótárban
 Írjuk ki a puffer tartalmát az outputra és vegyük fel
a szótárba a puffer tartalma + következő karaktert
 Ezután a puffer tartalma legyen ez a következő karakter
Példa tömörítésre
T:
abababababab
Puffer:
a-
S:
0:a
1:b
Beolvassuk
az a-t.
Az
a-t abetesszük
a pufferba
Ekkor
puffer
tartalma
+ a következő betű
(a) már megvan a szótárban, így
tovább mehetünk
Példa tömörítésre
T:
abababababab
Puffer:
ba
S:
0:a
1
:
b
0
2 : ab
Vegyük
Most
a puffer
fel
tartalmát
a szótárba
tartalma
(annak
a +puffer
következő
kódját)
karakter:
A
puffer
tartalma
legyen
ez
az tartalma
új karakter
(b)
+„ab”,
kiírjuk
következő
ami
az outputra
még
karaktert
nincs meg
(ab)a szótárban
Példa tömörítésre
T:
abababababab
01
És így tovább…
Puffer:
ba
S:
0:a
1:b
2 : ab
3 : ba
Példa tömörítésre
T:
abababababab
01
Puffer:
aab
2
„ab” már benne van a szótárban
S:
0:a
1:b
2 : ab
3 : ba
4 : aba
Példa tömörítésre
T:
abababababab
01
2
4
Puffer:
aaba
ab
b
S:
0:a
1:b
2 : ab
3 : ba
4 : aba
5 : abab
Példa tömörítésre
T:
abababababab
01
2
4 3
Puffer:
bba
S:
0:a
1:b
2 : ab
3 : ba
4 : aba
5 : abab
6 : bab
Példa tömörítésre
T:
abababababab
01
2
4 3
Puffer:
bbab
ba
S:
0:a
1:b
2 : ab
3 : ba
4 : aba
5 : abab
6 : bab
Példa tömörítésre
T:
abababababab
01
2
4 3
Puffer:
bab
6
A
kapott kód
tehát:tartalmát
Végezetül
a puffer
0kiírjuk
1 2 4az
3 6outputra
S:
0:a
1:b
2 : ab
3 : ba
4 : aba
5 : abab
6 : bab
Példa visszafejtésre
Input:
0
1
2
4
3
6
S:
0:a
1:b
A tömörítés logikáját alkalmazzuk visszafelé.
Példa visszafejtésre
Input:
0
1
2
4
3
6
S:
0:a
1:b
a
A 0-s kód megvan a szótárban, jelentése: a
Példa visszafejtésre
Input:
0
1
2
4
3
6
S:
0:a
1:b
a
A piros nyíl jelzi, hol tartott ekkor a tömörítés.
Példa visszafejtésre
Input:
0
1
a
b
2
4
3
6
S:
0:a
1:b
2 : ab
AzÉs„ab”
így tovább…
ekkor még nem volt benne a szótárban,
ezért most bekerült
Példa visszafejtésre
Input:
0
1
2
a
ab
b
4
3
6
S:
0:a
1:b
2 : ab
3 : ba
A 4-es kód ismeretlen, de tudjuk,
hogy ezen a ponton egy abx szó került be
a szótárba 4-esként
Példa visszafejtésre
Input:
0
1
2
4
a
ab
abx
b
3
6
S:
0:a
1:b
2 : ab
3 : ba
4 : abx
A 4-es kód ismeretlen, de tudjuk,
hogy ezen a ponton egy abx szó került be
a szótárba 4-esként
Példa visszafejtésre
Input:
0
1
2
4
a
ab
abx
aba
b
3
6
S:
0:a
1:b
2 : ab
3 : ba
4 : abx
aba
Ezt visszahelyettesítve látjuk, hogy x = a
Példa visszafejtésre
Input:
0
1
2
4
a
ab
aba ba
b
3
6
S:
0:a
1:b
2 : ab
3 : ba
4 : aba
5 : abab
Példa visszafejtésre
Input:
0
1
S:
2
4
3
6
0:a
1:b
2 : ab
a
b
ab aba ba bay
3 : ba
4 : aba
5 : abab
A 6-os kód szintén ismeretlen,
ugyanúgy járunk el, mint korábban 6 : bay
Példa visszafejtésre
Input:
0
1
2
4
a
ab
aba ba
b
3
6
bay
bab
S:
0:a
1:b
2 : ab
3 : ba
4 : aba
5 : abab
bay
6 : bab
Példa visszafejtésre
Input:
0
1
2
4
a
ab
aba ba
b
3
Az input végére értünk,
a kapott string tehát:
abababababab
6
bab
S:
0:a
1:b
2 : ab
3 : ba
4 : aba
5 : abab
6 : bab
Megjegyzés:



A szótárat nem kell elküldeni a címzettnek, a példában
látott módon a visszafejtő algoritmus azt megkonstruálja
DE a szövegben lévő betűk kódját ismerni kell a
visszafejtés elkezdése előtt (lehet közös kódkészlet)
További információk, példa:
http://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Wel
ch