Alfabetică de codificare binară inegală

Alfabetică codificare binară inegală - codificare în care un primar cod alfabet codificat combinații binare de caractere alfanumerice (adică 0 și 1), în care, lungimea codului și, în consecință, durata unei singure transmisii cod poate varia.

Codul de prefix în teoria codurilor - cuvântului cod de lungime variabilă având o astfel de proprietate (de performanță condiții Fano): în cazul în care cuvântul de cod include, atunci pentru fiecare rând non-gol b cuvinte ab în cod nu există. Deși codul de prefix este compus din cuvinte de lungimi diferite, aceste cuvinte pot fi înregistrate fără delimitatorul.

De exemplu, un cod format din cuvinte 0, 10 și 11, este un prefix, iar mesajul poate fi împărțit în 01,001,101,110 cuvinte într-un mod unic:

0 10 0 11 0 11 10

Cuvântul cod format din 0, 10, 11 și 100, nu este un prefix, același mesaj poate fi interpretată în mai multe moduri.

0 10 0 11 0 11 10
0 100 11 0 11 10

Ideea care stă la baza codificarea Huffman, în funcție de frecvența de apariție a caracterului în secvența. Simbolul, care se găsește în secvența de multe ori devine un cod nou, foarte puțin, și caracterul care are loc cel mai rar primește, dimpotrivă, codul de foarte mult timp. Acest lucru este necesar pentru că vrem să, atunci când am procesat toate de intrare, simbolul cel mai comun este ocupat mai puțin peste tot (și mai puțin din ceea ce fac în original), iar cel mai rar - un pic mai mult (dar din moment ce acestea sunt rare, nu contează ). În acest articol, am decis că personajul va avea o lungime de 8 biți, adică, se va întâlni de caractere.

Să presupunem că avem un șir de caractere «bere bip Boop!», Pentru care, în forma sa actuală, pe fiecare personaj își petrece un octet. Aceasta înseamnă că întreaga linie preia întreaga 15 * 8 = 120 biți de memorie. După codificare rând se va ocupa 40 biți.

Pentru a obține codul pentru fiecare caracter din șirul «bere bip Boop!», Bazat pe frecvența, avem nevoie pentru a construi un arbore binar, astfel încât fiecare frunza de copac va conține un caracter (caractere imprimabile din șirul). Lemnul va fi construit din frunze la rădăcină, în sensul că personajele cu o frecvență mai mică va fi mai departe de rădăcină decât caracterele mai. Veți vedea în curând de ce acest lucru este necesar.

Pentru a construi copac, vom folosi o coadă de prioritate ușor modificată - acesta va fi primul dintre elementele extrase cu cea mai mică prioritate, și nu cea mai mare. Este necesar să se construiască un copac din frunze la rădăcină.

Pentru a începe calcula frecvențele tuturor caracterelor:

Alfabetică de codificare binară inegală

După calcularea frecvenței, vom crea un binar noduri de arbore pentru fiecare caracter și să le adăugați în lista de așteptare utilizând frecvența ca prioritate:

Ajungem acum suntem primele două elemente din coadă și să le conecteze, creând un nou nod al arborelui în care ambele sunt descendenți, și prioritatea noului nod va fi egală cu suma priorităților lor. După aceea, vom adăuga noul ansamblu rezultat înapoi în loc.

Alfabetică de codificare binară inegală

Repetăm ​​aceiași pași și de a obține în mod succesiv:

Alfabetică de codificare binară inegală

Alfabetică de codificare binară inegală

Alfabetică de codificare binară inegală

Alfabetică de codificare binară inegală

Ei bine, după ce am asociat ultimele două elemente, pentru a primi copac finală:

Alfabetică de codificare binară inegală

Acum, pentru a obține codul pentru fiecare caracter, trebuie doar să meargă pe un copac, iar pentru fiecare tranziție de a adăuga 0, dacă vom merge la stânga, și 1 - în cazul în care dreptul:

Alfabetică de codificare binară inegală

Dacă vom face acest lucru, vom obține următoarele coduri pentru caracterele:

Alfabetică de codificare binară inegală

Pentru a descifra șirul codificat, avem, respectiv, doar du-te pentru lemn, transformându-se într-un pic corespunzător fiecare parte, atâta timp cât nu ajungem foaia. De exemplu, în cazul în care există o linie „101 11 101 11„și arborele nostru, obținem o linie «pepe».

Este important să se țină cont de faptul că fiecare cod este un prefix al unui alt cod de caracter. În exemplul nostru, în cazul în care 00 - este codul pentru „B“ 000 nu poate fi codul altcuiva, pentru că altfel vom obține un conflict. Noi n-ar fi ajuns la acest simbol în copac, deoarece ar opri un alt „b“.

articole similare