[[oktatas:programozás:algoritmusok|< Algoritmusok]] ====== LZW ====== * **Szerző:** Sallai András * Copyright (c) 2014, Sallai András * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== Az LZW kódolásról ===== Az LZ77, majd az LZ78 továbbfejlesztett verziója. Abraham Lempel, Jacob Ziv és Terry Welch munkája. 1984-ben publikálta Terry Welch. A Unix compress parancsa ezzel az algoritmussal tömörít, de használjuk a GIF képekben is. Szemben az LZ78 kódolással, az LZW kódoló szótára induláskor nem üres. Tartalmaz minden egyedi karaktert, ami a kódolandó szövegben megtalálható. Ugyanakkor a kibontáshoz nem szükséges tárolni a szótárt, mert az újból felépíthető a kód alapján. Az alapszótár, azonban egységes kell legyen a kibontás és tömörítés során egyaránt. Mivel minden karakter benne van kezdéskor a szótárban, ezért a kódolás minden lépése egy prefix karakterrel történik. Így az első keresés után két karakterünk van. ===== Működés ===== Induláskor, a könyvtár tartalmaz minden lehetséges karaktert, az S pedig üres. s <- üres ciklus amíg van adat ch <- adat[következő] ha szotar.tartalmazza(s + ch) akkor s <- s + ch ellenben kimenet.hozzáfűz(lekerIndex(s)) szotar.hozzáfűz(s + ch) s <- ch ha vége ciklus vége kimenet.hozzáfűz(lekerIndex(s) ===== Példa ===== ^ A kódolandó karakterfolyam ^^^^^^^^^^ ^ Pozíció ^ 1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 6 ^ 7 ^ 8 ^ 9 ^ ^ Karakter | A | B | B | A | B | A | B | A | C | ^ Kezdőszótár ^ | (1) A | | (2) B | | (3) C | ^ A kódolás folyamat ^^^^ ^ Lépés ^ Pozíció ^ Szótár ^ Kimenet ^ | 1 | 1 | (4) A B | 1 | | 2 | 2 | (5) B B | 2 | | 3 | 3 | (6) B A | 2 | | 4 | 4 | (7) A B A | 4 | | 5 | 5 | (8) A B A C | 7 | | 6 | -- | -- | 3 | ===== Java megvalósítás ===== static String lzwCompress(String text, ArrayList dic) { StringBuilder output= new StringBuilder(); String s = ""; for(int i= 0; i A metódust meglehet úgy is írni, hogy egy byte összes variációja eleve szerepel a szótárban, ekkor nem szükséges második paraméter.