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