• Nem Talált Eredményt

A Huffman-algoritmus

In document Informatikai rendszerek alapjai (Pldal 64-69)

Tömörítés, titkosítás

4. Tömörítés, titkosítás 1. Tömörítés

4.1.3. A Huffman-algoritmus

A Huffman-kódolás [4] fix hosszúságú kódokból (egymásutánírással) összerakott kódok tömörítésére használatos népszer˝u, hatékony és viszonylag egyszer˝u módszer. Az eljárás végrehajtása során táblázatot készítünk az egyes elemek (pl. képpontok vagy karakterek) kódjainak – az elemi kódoknak – el˝ofordulási gyakoriságáról. Ez alapján építjük fel az új kódokat (bináris jelsorozatok); változó hosszú kódszavakat használva, gyakoribb jelhez rövidebb kód tartozik, míg a ritkábbakhoz hosszabb (így érhet˝o el a tényleges tömörítés).

A hagyományos kódolási módszerek fix hosszú kódokat használnak, pl. karakterekre az ACSII kódolást.

A módszer veszteségmentes. Érdekesség, hogy a változó hosszú kódszavak egyértelm˝u visszafejtését az teszi lehet˝ové, hogy úgynevezett prefix kód [4] keletkezik (egyik elemi kód sem lehet kezd˝oszelete semelyik másik elemi kódnak). Az átkódolást, és ezáltal a tömörítést, egy tipikus mohó algoritmussal végezzük el.

4.1. definíció: A mohó algoritmus olyan optimummeghatározó módszer, amelyben minden elemi lépés lokális optimumot határoz meg abban a reményben, hogy ezáltal az összes elemi lépést végrehajtva a globális optimumhoz jutunk.

Bizonyítható, hogy a Huffman-kód optimális tömörítést ad, azaz az eredmény már nem javítható tovább, ill.

bármely más módszert alkalmazva sem kaphatunk jobb tömörítést (az igazolást nem tárgyaljuk). Ez azt jelenti, hogy a tömörítést megvalósító mohó algoritmus valóban globális optimumot állít el˝o. (Nem minden mohó algoritmus szolgáltat globális optimumot!) Az, hogy a tömörítés milyen mérték˝u lesz, nyilván a konkrét adatsor jellegzetességeit˝ol függ. Nagyon sok szabályosság, ismétl˝odés esetén akár az eredeti méret töredékét is elérhetjük, de nem teljesen egyenletes eloszlásnál minden esetben az eredetinél rövidebb kódot kapunk.

A módszer a tömörítés elvégzéséhez egy bináris irányított fagráfot épít fel, mégpedig úgy, hogy minden iterációs lépésben egy-egy farészlettel b˝ovül a fa, amíg fel nem épül.

4.2. definíció: A bináris fagráf egy olyan struktúra, amely pontokból és élekb˝ol épül fel a következ˝o szabályok szerint

• minden pontból vagy kett˝o vagy nulla él indulhat ki;

• egy pont – a gyökérpont – kivételével minden pontba pontosan egy él érkezik. A gyökérpontba nem érkezik él.

Azokat a pontokat, amelyekb˝ol nem indul ki él, leveleknek nevezzük. Egyetlen pontból is állhat a bináris fa, ebben az esetben a fának nincs éle! Az éleket és pontokat megcímkézhetjük, azaz kódokkal láthatjuk el

˝

oket. Ha a fagráfot le szeretnénk rajzolni, akkor a rajzon a pontokat valamilyen síkidommal, az éleket vonallal jelképezzük.

A tömörít˝o algoritmus a következ˝o:

1. Készítsünk egy táblázatot a tömöríteni kívánt kódban el˝oforduló elemi kódok gyakoriságáról. Adjunk meg annyi – egyetlen pontból álló – fagráfot, ahány elemi kódot találtunk, és minden pontra írjuk rá kódként ezt az elemi kódot és az el˝ofordulás gyakoriságát. Rendezzük növekv˝oen sorba a fagráfokat a gyökérponthoz rendelt gyakoriság szerint.

2. A sorba rendezett fagráfok közül vegyük ki az els˝o kett˝ot, és készítsünk bel˝olük egy új fagráfot úgy, hogy veszünk egy új pontot ez lesz a gyökérpont , ebb˝ol a pontból élet vezetünk mindkét fagráf gyökérpontjához. Bal él menjen a kisebb, jobb él menjen a nagyobb érték˝u gyökérponthoz. Ezzel ezek már nem lesznek gyökérpontok, hiszen mindegyikbe vezet már él. Az új pontot címkézzük meg a két felhasznált fagráf gyökérpontjában lév˝o gyakorisági értékek összegével (ez lesz az új fagráfban lév˝o elemi kódok gyakorisága). Az új fagráf új bal élére írjunk 0-t az új jobb élére 1-et, majd illesszük be a fagráfok sorába az új gráfot úgy, hogy a gyakoriság szerinti növekv˝o sorrend megmaradjon. (Megjegyzés: a fagráfok száma ezzel eggyel csökken!)

3. Ha egynél több fagráfunk van, ismételjük meg a 2. lépést.

4. Ha csak egy fagráf maradt, akkor ennek segítségével megállapíthatjuk az elemi kódok helyére írandó új kódot. Ugyanis ha megfigyeljük, ennek az egyetlen maradék fagráfnak a levélcímkéiben éppen az elemi kódok vannak, és ha a gyökérponttól valamelyik levélhez a gráf éleinek felhasználásával elmegyünk, és az érintés sorrendjében felírjuk az él címkéit, a kapott bitsorozat alkalmas helyettesít˝o kódja lehet a levél elemi kódjának. Az összes levélre felírva ezeket a kódokat, és a tömörítend˝o kódban ezekre lecserélve az összes elemi kódot, az eredeti tömörebb kódját kapjuk.

Be lehet bizonyítani, hogy az új kód nem hosszabb a réginél. Ha a régivel megegyez˝o hosszúságú, akkor a régi kód veszteség nélkül nem rövidíthet˝o, tömöríthet˝o.

Az algoritmus m˝uködését egy konkrét példán mutatjuk be [1]. Egy olyan, 100 000 karakterb˝ol álló szöveget szeretnénk tömöríteni, amelyben 6-féle karakter (mondjuk a, b, c, d, e, f bet˝uk) fordulhat el˝o. Az eredeti kódban a karakterek kódolására hárombites fix hosszúságú kódokat használtunk, a keletkezett kód hossza 300 000 bit. Ezen szeretnénk javítani a tömörítéssel. Az egyes karakterek ezerre redukált el˝ofordulási gyakoriságát a4.9. táblázat mutatja.

4.9. táblázat. Egy szövegben el˝oforduló bet˝uk gyakorisága

Karakterek a b c d e f

Gyakoriság ezerben 48 12 11 15 10 4

Az eljárás példánkra a következ˝o fát építi fel:

Az algoritmus els˝o lépésének eredménye.

Az algoritmus második lépésének els˝o végrehajtásával keletkezett gráfsorozat.

Az algoritmus második lépésének második végrehajtásával keletkezett gráfsorozat.

Az algoritmus második lépésének harmadik végrehajtásával keletkezett gráfsorozat.

Az algoritmus második lépésének negyedik végrehajtásával keletkezett gráfsorozat.

Az algoritmus második lépésének ötödik végrehajtásával keletkezett gráfsorozat.

Ez egyben a végeredmény is.

4.1. ábra. A Huffman-kódoló eljárás m˝uködése a fenti példára.

A fa alapján megállapított új elemi kódok a4.10. táblázatban vannak összegy˝ujtve. Ezekkel a régi elemi kódokat helyettesítve kapjuk a tömörített bitsorozatot.

Látható, hogy változó hosszú kódolásnál(48000·1 + 12000·3 + 11000·3 + 15000·3 + 10000·4 + 4000·4) = 218000 bit lesz a kód hossza. Ez nagyjából 27%-os megtakarítást eredményez.

A Huffman-kódolást gyakran használják a tömörít˝o programokban (természetesen más további algoritmusokat is).

4.10. táblázat. Az LZW tömörít˝o algoritmus alkalmazása

Karakterek a b c d e f

Fix hosszú kódszó 000 001 010 011 100 101 Változó hosszú kódszó 0 101 100 111 1101 1100 4.1.4. DCT-kódolás

Veszteséges tömörítésre alkalmas algoritmus. M˝uködése vázlatosan – kép tömörített kódjának megállapítására – a következ˝o:

Osszuk a képet négyzet alakú blokkokra. A négyzetek méretét a lefedett képponttal jellemezzük. (Pl. lehet 88 képpontot tartalmazó négyzet.) Minden négyzethez tartozó pontrendszert külön kódolunk, A négyzet bal fels˝o sarkában lév˝o pontnak – mint bázispontnak – valamilyen képpont kódolására alkalmas rendszerben megadjuk a kódját. A többi pontra meghatározzuk, hogy a bázisponttól mennyire tér el, ezt az eltérést kódolva kapjuk a pont kódját, ami rövidebb, mintha a bázispontra alkalmazott módszer szerint kódolnánk. Ez a kódolás a kép éles átmeneteit rontja, de megjelenhetnek a képen a blokkhatárok is.

Minél nagyobb a blokk mérete, annál kisebb méret˝u kódot kapunk, de annál rosszabb lesz a visszaállított kép min˝osége is.

In document Informatikai rendszerek alapjai (Pldal 64-69)