Hoe gegevens te comprimeren met behulp van huffman-codering

Huffman`s algoritme wordt gebruikt om gegevens te comprimeren of te coderen. Normaal gesproken wordt elk teken in een tekstbestand opgeslagen als acht bits (cijfers, 0 of 1) die kaart naar dat teken met behulp van een codering genaamd ASCII. Een door Huffman-gecodeerd bestand breekt de stijve 8-bitstructuur af, zodat de meest gebruikte tekens in slechts een paar bits worden opgeslagen (`A` zou kunnen zijn "10" of "1000" in plaats van de ASCII, dat is "01100001"). De minst gemeenschappelijke personages, zullen dan vaak veel meer dan 8 bits nemen (`Z` zou kunnen zijn "00100011010"), maar omdat ze zo zelden voordoen, creëert Huffman over het algemeen een veel kleiner bestand dan het origineel.

Stappen

Deel 1 van 2:
Codering
  1. Titel afbeelding Compress-gegevens met Huffman Codering Stap 1
1. Tel de frequentie van elk teken in het bestand dat moet worden gecodeerd. Neem een ​​dummy-personage op om het einde van het bestand te markeren - dit zal later belangrijk zijn. Bel het voor nu het EOF (einde van het bestand) en markeer het als een frequentie van 1.
  • Als u bijvoorbeeld een tekstbestand-lezen wilt coderen "AB AB-cabine," Je zou `A` hebben met frequentie 3, `B` met frequentie 3, `` (ruimte) met frequentie 2, `C` met frequentie 1 en EOF met frequentie 1.
  • Titel afbeelding Compress-gegevens met Huffman Codering Stap 2
    2. Bewaar tekens als boomknooppunten en leg ze in een prioritaire wachtrij. Je brengt een grote binaire boom met elk personage als een blad, dus je moet de personages in een formaat opslaan, zodat ze knooppunten van de boom kunnen worden. Plaats deze knooppunten in een prioriteitswachtrij met de frequentie van elke personage als de prioriteit van het knooppunt.
  • Een binaire boom is een gegevensformaat waar elk stuk gegevens een knooppunt is dat tot één ouder en twee kinderen kan hebben. Het wordt vaak getekend als een vertakkingstructuur, vandaar de naam.
  • Een wachtrij is een toepasselijk genoemde gegevensverzameling waarbij het eerste in de wachtrij gaat, ook het eerste is om naar buiten te komen (zoals het wachten in de rij). In een prioriteit Wachtrij, de gegevens worden opgeslagen in volgorde van hun prioriteit, zodat het eerste dat uitkomt, het meest urgente ding is, het ding met de kleinste prioriteit, in plaats van het eerste genegenheid.
  • In de "AB AB-cabine" Voorbeeld, zou uw prioritaire wachtrij er als volgt uitzien: {`C`: 1, EOF: 1, ``: 2, `A`: 3, `B`: 3}
  • Titel afbeelding Compress-gegevens met Huffman Codering Stap 3
    3. Begin met het bouwen van je boom. Verwijderen (of dequate) De twee meest urgente dingen van de wachtrij van de prioriteit. Maak een nieuw boomknooppunt om de ouder van deze twee knooppunten te zijn, het eerste knooppunt opslaan als het linker kind en de tweede als het juiste kind. De prioriteit van het nieuwe knooppunt moet de som van de prioriteiten van zijn kind zijn. En vervolgens dit nieuwe knooppunt in de wachtrij van de prioriteit.
  • De Priority Queue ziet er nu als volgt uit: {``: 2, nieuw knooppunt: 2, `A`: 3, `B`: 3}
  • Titel afbeelding Compress-gegevens met Huffman Codering Stap 4
    4. Voltooi je boom: Herhaal de bovenstaande stap totdat er slechts één knooppunt in de wachtrij is. Merk op dat, naast de knooppunten die u hebt gemaakt voor de personages en hun frequenties, u ook ontkoppelt, in bomen wordt, en het opnieuw enquueuen van ouderknooppunten, knooppunten die al zelf bomen zijn.
  • Als je klaar bent, is het laatste knooppunt in de wachtrij de wortel van de coderingstructuur, met alle andere knooppunten die ervan vertakken.
  • De meest gebruikte personages zullen de bladeren die het dichtst bij de top van de boom bevinden, terwijl de zelden gebruikte personages op de bodem van de boom zullen worden geplaatst, verder weg van de wortel.
  • Titel afbeelding Compress-gegevens met Huffman Codering Stap 5
    5. Creëer een Codering van kaart. Loop door de boom om elk personage te bereiken. Elke keer dat je het linker kind van een knooppunt bezoekt, is dat een `0`. Elke keer dat je het juiste kind van een knooppunt bezoekt, is dat een `1`. Als je bij een personage stapt, bewaar dan het personage met de reeks van 0s en 1s die het duurde om er te komen. Deze sequentie is wat het teken wordt gecodeerd als in het gecomprimeerde bestand. Bewaar de personages en hun reeksen op een kaart.
  • Begin bijvoorbeeld bij de root. Bezoek het linker kind van de root en bezoek het linker kind van dat knooppunt. Omdat het knooppunt je nu niet kinderen hebt, heb je een personage bereikt. Dit is ` `. Omdat je twee keer links liep om hier te komen, is de codering voor `` "00".
  • Voor deze boom ziet de kaart er als volgt uit: {``:"00", `een`:"10", `B`:"11", `C`:"010", EOF:"011"}.
  • Titel afbeelding Compress-gegevens met Huffman Codering Stap 6
    6. In het uitvoerbestand, neem de coderingskaart op als koptekst. Hierdoor kan het bestand worden gedecodeerd.
  • Titel afbeelding Compress-gegevens met Huffman Codering Stap 7
    7. Codeer het bestand. Voor elk teken in het bestand dat moet worden gecodeerd, schrijf dan de binaire reeks die u op de kaart hebt opgeslagen. Zodra u klaar bent met het coderen van het bestand, moet u het EOF aan het einde toevoegen.
  • Voor het bestand "AB AB-cabine", Het gecodeerde bestand ziet er als volgt uit: "1011001011000101011011".
  • Bestanden worden opgeslagen als bytes (8 bits of 8 binaire cijfers). Omdat het Huffman-coderende algoritme de 8-bits-formaat niet gebruikt, hebben gecodeerde bestanden vaak geen lengten die veelvouden van 8 zijn. De resterende cijfers worden ingevuld met 0s. In dit geval zouden twee 0s aan het einde van het bestand worden toegevoegd, dat lijkt op een andere ruimte. Dit kan een probleem zijn: hoe zou de decoder weten wanneer ze moeten stoppen met lezen? Omdat we echter een kenmerk van het einde van het bestand opgenomen, zal de decoder dit bereiken en dan stoppen, wat ergens anders is toegevoegd, waaraan wordt toegevoegd.
  • Deel 2 van 2:
    Decodering
    1. Titel afbeelding Compress-gegevens met Huffman Codering Stap 8
    1. Lees in een HuffMan-gecodeerd bestand. Lees eerst de koptekst, wat de coderingskaart zou moeten zijn. Gebruik dit om een ​​decoderingsboom op te bouwen op dezelfde manier waarop u de boom hebt gebouwd die u hebt gebruikt om het bestand te coderen. De twee bomen moeten identiek zijn.
  • Titel afbeelding Compress-gegevens met Huffman Codering Stap 9
    2. Lees in het binaire één cijfer tegelijk. Doorkruisen de boom terwijl je leest: als je in een `0` leest, ga dan naar het linker kind van het knooppunt dat je bent, en als je leest in een `1`, ga dan naar het juiste kind. Wanneer u een blad bereikt (een knooppunt zonder kinderen), bent u aangekomen bij een personage. Schrijf het personage in het gedecodeerde bestand.
  • Vanwege de manier waarop de personages in de boom worden opgeslagen, hebben de codes voor elk personage een Prefix Property, Zodat de binaire codering van geen enkele karakter ooit kan optreden aan het begin van de codering van een ander personage. De codering voor elk personage is volledig uniek. Dit maakt het decoderen veel gemakkelijker.
  • Titel afbeelding Compress-gegevens met Huffman Codering Stap 10
    3. Herhaal totdat u het EOF bereikt. Gefeliciteerd! Je hebt het bestand decoderen.
  • Tips

    Deel in het sociale netwerk:
    Vergelijkbaar