Kaip suspausti duomenis naudojant „Huffman“kodavimą: 10 žingsnių

Turinys:

Kaip suspausti duomenis naudojant „Huffman“kodavimą: 10 žingsnių
Kaip suspausti duomenis naudojant „Huffman“kodavimą: 10 žingsnių

Video: Kaip suspausti duomenis naudojant „Huffman“kodavimą: 10 žingsnių

Video: Kaip suspausti duomenis naudojant „Huffman“kodavimą: 10 žingsnių
Video: High Density 2022 2024, Balandis
Anonim

Huffmano algoritmas naudojamas duomenims suspausti arba užkoduoti. Paprastai kiekvienas tekstinio failo simbolis yra saugomas kaip aštuoni bitai (skaitmenys, 0 arba 1), susiejantys tą simbolį naudojant kodavimą, vadinamą ASCII. „Huffman“užkoduotas failas suskaido standžią 8 bitų struktūrą, todėl dažniausiai naudojami simboliai yra išsaugomi vos keliais bitais („a“gali būti „10“arba „1000“, o ne ASCII, kuris yra „01100001“). Mažiausiai paplitę simboliai dažnai užims daug daugiau nei 8 bitus („z“gali būti „00100011010“), tačiau kadangi jie pasitaiko taip retai, Huffmano kodavimas apskritai sukuria daug mažesnį failą nei originalas.

Žingsniai

1 dalis iš 2: Kodavimas

Duomenų suglaudinimas naudojant „Huffman“kodavimą 1 veiksmas
Duomenų suglaudinimas naudojant „Huffman“kodavimą 1 veiksmas

1 žingsnis. Apskaičiuokite kiekvieno koduojamo failo simbolio dažnį

Įtraukite netikrą simbolį, kad pažymėtumėte failo pabaigą - tai bus svarbu vėliau. Kol kas pavadinkite jį EOF (failo pabaiga) ir pažymėkite kaip 1 dažnį.

Pvz., Jei norite užkoduoti teksto failą „ab ab cab“, turėsite „a“su 3 dažniu, „b“su 3 dažniu, „“(tarpas) su 2 dažniu, „c“su 1 dažniu ir EOF 1 dažniu

Duomenų suglaudinimas naudojant „Huffman“kodavimą 2 veiksmas
Duomenų suglaudinimas naudojant „Huffman“kodavimą 2 veiksmas

Žingsnis 2. Išsaugokite simbolius kaip medžio mazgus ir sudėkite juos į prioritetinę eilę

Jūs sukursite didelį dvejetainį medį su kiekvienu simboliu kaip lapu, todėl turėtumėte saugoti simbolius tokiu formatu, kad jie galėtų tapti medžio mazgais. Įdėkite šiuos mazgus į prioritetų eilę, o kiekvieno simbolio dažnis - jo mazgo prioritetas.

  • Dvejetainis medis yra duomenų formatas, kuriame kiekvienas duomenų elementas yra mazgas, kuriame gali būti iki vieno iš tėvų ir du vaikai. Jis dažnai piešiamas kaip šakojantis medis, taigi ir pavadinimas.
  • Eilė yra taikliai pavadintas duomenų rinkinys, kuriame pirmas dalykas, kuris patenka į eilę, yra pirmas dalykas (pvz., Laukimas eilėje). Prioritetų eilėje duomenys saugomi pagal jų prioritetą, todėl pirmas dalykas, kurį reikia išgirsti, yra pats skubiausias, mažiausio prioriteto dalykas, o ne pirmas dalykas.
  • Pavyzdyje „ab ab cab“jūsų prioritetų eilė atrodytų taip: {'c': 1, EOF: 1, '': 2, 'a': 3, 'b': 3}
Duomenų suspaudimas naudojant „Huffman“kodavimą 3 veiksmas
Duomenų suspaudimas naudojant „Huffman“kodavimą 3 veiksmas

Žingsnis 3. Pradėkite kurti savo medį

Pašalinkite (arba pašalinkite) du skubiausius dalykus iš prioritetų eilės. Sukurkite naują medžio mazgą, kuris bus šių dviejų mazgų tėvas, pirmąjį mazgą išsaugodami kaip kairįjį, o antrąjį - kaip dešinįjį. Naujo mazgo prioritetas turėtų būti jo vaiko prioritetų suma. Tada įtraukite šį naują mazgą į prioritetų eilę.

Prioritetų eilė dabar atrodo taip: {'': 2, naujas mazgas: 2, 'a': 3, 'b': 3}

Duomenų suglaudinimas naudojant „Huffman“kodavimą 4 veiksmas
Duomenų suglaudinimas naudojant „Huffman“kodavimą 4 veiksmas

Žingsnis 4. Baikite statyti savo medį:

kartokite aukščiau aprašytą veiksmą, kol eilėje bus tik vienas mazgas. Atminkite, kad be mazgų, kuriuos sukūrėte simboliams ir jų dažniui, jūs taip pat būsite nuvertę, paversite medžiais ir pakartotinai įveiksite tėvų mazgus, mazgus, kurie jau yra medžiai.

  • Kai baigsite, paskutinis eilės mazgas bus kodavimo medžio šaknis, o visi kiti mazgai nuo jo išsišakos.
  • Dažniausiai naudojami simboliai bus lapai, esantys arčiausiai medžio viršūnės, o retai naudojami simboliai bus išdėstyti medžio apačioje, toliau nuo šaknies.
Duomenų suglaudinimas naudojant „Huffman“kodavimą 5 veiksmas
Duomenų suglaudinimas naudojant „Huffman“kodavimą 5 veiksmas

Žingsnis 5. Sukurkite kodavimo žemėlapį. Eikite per medį, kad pasiektumėte kiekvieną personažą. Kiekvieną kartą, kai aplankote kairįjį mazgo vaiką, tai yra „0“. Kiekvieną kartą, kai aplankote tinkamą mazgo vaiką, tai yra „1“. Kai susipažinsite su simboliu, išsaugokite simbolį su 0 ir 1 sekomis, kurių prireikė ten patekti. Ši seka simbolis bus užkoduotas kaip suspaustame faile. Išsaugokite simbolius ir jų sekas žemėlapyje.

  • Pavyzdžiui, pradėkite nuo šaknies. Aplankykite šaknies kairįjį vaiką, o tada - kairįjį mazgo vaiką. Kadangi mazgas, kuriame esate dabar, neturi vaikų, jūs pasiekėte charakterį. Tai yra ' '. Kadangi du kartus vaikščiojote kairėn, kad atvyktumėte čia, „“kodavimas yra „00“.
  • Šio medžio žemėlapis atrodys taip: {'': "00", 'a': "10", "b": "11", "c": "010", EOF: "011"}.
Duomenų suglaudinimas naudojant „Huffman“kodavimą 6 veiksmas
Duomenų suglaudinimas naudojant „Huffman“kodavimą 6 veiksmas

Žingsnis 6. Išvesties faile įtraukite kodavimo žemėlapį kaip antraštę

Tai leis failą iššifruoti.

Duomenų suglaudinimas naudojant „Huffman“kodavimą 7 veiksmas
Duomenų suglaudinimas naudojant „Huffman“kodavimą 7 veiksmas

Žingsnis 7. Užšifruokite failą

Kad kiekvienas failo simbolis būtų užkoduotas, parašykite dvejetainę seką, kurią išsaugojote žemėlapyje. Baigę koduoti failą, būtinai pridėkite EOF prie pabaigos.

  • Failui „ab ab cab“užkoduotas failas atrodys taip: „1011001011000101011011“.
  • Failai saugomi kaip baitai (8 bitai arba 8 dvejetainiai skaitmenys). Kadangi „Huffman“kodavimo algoritmas nenaudoja 8 bitų formato, užkoduotų failų ilgis dažnai nėra 8 kartų. Likę skaitmenys užpildomi 0. Tokiu atveju failo pabaigoje bus pridėti du 0, o tai atrodo kaip kita erdvė. Tai gali būti problema: kaip dekoderis žinotų, kada nustoti skaityti? Tačiau, kadangi įtraukėme failo pabaigos simbolį, dekoderis prie to pripras ir sustos, nekreipdamas dėmesio į viską, kas buvo pridėta vėliau.

2 dalis iš 2: Dekodavimas

Duomenų suspaudimas naudojant „Huffman“kodavimą 8 veiksmas
Duomenų suspaudimas naudojant „Huffman“kodavimą 8 veiksmas

Žingsnis 1. Perskaitykite Huffmano koduotą failą

Pirmiausia perskaitykite antraštę, kuri turėtų būti kodavimo žemėlapis. Naudokite tai dekodavimo medžiui sukurti taip, kaip sukūrėte medį, kurį naudojote koduodami failą. Abu medžiai turi būti vienodi.

Duomenų suglaudinimas naudojant „Huffman“kodavimą 9 veiksmas
Duomenų suglaudinimas naudojant „Huffman“kodavimą 9 veiksmas

Žingsnis 2. Vienu metu skaitykite dvejetainį skaitmenį

Skaitydami pereikite medį: jei skaitote „0“, eikite į kairįjį mazgo, kuriame esate, o jei skaitote „1“, eikite į dešinįjį vaiką. Pasiekę lapą (mazgą be vaikų), priėjote prie veikėjo. Įrašykite simbolį į iššifruotą failą.

Kadangi simboliai saugomi medyje, kiekvieno simbolio kodai turi priešdėlio ypatybę, todėl bet kurio simbolio dvejetainė koduotė negali atsirasti kito simbolio kodavimo pradžioje. Kiekvieno simbolio kodavimas yra visiškai unikalus. Tai labai palengvina dekodavimą

Duomenų suspaudimas naudojant „Huffman“kodavimą 10 veiksmas
Duomenų suspaudimas naudojant „Huffman“kodavimą 10 veiksmas

Žingsnis 3. Kartokite, kol pasieksite EOF

Sveikinu! Jūs iššifravote failą.

Rekomenduojamas: