Készítette: Lakos Péter LZW-algoritmus 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: a b a b a b a b a b a b 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: a b a b a b a b a b a b Puffer: S: 0 : a 1 : b a - Beolvassuk az a-t. Az a-t betesszük a pufferba Ekkor a 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: a b a b a b a b a b a b Puffer: S: 0 : a 1 : b Vegyük fel a szótárba a puffer tartalma + következő karaktert (ab) A puffer tartalma legyen ez az új karakter (b) Most a puffer tartalma + következő karakter: „ab”, ami még nincs meg a szótárban A puffer tartalmát (annak kódját) kiírjuk az outputra
Példa tömörítésre T: a b a b a b a b a b a b Puffer: S: 0 : a 1 : b 1 És így tovább…
Példa tömörítésre T: a b a b a b a b a b a b Puffer: S: 0 : a 1 : b 1 2 „ab” már benne van a szótárban
Példa tömörítésre T: a b a b a b a b a b a b Puffer: S: 0 : a 1 : b 1 2 4
Példa tömörítésre T: a b a b a b a b a b a b Puffer: S: 0 : a 1 : b 1 2 4 3
Példa tömörítésre T: a b a b a b a b a b a b Puffer: S: 0 : a 1 : b 1 2 4 3
Példa tömörítésre T: a b a b a b a b a b a b Puffer: S: 0 : a 1 : b 1 2 4 3 6 A kapott kód tehát: 0 1 2 4 3 6 Végezetül a puffer tartalmát kiírjuk az outputra
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 2 4 3 6 S: 0 : a 1 : b 2 : ab a b Az „ab” ekkor még nem volt benne a szótárban, ezért most bekerült És így tovább…
Példa visszafejtésre Input: 0 1 2 4 3 6 S: 0 : a 1 : b 2 : ab 3 : ba a 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 3 6 S: 0 : a 1 : b 2 : ab 3 : ba 4 : abx a b ab 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 3 6 S: 0 : a 1 : b 2 : ab 3 : ba 4 : abx a b ab aba abx 4 : aba Ezt visszahelyettesítve látjuk, hogy x = a
Példa visszafejtésre Input: 0 1 2 4 3 6 S: 0 : a 1 : b 2 : ab 3 : ba
Példa visszafejtésre Input: 0 1 2 4 3 6 S: 0 : a 1 : b 2 : ab 3 : ba 6 : bay a b ab aba ba bay A 6-os kód szintén ismeretlen, ugyanúgy járunk el, mint korábban
Példa visszafejtésre Input: 0 1 2 4 3 6 S: 0 : a 1 : b 2 : ab 3 : ba 6 : bay a b ab aba ba bab bay 6 : bab
Példa visszafejtésre Input: 0 1 2 4 3 6 S: 0 : a 1 : b 2 : ab 3 : ba Az input végére értünk, a kapott string tehát: abababababab
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%93Welch