# Huffman kodifikazio

Huffman kodifikazioa algoritmo bat da, konputazio-zientzia eta informazioaren teorian erabiltzen dena datuen konpresiorako. Luzera aldakorreko kodeetan oinarritzen den metodo bat da, agertzen diren sinbolo edo karaktereen maiztasunaren arabera, hauei kode zehatz bat esleitzeko erabiltzen dena.
David A. Huffmanek garatutako metodo bat da, MITen doktoretza gauzatzen zuen bitartean garatutakoa. Hau A Method for the Construction of Minimum-Redundancy Codes delako artikuluan argitaratu zen.

## Historia

1951. urtean David Huffman eta bere klasekideek aukera izan zuten Informazioaren Teoria irakasgaian amaierako azterketa egin edo lan bat aurkezteko. Irakasleak lanaren nondik norakoak zehaztu zituen: kodifikazio bitar eraginkorrena bilatzearen inguruko lan bat. Huffman, kodifikazio eraginkorrena bilatzearen zailtasuna zela-eta, azterketarako ikasten hasi zen; baina ikasten ari zela ideia bat bururatu zitzaion: sinboloen probabilitatean oinarritutako zuhaitz bitarrak erabiltzea kodifikatzeko. Ideia hau landuz, metodorik eraginkorrena zela frogatu zuen.
Lan honekin Huffmanek bere irakaslea gainditu zuen, irakaslea Claude Shanonekin jardun baitzen antzeko kodifikazio bat sortu nahian. Huffmanek Shanon-Fano kodifikazioaren errore gehienak konpondu zituen bere metodoaren bidez.

## Kodifikazioa

Kodifikazioaren oinarria da jatorriko informazio batetik hasita honi aldaketak aplikatu eta helburuko informazio bat lortzea, honela informazio bera lortzen da era ezberdinetan adierazita. Kodifikazioak helburu asko izan ditzake: erroreak saihestea, informazioa babestea, seinale analogikotik digitalera pasatzea, etab. Bada beste helburu bat duen kodifikazioa ere: datu gutxiago erabiliz informazio berdina transmititzea, alegia.
Konpresioa termino garrantzitsua da. Honen helburua datuen tamaina murriztea da, baina ahalik eta jatorriko informazio gutxien galduta. Hau informazioaren teorian asko aztertu den arlo bat da; izan ere, informazioa gordetzeko edo transmititzeko orduan baliabideak finituak dira eta, honenbestez, datuen tratamendu ona ezinbestekoa da.
Adibidez, kodifikazioa gauzatzen den kasu bat ondorengoa izango litzateke: Demagun eguraldiaren informazioa adierazten duen sentsore bat dagoela, eta honek datuak aztertzeko ikerketa zentro batera informazioa bidaltzen duela. Eguraldia adieratzeko honako hau egin daiteke sistema bitarra erabiliz:
00 → Eguzkitsua
01 → Lainotsua
10 → Euritsua
11 → Ekaitza
Metodo honetan 2 bit erabili dira egoera bakoitza adierazteko. Honela, egoera bakoitzean, sentsoreak eguraldia aztertuko du, eta egunaren arabera aurretik zehaztutako kodifikazio bidez, eguraldiaren datuak bidaliko ditu ikerketa zentrora. Kodifikatzeko metodo bat izango litzateke goiko adibidea, non printzipioz ausaz ezarri diren egoera bakoitzerako kodeak; halabaina, badaude kodeketa gauzatzeko beste metodo batzuk ere.
Orain demagun ikerketa zentroa oso gune eguzkitsuan dagoela, egoera honetan, sentsoreak ia beti "00" kodea bidaliko du, eta oso gutxi gainontzeko kodeak. Hau ikusita, bidea ez litzateke eguraldia adierazten duten datu guztiei pisu berdina ematea. Izan ere, gehien agertzen den kodeari (eguzkitsua) pisu gutxiago emanez gero (hau da, bi bit izan beharrean bit bakarra izatea) honen transmisio pisua erdira jaitsiko litzateke, "00" transmititu beharrean '0' soilik transmitituz, adibidez. Hau eginda, kodifikatzean konpresioa gauzatu da. Eguraldi eguzkitsua adierazteko bit gutxiago erabiliz gero, baliabide gutxiago beharko dira. Hau luzera aldakorreko kodeen oinarria da, eta printzipio honetan oinarritzen da Huffman kodifikazioa.
Kodifikatzeko sistema hau metodo estatisko batean oinarritzen da. Sinboloen probabilitateak aztertzen dira, bai letrak, zenbakiak zein eguraldia izan, hauen agerpenaren arabera bit gehiago edo gutxiago esleitzeko gehien erabiliko diren sinboloei. Hau dela eta, kodifikazio estatistiko deitzen zaie Huffman bezalako kodifikazioei.
Kodifikazioen efizientzia aztertzerako orduan, garrantzitsua den aldagai bat ezagutu behar da: sinboloen bataz besteko luzera (l). Bere izenak dioen moduan, aldagai honek egoera zehatz bateko sinbolo guztien kodifikazioen luzeren bataz bestekoa adierazten du. Hau zenbat eta txikiagoa izan, kodifikazioa efizienteagoa izango da konpresioaren ikuspuntutik.
$\textstyle l=\sum _{k=1}^{N}P_{k}\times l_{k}\displaystyle$

## Huffman kodifikazioa

Huffman kodeketaren oinarria, beraz, sinboloak agertzen diren probabilitatearen arabera kodifikazio bitar motz bat esleitzea da; sinboloa zenbat eta gehiago agertu, orduan eta kode motzago bat ematen zaio. Algoritmoaren errendimentu optimoa lortuko da karaktere bakoitzari esleitutako bit kopurua, bere probabilitatearen logaritmoaren proportzionala denean.

### Huffmanen metodoa

Metodoa ondorengo irudian ikusten den bezalako zuhaitz bitar baten sorreran oinarritzen da, non zuhaitzaren tamaina sinbolo kopuruaren araberako izango den.
Pausoak:
0 pausoa: Sinboloak identifikatzen dira eta bakoitzaren agerpen probabilitateak zehaztu. Sinboloak probabilitate txikienetik handienera antolatzen dira.
1 pausoa: Sinboloak ordenatuta izanik, probabilitate txikieneko bi sinboloak nodo batengatik ordezkatuko dira. Nodo berriak bi adarkadura izango ditu, hauek nodoa eraiki duten bi sinboloak izango dira. Nodoaren probabilitatea batu diren bi sinboloen probabilitateen batura izango da.
2 pausoa: Nodo berriarekin berriro 2 pausora itzuliz, prozesua errepikatuko da.
3 pausoa: Behar bezain beste aldiz errepikatuko dira 0→ 1→ 2 pausoak, nodo bakarra gelditu arte.
Behin zuhaitza eraikita, nodoetatik irteten diren adar bakoitza 0 edo 1 kodeaz izendatuko dira. Honela, adar bakoitza izendatuta izanda, zuhaitzaren errotik kodetu nahi den sinbolorako bidea gauzatuko da, eta bidean zeharkatutako adarretako kodeak hartuz sinboloaren kodea lortuko da.
Irudian ikusten den moduan, D sinboloak, probabilitate handiena duen sinboloak hain zuzen, kode laburrena dauka, eta A eta B sinboloek kode luzeena izango dute, agertzeko probabilitate gutxien daukatenak baitira.
Honako emaitzak lortu dira algoritmoa erabiliz:
D → 1
C → 01
A → 000
B → 001
Kodeketa erabiliz lortutako emaitza kodeketa egiten ez den kasuarekin konparatzen bada:
Kodeketa egin gabe: A, B, C eta D sinboloak izanda, 4 sinbolo adierazteko 2 bit beharko dira: 00, 01, 10 eta 11. Kodearen bataz besteko luzera kalkulatzen bada:
$\textstyle \sum _{k=1}^{N}P_{A}\times l_{A}+P_{B}\times l_{B}+P_{C}\times l_{C}+P_{D}\times l_{D}\displaystyle$
$\textstyle \sum _{k=1}^{N}0,1\times 2bit+0,2\times 2bit+0,3\times 2bit+0,4\times 2bit=2bit\displaystyle$
Kodeketa eginez:
$\textstyle \sum _{k=1}^{N}0,1\times 3bit+0,2\times 3bit+0,3\times 2bit+0,4\times 1bit=1,9bit\displaystyle$
Emaitzetan ikusten da kodeketa eginez sinboloko bataz besteko luzera txikiagoa dela. Diferentzia ez da oso handia, baina kontuan hartu behar da hau adibide oso sinple bat dela eta emaitza hauek funtzionamendua aztertzeko soilik balio dutela.

### Huffman moldagarria edo dinamikoa

Huffmanen metodo originala semi-moldagarria zen. Izan ere, honek bi prozesatze gauzatzen zituen: lehenengoa, sinboloen estatistikak lortzeko; eta, bigarrena, konpresioa egiteko estatistika horien arabera. Bi pauso hauen artean zuhaitz bitarra sortzen zuen. Bi aldiz prozesatu beharrak metodoa motela izatea dakar eta, honek, denbora errealeko aplikazioetarako erabilgarria ez izatea. Hori dela eta, praktikan Huffman kodeketa moldagarria edo dinamikoa erabiltzen da.
Hemen, konpresore eta deskonpresoreak zuhaitz bitar huts batekin hasten dira, eta bata konprimitzen eta bestea deskonprimitzen doan neurrian zuhaitza osatzen joango dira.
Metodo honek Huffman kodifikazioa denbora errealean aplikatzea ahalbideratzen du. Halabaina, errealitatean ez da Huffman kodifikazioa bere horretan erabiltzen. Beste kodifikatzeko metodo batzuek erabiltzen dute Huffman, beraien algoritmoen oinarritzat hartzen dutena.

### Errendimendu maximoa

Huffman algoritmoa fitxategi bateko sinboloen agertzeko probabilitatean oinarritzen da konpresioa gauzatzeko. Hau oso baliagarria da, izan ere, beti daude beste batzuk baino gehiago erabiltzen diren hitzak. Ingelesez adibidez A, T eta E letrak dira gehien erabiltzen direnak eta errusieraz, berriz, O, E eta A.
Letra guztiek agertzeko probabilitate berdina duten kasuan Huffman algoritmoak ez du inolako eraginik izango, ez baitu konprimitzeko erabiltzen duen parametro berezirik izango. Honela, aurkako kasua aztertuz honako ondoriora iritsi ahal gara: Sinbolo guztiak agertzeko probabilitatearen gero eta zati handiago bat sinbolo gutxitan banatzean konpresioa gero eta handiagoa izango da.
Honek Huffman algoritmoa ezagututa zentzu handia dauka, izan ere, sinbolo asko izanda ere, gutxi batzuen artean banatzen bada agerpen probabilitate totala, sinbolo hauei oso kode motzak esleitu ahal izango zaie. Honek beste sinboloei luzera handiko kode bat esleitzea ekarriko du, baina hauek oso gutxi erabiltzen badira, erredendimendu aldetik askoz errentagarriagoa izango da gutxi batzuk kode luzeak izatea beste askok kode laburrak badituzte.

## Aplikazioak

Huffman algoritmoaren konprimatzeko gaitasuna argi ikusi da. Baina, gaur egungo konpresio metodoak oso espezializatuak dira, hau da, nahiz eta oinarrizko konpresio metodo bat izan erreferentziatzat, bakoitzak bere aldaketak egiten ditu erabiliko den kasurako egokitu dadin.
Hau dela eta, Huffman algoritmoa konpresio formatu ezberdinetan erabiltzen da inglesez esaten den “back-end” moduan. Horien artean PKZIP eta multimedia codec ezberdinetan: JPEG eta MP3 bezalakoetan, adibidez.
Konpresio metodorik hoberena aukeratzea ez da erraza. Metodo bat oso azkarra izan daiteke, denbora errealerako ezin hobea izanda. Beste batek berriz, oso konpresio ona lor dezake, baina motela izan aldi berean. Honela, hiru ezaugarri definitzen dira konpresio metodo bat aztertzeko: konpresio abiadura, konpresio tasa eta memoriaren erabilera.
Huffmanen metodoa gaur egun konpresio metodo askok erabiltzen dute beraien oinarri moduan, ordea, gaur egun, kodetze aritmetikoa pisu handia hartzen hasi da. Huffmanek egin dezakeen guztia, aritmetikoak hobeto egiten duela esaten baita.

## Erreferentziak

* ↑ (Gaztelaniaz) Codificación Huffman. 2020-09-09 (Noiz kontsultatua: 2020-12-01).
* 1 2 https://www.tamps.cinvestav.mx/~mmorales/documents/Compre.pdf
* ↑ (Ingelesez) Bookstein, A.; Klein, S. T.. (1993-12-01). «Is Huffman coding dead?» Computing 50 (4): 279–296. doi:10.1007/BF02243872. ISSN 1436-5057. (Noiz kontsultatua: 2020-12-01).

## Ikus, gainera

* Entropia (Informazio teoria)
* Informazio kantitate
* Datu-konpresio

## Kanpo estekak

* Huffman kodifikazioaren kalkulagailua
* Huffman kodifikazioko zuhaitz bitarra
* Datuak: Q2647
* Multimedia: Huffman coding / Q2647