Andmete tihendamine Huffmani kodeeringu abil: 10 sammu

Sisukord:

Andmete tihendamine Huffmani kodeeringu abil: 10 sammu
Andmete tihendamine Huffmani kodeeringu abil: 10 sammu

Video: Andmete tihendamine Huffmani kodeeringu abil: 10 sammu

Video: Andmete tihendamine Huffmani kodeeringu abil: 10 sammu
Video: Kuidas külvata maitsetaimi? 2024, Aprill
Anonim

Andmete tihendamiseks või kodeerimiseks kasutatakse Huffmani algoritmi. Tavaliselt salvestatakse tekstifaili iga märk kaheksa bitina (numbrid, kas 0 või 1), mis vastavad sellele märgile, kasutades kodeeringut nimega ASCII. Huffmani kodeeritud fail lagundab jäiga 8-bitise struktuuri, nii et kõige sagedamini kasutatavad märgid salvestatakse vaid mõne bitini ('a' võib olla "10" või "1000", mitte ASCII, mis on "01100001"). Kõige vähem levinud märgid võtavad sageli palju rohkem kui 8 bitti ('z' võib olla "00100011010"), kuid kuna neid esineb nii harva, loob Huffmani kodeering tervikuna palju väiksema faili kui originaal.

Sammud

Osa 1: Kodeerimine

Andmete tihendamine Huffmani kodeeringu abil 1. samm
Andmete tihendamine Huffmani kodeeringu abil 1. samm

Samm 1. Loendage kodeeritavas failis iga märgi sagedus

Faili lõpu märkimiseks lisage näiv märk - see on hiljem oluline. Praegu nimetage seda EOF -iks (faili lõpp) ja märkige see sageduseks 1.

Näiteks kui soovite kodeerida tekstifaili tekstiga „ab ab cab”, oleks teil „a” sagedusega 3, „b” sagedusega 3, „” (tühik) sagedusega 2, „c” sagedusega 1 ja EOF sagedusega 1

Tihendage andmed Huffmani kodeeringu abil
Tihendage andmed Huffmani kodeeringu abil

Samm 2. Salvestage märgid puusõlmedena ja asetage need prioriteetsesse järjekorda

Ehitate suure kahendpuu, kus iga märk on leht, nii et peaksite salvestama märgid sellises vormingus, et neist saaksid puu sõlmed. Asetage need sõlmed prioriteetsesse järjekorda, kus iga märgi sagedus on sõlme prioriteet.

  • Binaarpuu on andmevorming, kus iga andmestik on sõlm, millel võib olla kuni üks vanem ja kaks last. Seda joonistatakse sageli hargneva puuna, sellest ka nimi.
  • Järjekord on tabava nimega andmekogu, kus esimene asi, mis järjekorda läheb, on ka esimene asi, mis tuleb välja (nagu järjekorras ootamine). Prioriteedijärjekorras salvestatakse andmed nende prioriteetsuse järjekorras, nii et esimene asi, mis tuleb välja, on kõige pakilisem asi, kõige väiksema prioriteediga asi, mitte esimene loodetud.
  • Näites "ab ab cab" näeks teie eelisjärjekord välja selline: {'c': 1, EOF: 1, '': 2, 'a': 3, 'b': 3}
Tihendage andmed Huffmani kodeerimise abil, samm 3
Tihendage andmed Huffmani kodeerimise abil, samm 3

Samm 3. Alustage oma puu ehitamist

Eemaldage (või tühistage) kaks kõige pakilisemat asja prioriteedijärjekorrast. Looge uus puusõlm nende kahe sõlme vanemaks, salvestades esimese sõlme vasaku ja teise parema lapsena. Uue sõlme prioriteet peaks olema selle lapse prioriteetide summa. Seejärel lisage see uus sõlm prioriteetsesse järjekorda.

Prioriteedijärjekord näeb nüüd välja selline: {'': 2, new node: 2, 'a': 3, 'b': 3}

Tihendage andmed Huffmani kodeeringu abil, 4. samm
Tihendage andmed Huffmani kodeeringu abil, 4. samm

Samm 4. Lõpetage oma puu ehitamine:

korrake ülaltoodud sammu, kuni järjekorras on ainult üks sõlm. Pange tähele, et lisaks tähemärkidele ja nende sagedustele loodud sõlmedele teete ka deikki, muutute puudeks ja loote uuesti vanemasõlmed, sõlmed, mis on juba ise puud.

  • Kui olete lõpetanud, on järjekorra viimane sõlm kodeerimispuu juur, millest kõik teised sõlmed hargnevad.
  • Kõige sagedamini kasutatavad märgid on puu ülaosale lähimad lehed, harva kasutatavad märgid aga puu allosas, juurest kaugemal.
Tihendage andmed Huffmani kodeerimise abil, samm 5
Tihendage andmed Huffmani kodeerimise abil, samm 5

Samm 5. Looge kodeerimiskaart. Kõigi tegelaste juurde jõudmiseks kõndige läbi puu. Iga kord, kui külastate sõlme vasakpoolset last, on see "0". Iga kord, kui külastate sõlme õiget last, on see 1. Kui jõuate tegelase juurde, salvestage märk koos 0 -de ja 1 -de jadaga, mis kulus sinna jõudmiseks. See jada on see, mida märk kodeeritakse nagu tihendatud failis. Salvestage märgid ja nende järjestused kaardile.

  • Alustage näiteks juurest. Külastage juure vasakut last ja seejärel selle sõlme vasakpoolset last. Kuna sõlmel, kus praegu viibite, pole lapsi, olete jõudnud tegelaseni. See on ' '. Kuna kõndisite siia jõudmiseks kaks korda vasakule, on '' kodeering "00".
  • Selle puu puhul näeb kaart välja selline: {'': "00", 'a': "10", 'b': "11", 'c': "010", EOF: "011"}.
Tihendage andmed Huffmani kodeeringu abil, samm 6
Tihendage andmed Huffmani kodeeringu abil, samm 6

Samm 6. Väljundfailis lisage päisesse kodeerimiskaart

See võimaldab faili dekodeerida.

Tihendage andmed Huffmani kodeerimise abil, samm 7
Tihendage andmed Huffmani kodeerimise abil, samm 7

Samm 7. Kodeerige fail

Kirjutage iga kodeeritava faili märgi jaoks kaardile salvestatud binaarjärjestus. Kui olete faili kodeerimise lõpetanud, lisage kindlasti EOF lõppu.

  • Faili "ab ab cab" puhul näeb kodeeritud fail välja selline: "1011001011000101011011".
  • Failid salvestatakse baitidena (8 bitti või 8 binaarset numbrit). Kuna Huffmani kodeerimisalgoritm ei kasuta 8-bitist vormingut, ei ole kodeeritud failide pikkused sageli kaheksakordsed. Ülejäänud numbrid täidetakse 0-ga. Sel juhul lisatakse faili lõppu kaks 0 -d, mis näeb välja nagu teine tühik. See võib olla probleem: kuidas dekooder teaks, millal lugemine lõpetada? Kuid kuna lisasime faili lõppmärgi, jõuab dekooder selleni ja peatub, ignoreerides kõike muud, mis on pärast seda lisatud.

Osa 2: Dekodeerimine

Tihendage andmed Huffmani kodeerimise abil, samm 8
Tihendage andmed Huffmani kodeerimise abil, samm 8

Samm 1. Lugege Huffmani kodeeritud faili

Kõigepealt lugege päist, mis peaks olema kodeerimiskaart. Kasutage seda dekodeerimispuu ehitamiseks samamoodi, nagu ehitasite puu, mida kasutasite faili kodeerimiseks. Need kaks puud peaksid olema identsed.

Tihendage andmed Huffmani kodeerimise abil, samm 9
Tihendage andmed Huffmani kodeerimise abil, samm 9

Samm 2. Lugege binaarset numbrit korraga

Pöörake lugedes puust läbi: kui loete „0”, minge selle sõlme vasakule alamle, kus olete, ja kui loete „1”, siis minge parema lapse juurde. Kui jõuate lehele (sõlme ilma lasteta), olete jõudnud tegelase juurde. Kirjutage märk dekodeeritud faili.

Märkide puusse salvestamise viisi tõttu on iga tähemärgi koodidel eesliite omadus, nii et ühegi märgi binaarne kodeering ei saa kunagi tekkida teise märgi kodeerimise alguses. Iga märgi kodeering on täiesti ainulaadne. See muudab dekodeerimise palju lihtsamaks

Tihendage andmed Huffmani kodeerimise abil, samm 10
Tihendage andmed Huffmani kodeerimise abil, samm 10

Samm 3. Korrake, kuni jõuate EOF -i

Palju õnne! Olete faili dekodeerinud.

Soovitan: