A tömörítő eljárások lényege: olyan változó szóhosszúságú kódot választunk, hogy a sokszor előforduló szimbólumokhoz rövidebb, míg a ritkábbakhoz hosszabb kódot rendelünk.
Egyszerű adattömörítési eljárás, amelynek lényege az, hogy:
| Szimbólum | Valószínűség | Kód | Szóhossz | 
|---|---|---|---|
| X1 | 0.25 | 00 | 2 | 
| X2 | 0.25 | 01 | 2 | 
| X3 | 0.125 | 100 | 3 | 
| X4 | 0.125 | 101 | 3 | 
| X5 | 0.0625 | 1100 | 4 | 
| X6 | 0.0625 | 1101 | 4 | 
| X7 | 0.0625 | 1110 | 4 | 
| X8 | 0.0625 | 1111 | 4 | 
8 szimbólumot használunk a kódolásnál, amelynek egyes szimbólumai a táblázatban megadott valószínűséggel szerepelnek a küldendő üzenetben. Ezeket előfordulási gyakoriság alapján csökkenő sorrendbe rendeztük, azaz a leggyakoribbak vannak elől. A harmadik oszlopban hozzárendeltük változó hosszúságú kódokat, a gyakoriakhoz hosszabbakat.
A 8 szimbólum teljes eseményrendszert alkot, hiszen egymást kizáró eseményekből áll, valamint a szimbólumok előfordulási valószínűségeik összege 1.
Tömörítsük az X2 X3 X8 X7 X1 üzenetet:
Az eredmény:
011001111111000
A tömörítés nélkül az üzenet hossza 4 * 5 azaz 20 bit lett volna. A tömörítés után 15 bitre csökkent.
Számítsuk ki a kód entrópiáját.
$$ H = - (\frac{2}{4}log\frac{1}{4} + \frac{2}{8} log \frac{1}{8} + \frac{4}{16} log \frac{1}{16}) = 2.75 \,\, [bit]$$
A Huffman kódolás egy veszteségmentes adatkompressziós algoritmus, amely a gyakrabban előforduló szimbólumokhoz rövidebb, míg a ritkábban előfordulókhoz hosszabb kódokat rendel. Ez az előfordulási gyakoriság alapján történik az adatban. Az eljárás optimális, mert a legkisebb átlagos kódhosszt eredményezi.
Kódoljuk a következő szöveget: BACADAEAFABBAAAGAH
| Karakter | Gyakoriság | 
|---|---|
| A | 9 | 
| B | 3 | 
| C | 1 | 
| D | 1 | 
| E | 1 | 
| F | 1 | 
| G | 1 | 
| H | 1 | 
Készítsük el a bináris fa leveleit úgy, hogy zárójelben feltüntetjük a gyakoriságokat:
Válasszuk ki a két legkisebb gyakoriságú levelet és vonjuk össze az alábbiak szerint:
Vonjuk össze a F és G leveleket is ugyanígy:
Vonjuk össze a D és E leveleket is ugyanígy:
Most a középső két levél tartalmazza legkisebb gyakoriságot, ezért vonjuk őket össze:
Most a B és a jobb oldali 2-vel jelölt levél tartalmazza legkisebb gyakoriságot, ezért ezeket vonjuk össze:
Most vonjuk össze az utolsó két megmaradt levelet:
A végén ez a fa lesz az eredmény:
A bináris fa létrehozása után, rendeljük a levelekhez a kódokat, felülről lefelé haladva balra mozdulva 0-val, jobbra mozdulva 1-el egészítjük ki a kódot.
| Karakter | Bináris kód | 
|---|---|
| A | 0 | 
| B | 100 | 
| C | 1100 | 
| D | 1110 | 
| E | 1111 | 
| F | 1010 | 
| G | 1011 | 
| H | 1101 | 
Az eredmény a következő lesz:
BACADAEAFABBAAAGAH -> 100|0|1100|0|1110|0|....|1101
Hasonló módon készül el a végleges kód, mint a Shannon-Fano kódolás esetén, csak itt a fa készítés segít a bináris hozzárendelés elkészítésében.
megjegyzés: a | karakter természetesen nincs benne az eredményben, itt csak az átláthatóság miatt szerepel, ebben a módszerben sincs és nem is kell elválasztó jelzés.
Ennél a módszernél, nem kell tudni a forrásadatokban szereplő szimbólum gyakoriságokat. Menet közben gyűjtünk információt a forrásszimbólumokról. Az LZW kódolás az úgynevezett adaptív kódok csoportjába tartozik.
Kiindulásként a kódtáblázat tartalmazza a forrás összes előforduló elemét. A kódoláskor az éppen aktuális pozíciótól kezdve addig olvassuk be a soron következő szimbólumokat egy bufferbe (b), amíg a sorozat szerepel a szótárban. Ha a soron következő karakter (c) az első olyan elem, amelyre bc már nem szerepel a szótárban, akkor b indexe lesz a soron következő kód a szótárban és a szótárt bc-vel bővítjük és c karaktertől folytatjuk a kódolást.
Ezt a tömör leírást egy példa alapján tesszük érthetővé.
Kódoljuk a következő sorozatot LZW kódolással:
dabbacdabbacdabbacdabbacdeecdeecdee
Megvizsgálva az adatforrást, látható hogy csak 5 különböző szimbólumból áll: (a,b,c,d,e). A szótárt kezdetben ezzel az 5 elemmel töltjük fel.
4,1,2,2,1,3,6,8,10,12,9,11,7,16,4,5,5,11,21,23,5
| index | bejegyzés | 
|---|---|
| 1 | a | 
| 2 | b | 
| 3 | c | 
| 4 | d | 
| 5 | e | 
| 6 | da | 
| 7 | ab | 
| 8 | bb | 
| 9 | ba | 
| 10 | ac | 
| 11 | cd | 
| 12 | dab | 
| 13 | bba | 
| 14 | acd | 
| 15 | dabb | 
| 16 | bac | 
| 17 | cda | 
| 18 | abb | 
| 19 | bacd | 
| 20 | de | 
| 21 | ee | 
| 22 | ec | 
| 23 | cde | 
| 24 | eec | 
| 25 | cdee | 
A Unix compress parancsa és a GIF (Graphics Interchange Format) képtömörítő eljárás is az LZW algoritmust alkalmazza.
Run-Length Encoding (RLE) – futáshossz kódolás.
A fentiekhez képes nagyon egyszerű, de mégis a gyakorlatban széleskörben használt kódolás.
Egyszerű tömörítési eljárás, amely a hosszasan ismétlődő azonos karaktereket, biteket egyetlen szimbólummal és egy ismétlésszámmal kódolja. Fekete-fehér képek tömörítésére használták korábban, de a TGA, PCX formátumok, valamint a FAX gépek is használják, textúra tömörítéshez is jó lehet. Példa alapján könnyen érthető.
Kódoljuk a következő karaktereket RLE kódolással:
WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWWW
12W1B12W3B24W1B14W
Melynek értelmezése: 12 darab W, 1 darab B, 12 darab W, 3 darab B, stb.
Így tehát a Run-Length Encodinggal kódolt szöveg az eredeti 67 karaktert 18-cal írja le. Természetesen a valóságban nem karakterekkel, hanem bináris kóddal használják.