[[oktatas:programozás:algoritmusok|< Algoritmusok]]
====== LZ77 ======
* **Szerző:** Sallai András
* Copyright (c) 2014, Sallai András
* Szerkesztve: 2014, 2019, 2020
* Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]]
* Web: https://szit.hu
===== Az LZ77-ről =====
**Abraham Lempel** és **Jakob Ziv** publikálta 1977-ben. Innen a neve, bár LZ1 néven is használták.
Toló- vagy csúszóablakos tömörítés.
Egy k hosszúságú ablakot használunk, amelyet végigcsúsztatunk a tömörítendő karaktersorozaton.
A k ablak két részből áll. Egy hk hosszúságú keresőablakból és egy he hosszúságú előremutató ablakból.
===== Példa =====
TONINITONINIT
^ lépés ^ kimenet ^
| 1 | 0, 0, T |
| 2 | 0, 0, O |
| 3 | 0, 0, N |
| 4 | 0, 0, I |
| 5 | 2, 2 ,T |
| 6 | 6, 6, * |
===== Példa részletesen =====
Legyen egy karaktersorozat a példa kedvéért:
TONINITONINIT
A kódolása:
Legyenek a következő ablak méretek:
* h = 16
* hk = 8
* he = 8
TONINITONINIT
^ ^
teljes ablak
A kereső és az előremutató ablak ekkor:
TONINITONINIT
^ ^^ ^
| || |
kereső előrem.
Vegyük az előremutató ablak első karakterét:
TONINITONINIT
^
| || |
kereső előrem.
Ez "T" betű. Megkeressük a keresőablakban van-e ilyen karakter, a keresőablakban visszafele haladva.
A keresőablak üres, így csak lekódoljuk magát a T betűt. A kód kimenete három érték. Általánosan felírva:
index, hossz, karakter
* Az index, ha a keresőablakban volt ilyen karakter, akkor annak helye, ellenben 0
* A hossz, ha a keresőablakban volt ilyen karakter, akkor hány további karakter egyezik az előremutató és a keresőablakban.
* Ha nem volt egyezés felírjuk a karaktert, ha volt felírjuk az első nemegyező karaktert
Az első kódkimenet ezek alapján:
<0, 0, T>
Az egész ablakot eltoljuk jobbra eggyel:
TONINITONINIT
^
| || |
kereső előrem.
A következő az "O" betű. A keresőablakban nincs ilyen betű, ezért ezt is csak felírjuk:
<0, 0, T>
<0, 0, O>
Az egész ablakot eltoljuk jobbra eggyel:
TONINITONINIT
^
| || |
kereső előrem.
Az "N" betűvel az előbbiekhez hasonlóan járok el:
<0, 0, T>
<0, 0, O>
<0, 0, N>
Az "I" betűvel is:
<0, 0, T>
<0, 0, O>
<0, 0, N>
<0, 0, I>
A keresőablakunk, most egy olyan betűhöz ért, ami szerepel a keresőablakban.
TONINITONINIT
^
| || |
kereső előrem.
Felírjuk, a keresőablakban visszafele hányadik helyen van az "N" betű.
A számozást eggyel kezdem. Így a második helyet kell felírnunk.
Felírjuk a kettőt:
<2, . , .>
A másik két érték még kérdéses.
Megnézzük, hogy hány karakter egyezik N-től a kereső és az előremutató ablakban.
Egyezés "NI":
TONINITONINIT
^^^^
Amit kimenetként felírunk:
<2, 2 , T>
A harmadik helyre felírjuk az előremutató ablakban a következő nem egyező karaktert:
TONINITONINIT
^
A kódunk most így néz ki:
<0, 0, T>
<0, 0, O>
<0, 0, N>
<0, 0, I>
<2, 2 ,T>
A következő karaktert vesszük ez egy "O" betű:
TONINITONINIT
^
Nézzük, hol tart az ablak:
TONINITONINIT
^
| || |
kereső előrem.
Az "O" betű szerepel a keresőablakban, visszafele a 6-s helyen. Hat egyezés van.
Elfogytak a karakterek, így vége van.
A kódunk most így néz ki:
<0, 0, T>
<0, 0, O>
<0, 0, N>
<0, 0, I>
<2, 2 ,T>
<6, 6, *>
===== Segédeszköz =====
* https://szit.hu/lz
===== Gyakorlat =====
==== Feladat 001 ====
Dekódolja a következő kódot:
0,0,p
0,0,a
0,0,r
0,0,k
0,0,o
0,0,l
0,0,á
0,0,s
0,0,_
0,0,a
2,1,p
3,1,r
0,0,k
0,0,b
4,1,n
0,0,_
0,0,p
4,1,t
2,1,k
6,1m
0,0,e
0,0,l
1,1,e
0,0,t
1,1,null