Så här komprimerar du data med huffman som kodar
Huffmans algoritm används för att komprimera eller koda data. Normalt lagras varje tecken i en textfil som åtta bitar (siffror, antingen 0 eller 1) som kartlägger till den tecknet med en kodning som heter ASCII. En Huffman-kodad fil bryter ner den styva 8-bitars strukturen så att de vanligaste tecknen lagras på bara några bitar ("A" kan vara "10" eller "1000" snarare än ASCII, som är "01100001"). De minst vanliga tecknen kommer då ofta att ta upp mycket mer än 8 bitar (`Z` kan vara "00100011010"), men för att de förekommer så sällan, skapar Huffman, på det hela taget en mycket mindre fil än originalet.
Steg
Del 1 av 2:
Kodning1. Räkna frekvensen för varje tecken i filen som ska kodas. Inkludera en dummy-karaktär för att markera slutet på filen - det här blir viktigt senare. För närvarande, kalla det EF (slutet av filen) och markera det som en frekvens på 1.
- Till exempel, om du vill koda en textfil läsning "AB AB Cab," Du skulle ha "A" med frekvens 3, `b` med frekvens 3, `` (utrymme) med frekvens 2, `c` med frekvens 1 och EOF med frekvens 1.
2. Förvara tecken som trädnoder och sätta dem i en prioritetskö. Du kommer att bygga ett stort binärt träd med varje tecken som ett blad, så du bör lagra karaktärerna i ett format så att de kan bli noder av trädet. Placera dessa noder i en prioritetskö med varje karaktärs frekvens som nodens prioritet.
3. Börja bygga ditt träd. Ta bort (eller dequeue) de två mest brådskande sakerna från prioritetskön. Skapa en ny trädkod för att vara förälder till dessa två noder, lagra den första noden som sitt vänstra barn och den andra som sitt rätt barn. Prioriteringen av den nya noden bör vara summan av barnets prioriteringar. Sedan enqueue den här nya noden i prioritetskön.
4. Avsluta Bygga ditt träd: Upprepa ovanstående steg tills det bara finns en nod i köen. Observera att förutom de noder du skapade för tecknen och deras frekvenser, kommer du också att avstänga, vända sig till träd och re-enqueueing modernoder, noder som redan är själva träd.
5. Skapa en Kodningskartan. Gå genom trädet för att nå varje tecken. Varje gång du besöker en nods vänstra barn, är det en "0". Varje gång du besöker en nods rätt barn, är det en "1". När du kommer till ett tecken, lagra karaktären med sekvensen av 0s och 1s som det tog för att komma dit. Denna sekvens är vad tecknet kommer att kodas som i den komprimerade filen. Förvara tecknen och deras sekvenser i en karta.
6. I utdatafilen, inkludera kodningskartan som en rubrik. Detta gör det möjligt för filen att avkodas.
7. Koda filen. För varje tecken i filen som ska kodas skriver du den binära sekvensen du har lagrat på kartan. När du är klar med att koda filen, se till att du lägger till EOF till slutet.
Del 2 av 2:
Avkodning1. Läs i en Huffman-kodad fil. Läs först rubriken, som ska vara kodningskartan. Använd detta för att bygga ett avkodningsträd på samma sätt som du byggde det träd som du använde för att koda filen. De två träden ska vara identiska.
2. Läs i den binära en siffra i taget. Traverse trädet som du läser: Om du läser i en "0", gå till nodens vänstra barn du är på, och om du läser i en "1", gå till rätt barn. När du når ett blad (en nod utan några barn) har du kommit fram till ett tecken. Skriv tecknet i den avkodade filen.
3. Upprepa tills du når EOF. Grattis! Du har avkodat filen.
Tips
Dela på det sociala nätverket: