Cum să comprimați datele utilizând codarea huffman

Algoritmul lui Huffman este folosit pentru a comprima sau a codifica datele. În mod normal, fiecare caracter dintr-un fișier text este stocat ca opt biți (cifre, fie 0 sau 1) care hartă la acel caracter folosind o codificare numită ASCII. Un fișier codificat Huffman descompune structura rigidă pe 8 biți, astfel încât cele mai frecvent utilizate caractere sunt stocate în doar câțiva biți ("a" ar putea fi "10" sau "1000" mai degrabă decât ASCII, care este "01100001"). Caracterele cele mai puțin frecvente, atunci vor lua adesea mult mai mult de 8 biți ("Z" ar putea fi "00100011010"), dar pentru că acestea apar atât de rar, Hffman codifică, în ansamblu, creează un fișier mult mai mic decât originalul.

Pași

Partea 1 din 2:
Codificarea
  1. Imagine intitulată comprimați datele utilizând Huffman Codificarea pasului 1
1. Numărați frecvența fiecărui caracter din fișier care urmează să fie codificat. Includeți un caracter fals pentru a marca sfârșitul fișierului - acest lucru va fi important mai târziu. Deocamdată, numiți EOF (sfârșitul fișierului) și marcați-l ca având o frecvență de 1.
  • De exemplu, dacă doriți să codificați o citire a fișierelor text "AB AB CAB," Ați avea "A" cu frecvență 3, "B" cu frecvență 3, "(spațiu) cu frecvență 2," C "cu frecvența 1 și EOF cu frecvența 1.
  • Imagine intitulată comprimați datele utilizând Huffman Codificarea pasului 2
    2. Stocați caracterele ca noduri de copaci și le puneți într-o coadă prioritară. Veți construi un copac binar mare cu fiecare caracter ca o frunză, deci ar trebui să stocați personajele într-un format astfel încât să poată deveni noduri ale copacului. Plasați aceste noduri într-o coadă prioritară cu frecvența fiecărui caracter ca prioritatea nodului său.
  • Un copac binar este un format de date în care fiecare piesă de date este un nod care poate avea până la un părinte și doi copii. Este adesea atras ca un copac ramificat, deci numele.
  • O coadă este o colecție de date numită aptly, unde primul lucru care va intra în coadă este, de asemenea, primul lucru care urmează să iasă (cum ar fi așteptarea în linie). În A prioritate coadă, datele sunt stocate în ordinea priorității lor, astfel încât primul lucru de ieșire este cel mai urgent lucru, lucrul cu cea mai mică prioritate, mai degrabă decât primul lucru enqued.
  • În "AB AB CAB" Exemplu, coada de prioritate ar arăta astfel: {"C `: 1, EOF: 1,` `: 2,` A `: 3,` B `: 3}
  • Imagine intitulată comprimați datele utilizând Huffman Codificarea pasului 3
    3. Începeți să vă construiți copacul. Eliminați (sau Dequeue) cele două lucruri cele mai urgente din coada de prioritate. Creați un nou nod de copac pentru a fi părintele acestor două noduri, stocând primul nod ca și copilul stâng și al doilea ca și copilul drept. Prioritatea noului nod ar trebui să fie suma priorităților copilului său. Apoi enqueue acest nou nod în coada de prioritate.
  • Coada prioritară arată acum: {``: 2, noul nod: 2, "A": 3, `B`: 3}
  • Imagine intitulată comprimați datele utilizând Huffman Codificarea pasului 4
    4. Finalizați construirea copacului: Repetați pasul de mai sus până când există un singur nod în coadă. Rețineți că, în plus față de nodurile pe care le-ați creat pentru personaje și frecvențele lor, veți fi defectat, transformați în copaci și reintroduceți nodurile părinte, nodurile care sunt deja copaci.
  • Când ați terminat, ultimul nod din coadă va fi rădăcină a copacului codificator, cu toate celelalte noduri care se ramificate de la ea.
  • Cele mai frecvent utilizate personaje vor fi frunzele cele mai apropiate de partea superioară a copacului, în timp ce caracterele rar folosite vor fi poziționate în partea de jos a copacului, departe de rădăcină.
  • Imagine intitulată Comprimarea datelor utilizând Huffman Codificarea pasului 5
    5. Creaza un Harta codificatoare. Umblați prin copac pentru a ajunge la fiecare caracter. De fiecare dată când vizitați copilul stâng al unui nod, acesta este un "0". De fiecare dată când vizitați un copil drept al unui nod, acesta este un "1". Când ajungeți la un personaj, depozitați caracterul cu secvența de 0s și 1 pe care a luat-o pentru a ajunge acolo. Această secvență este ceea ce caracterul va fi codificat ca în fișierul comprimat. Stocați caracterele și secvențele lor într-o hartă.
  • De exemplu, începeți la rădăcină. Vizitați copilul stâng al rădăcinii și apoi vizitați copilul stâng al nodului. Din moment ce nodul pe care îl aveți acum nu are copii, ați ajuns la un personaj. Aceasta este ` `. De când ați mers la stânga de două ori pentru a ajunge aici, codificarea pentru "este "00".
  • Pentru acest copac, harta va arăta astfel: {``:"00", `A`:"10", "B":"11", "C":"010", EOF:"011"}.
  • Imagine intitulată Comprimarea datelor utilizând Huffman Codificarea pasului 6
    6. În fișierul de ieșire, includeți harta de codare ca antet. Acest lucru va permite ca fișierul să fie decodificat.
  • Imagine intitulată comprimați datele utilizând HUFFMAN Codificarea pasului 7
    7. Codificați dosarul. Pentru fiecare personaj din fișier care urmează să fie codificat, scrieți secvența binară pe care ați stocat-o pe hartă. Odată ce ați terminat codificarea fișierului, asigurați-vă că adăugați EOF la sfârșit.
  • Pentru dosar "AB AB CAB", Fișierul codificat va arăta astfel: "1011001011000101011011".
  • Fișierele sunt stocate ca octeți (8 biți sau 8 cifre binare). Deoarece algoritmul de codificare Huffman nu utilizează formatul pe 8 biți, fișierele codificate nu vor avea adesea lungimi care sunt multipli de 8. Cifrele rămase vor fi completate cu 0s. În acest caz, două 0s vor fi adăugate la sfârșitul fișierului, care arată ca un alt spațiu. Aceasta ar putea fi o problemă: cum ar ști decodorul când va înceta să citească? Cu toate acestea, pentru că am inclus un caracter de sfârșit de fișier, decodorul va ajunge la acest lucru și apoi se oprește, ignorând orice altceva care a fost adăugat după.
  • Partea 2 din 2:
    Decodare
    1. Imagine intitulată comprimați datele utilizând Huffman Codificarea pasului 8
    1. Citiți într-un fișier codificat Huffman. În primul rând, citiți antetul, care ar trebui să fie harta codificatoare. Utilizați acest lucru pentru a construi un copac de decodare în același mod în care ați construit copacul pe care l-ați folosit pentru a codifica fișierul. Cei doi copaci ar trebui să fie identici.
  • Imagine intitulată comprimați datele utilizând HuffMan Codificarea pasului 9
    2. Citiți în prima cifră binară la un moment dat. Traversați copacul pe măsură ce citiți: Dacă citiți într-un "0", mergeți la copilul stâng al nodului pe care îl aveți și dacă citiți într-un "1", mergeți la copilul potrivit. Când ajungeți la o frunză (un nod fără copii), ați ajuns la un personaj. Scrieți caracterul în fișierul decodat.
  • Din cauza modului în care personajele sunt stocate în copac, codurile pentru fiecare personaj au a Proprietatea prefixului, astfel încât codificarea binară a caracterului nu poate apărea vreodată la începutul codificării unui alt personaj. Codificarea pentru fiecare personaj este total unică. Acest lucru face ca decodificarea mult mai ușoară.
  • Imagine intitulată Comprimarea datelor utilizând Huffman Codificarea pasului 10
    3. Repetați până când ajungeți la EOF. Felicitări! Ați decodificat fișierul.
  • sfaturi

    Partajați pe rețeaua socială:
    Similar