Jak komprimovat data pomocí Huffmanova kódování: 10 kroků

Obsah:

Jak komprimovat data pomocí Huffmanova kódování: 10 kroků
Jak komprimovat data pomocí Huffmanova kódování: 10 kroků

Video: Jak komprimovat data pomocí Huffmanova kódování: 10 kroků

Video: Jak komprimovat data pomocí Huffmanova kódování: 10 kroků
Video: No BS Advice To Anyone Who Wants To Be A Screenwriter - Jim Agnew 2024, Březen
Anonim

Huffmanův algoritmus se používá ke kompresi nebo kódování dat. Obvykle je každý znak v textovém souboru uložen jako osm bitů (číslic, buď 0 nebo 1), které jsou mapovány na tento znak pomocí kódování nazývaného ASCII. Soubor kódovaný Huffmanem rozbíjí tuhou 8bitovou strukturu, takže nejpoužívanější znaky jsou uloženy pouze v několika bitech („a“může být „10“nebo „1000“, nikoli ASCII, což je „01100001“). Nejméně běžné znaky tedy často zaberou mnohem více než 8 bitů („z“může být „00100011010“), ale protože se vyskytují tak zřídka, Huffmanovo kódování celkově vytvoří mnohem menší soubor než originál.

Kroky

Část 1 ze 2: Kódování

Komprimujte data pomocí Huffmanova kódování Krok 1
Komprimujte data pomocí Huffmanova kódování Krok 1

Krok 1. Spočítejte frekvenci každého znaku v souboru, který má být kódován

Zahrňte fiktivní znak k označení konce souboru - to bude důležité později. Prozatím jej nazývejte EOF (konec souboru) a označte jej jako frekvenci 1.

Pokud například chcete kódovat textový soubor s nápisem „ab ab cab“, měli byste „a“s frekvencí 3, „b“s frekvencí 3, „(mezeru) s frekvencí 2,„ c “s frekvencí 1 a EOF s frekvencí 1

Komprimujte data pomocí Huffmanova kódování Krok 2
Komprimujte data pomocí Huffmanova kódování Krok 2

Krok 2. Uložte znaky jako uzly stromu a vložte je do prioritní fronty

Budete stavět velký binární strom s každým znakem jako listem, takže byste měli znaky ukládat ve formátu, aby se mohly stát uzly stromu. Umístěte tyto uzly do prioritní fronty s frekvencí každého znaku jako prioritou jeho uzlu.

  • Binární strom je datový formát, kde každý kus dat je uzel, který může mít až jednoho rodiče a dvě podřízené položky. Často je kreslen jako větvící se strom, odtud název.
  • Fronta je vhodně pojmenovaný sběr dat, kde první věc, která jde do fronty, je také první věcí, která vyjde (jako čekání ve frontě). Ve frontě priorit jsou data uložena v pořadí podle jejich priority, takže první věc, která vyjde, je nejnaléhavější věc, věc s nejmenší prioritou, než první věc zařazená do fronty.
  • V příkladu „ab ab cab“by vaše prioritní fronta vypadala takto: {'c': 1, EOF: 1, '': 2, 'a': 3, 'b': 3}
Komprimujte data pomocí Huffmanova kódování Krok 3
Komprimujte data pomocí Huffmanova kódování Krok 3

Krok 3. Začněte stavět svůj strom

Odstraňte (nebo odstraňte) dvě nejnaléhavější věci z prioritní fronty. Vytvořte nový uzel stromu, který bude rodičem těchto dvou uzlů, přičemž první uzel uložíte jako jeho levé dítě a druhý jako jeho pravé dítě. Prioritou nového uzlu by měl být součet priorit jeho podřízeného. Poté zařaďte tento nový uzel do fronty priorit.

Fronta priorit nyní vypadá takto: {'': 2, nový uzel: 2, 'a': 3, 'b': 3}

Komprimujte data pomocí Huffmanova kódování Krok 4
Komprimujte data pomocí Huffmanova kódování Krok 4

Krok 4. Dokončete stavbu svého stromu:

opakujte výše uvedený krok, dokud nebude ve frontě pouze jeden uzel. Všimněte si toho, že kromě uzlů, které jste vytvořili pro postavy a jejich frekvencí, budete také dequeukovat, měnit se na stromy a znovu zařazovat nadřazené uzly, uzly, které už jsou samy stromy.

  • Až budete hotovi, posledním uzlem ve frontě bude kořen stromu kódování a všechny ostatní uzly se z něj větví.
  • Nejčastěji používanými znaky budou listy nejblíže k horní části stromu, zatímco zřídka používané znaky budou umístěny ve spodní části stromu, dále od kořene.
Komprimujte data pomocí Huffmanova kódování Krok 5
Komprimujte data pomocí Huffmanova kódování Krok 5

Krok 5. Vytvořte kódovací mapu. Projděte stromem, abyste dosáhli na každou postavu. Pokaždé, když navštívíte levé dítě uzlu, je to „0“. Pokaždé, když navštívíte správné dítě uzlu, je to „1“. Když se dostanete k postavě, uložte si ji se sekvencí 0s a 1s, kterou jste potřebovali, abyste se tam dostali. Tato sekvence je znak, který bude kódován jako v komprimovaném souboru. Uložte postavy a jejich sekvence na mapu.

  • Začněte například u kořene. Navštivte levé dítě kořene a poté navštivte levé dítě daného uzlu. Vzhledem k tomu, že uzel, ve kterém se nyní nacházíte, nemá žádné děti, dosáhli jste postavy. Tohle je ' '. Protože jste se dostali dvakrát doleva, dostanete se sem, kódování '' je '00'.
  • U tohoto stromu bude mapa vypadat takto: {'': "00", 'a': "10", 'b': "11", 'c': "010", EOF: "011"}.
Komprimujte data pomocí Huffmanova kódování Krok 6
Komprimujte data pomocí Huffmanova kódování Krok 6

Krok 6. Do výstupního souboru zahrňte jako záhlaví kódovací mapu

To umožní dekódování souboru.

Komprimujte data pomocí Huffmanova kódování Krok 7
Komprimujte data pomocí Huffmanova kódování Krok 7

Krok 7. Kódujte soubor

Pro každý znak v souboru, který má být kódován, napište binární sekvenci, kterou jste uložili do mapy. Jakmile kódování souboru dokončíte, nezapomeňte přidat EOF na konec.

  • U souboru „ab ab cab“bude kódovaný soubor vypadat takto: „1011001011000101011011“.
  • Soubory jsou uloženy jako bajty (8 bitů nebo 8 binárních číslic). Protože algoritmus Huffman Encoding nepoužívá 8bitový formát, kódované soubory často nebudou mít délky, které jsou násobky 8. Zbývající číslice budou vyplněny 0 s. V tomto případě by dvě 0 byly přidány na konec souboru, který vypadá jako další mezera. To může být problém: jak by dekodér věděl, kdy přestat číst? Protože jsme však zahrnuli znak konce souboru, dekodér se k tomu dostane a pak se zastaví, ignoruje vše, co bylo přidáno později.

Část 2 ze 2: Dekódování

Komprimujte data pomocí Huffmanova kódování, krok 8
Komprimujte data pomocí Huffmanova kódování, krok 8

Krok 1. Přečtěte si v souboru kódovaném Huffmanem

Nejprve si přečtěte záhlaví, které by mělo být kódovací mapou. Použijte k vytvoření stromu dekódování stejným způsobem, jakým jste vytvořili strom, který jste použili ke kódování souboru. Oba stromy by měly být totožné.

Komprimujte data pomocí Huffmanova kódování Krok 9
Komprimujte data pomocí Huffmanova kódování Krok 9

Krok 2. Přečtěte binární číslici po jedné

Při čtení procházejte stromem: pokud čtete '0', přejděte k levému dítěti uzlu, ve kterém se nacházíte, a pokud čtete '1', přejděte k pravému dítěti. Když dosáhnete listu (uzel bez jakýchkoli dětí), dorazili jste k postavě. Znak zapište do dekódovaného souboru.

Z důvodu způsobu uložení znaků ve stromu mají kódy pro každý znak vlastnost předpony, takže na začátku kódování jiného znaku nemůže nikdy dojít k binárnímu kódování znaku. Kódování pro každý znak je zcela jedinečné. Díky tomu je dekódování mnohem jednodušší

Komprimujte data pomocí Huffmanova kódování, krok 10
Komprimujte data pomocí Huffmanova kódování, krok 10

Krok 3. Opakujte, dokud nedosáhnete EOF

Gratulujeme! Dekódovali jste soubor.

Doporučuje: