Huffmani kodeerimine on prefikskoodide üks liik. Huffmani kodeerimise idee on asendada olemasolev sümboleid kirjeldav bitijada ümber nõnda, et informatsiooni hulgas tihemini esinevad tähemärgid saaksid kirjeldatud lühema bitijadaga. Tulemuseks on informatsiooni kirjeldus esinemistihedust eelistaval ja minimaalset tähemärkide hulka kasutaval alusel. Informatsiooni kirjeldav andmehulk ei pruugi väheneda ja võib eriolukorras isegi kasvada, kuid tegemist on tihendusalgoritmiga, mis tavateksti pakkimisel saavutab märgatava erinevuse (tihti üle 30%).
Huffmani kodeerimisalgoritm põhineb konkreetse informatsiooni tähemärkide sageduse põhjal binaarpuu ehitamisel ja sellest tähemärkide bitijada kirjeldava kodeerimistabeli loomisel. Faili tihendamise puhul kirjeldatakse väljundfaili puud ja algse sisendfaili sisu. Tähemärgid asendatakse uue kodeeringuga.
Otsese informatsiooni sisaldava faili tihendamisel on mõned lahendamist vajavad kitsaskohad. Näiteks tuleb teha väljundfaili lõpu tuvastus, sest tõenäoliselt ei lõpe fail baidi pealt, vaid selles on mõnebitine ülejääk.
//tüüpiline struktuur programmeerimskeeles C, mida kasutada binaarpuu ehitamisel
typedef struct tree {
int ch; //tähemärgi numbriline kood
int freq; //informatsioonis esinemise tihedus
struct tree *left; //viide sama tüüpi struktuurile
struct tree *right; //2 viide sama tüüpi struktuurile
} tree;
Tõenäoliselt pole raske iteratiivset algoritmi luua, kuid seda pole vaja, sest tähed on üldjuhul kirjeldatud 8 bitiga, mille kõigi kombinatsioonide hulk on 256.
Kodeerimistabeli element koosneb vormist ja pikkusest ning kõik elemendid saavad pärast seda algoritmi määratud unikaalsete bitijadadega. Allpool on tabel eelneva ja uue kodeeringu erinevustest. Kodeerimistabeli informatsiooniks on sõne "this is an example of a huffman tree".
Kodeerimistabel: Tähemärk ' ' nr(32) | binaarkood:00100000 | uus binaarkood:111 Tähemärk 'a' nr(97) | binaarkood:01100001 | uus binaarkood:001 Tähemärk 'e' nr(101) | binaarkood:01100101 | uus binaarkood:000 Tähemärk 'f' nr(102) | binaarkood:01100110 | uus binaarkood:1101 Tähemärk 'h' nr(104) | binaarkood:01101000 | uus binaarkood:1100 Tähemärk 'i' nr(105) | binaarkood:01101001 | uus binaarkood:1001 Tähemärk 'l' nr(108) | binaarkood:01101100 | uus binaarkood:01101 Tähemärk 'm' nr(109) | binaarkood:01101101 | uus binaarkood:1000 Tähemärk 'n' nr(110) | binaarkood:01101110 | uus binaarkood:1011 Tähemärk 'o' nr(111) | binaarkood:01101111 | uus binaarkood:01100 Tähemärk 'p' nr(112) | binaarkood:01110000 | uus binaarkood:01111 Tähemärk 'r' nr(114) | binaarkood:01110010 | uus binaarkood:01110 Tähemärk 's' nr(115) | binaarkood:01110011 | uus binaarkood:1010 Tähemärk 't' nr(116) | binaarkood:01110100 | uus binaarkood:0101 Tähemärk 'u' nr(117) | binaarkood:01110101 | uus binaarkood:01001 Tähemärk 'x' nr(120) | binaarkood:01111000 | uus binaarkood:01000
Pildid, videod ja helifailid Commonsis: Huffmani kodeerimine |