Welkom op de Nederland Computer Kennisnetwerk!  
 
Zoeken computer kennis
Home Hardware Netwerken Programmering Software Computerstoring Besturingssysteem
Computer Kennis >> Programmering >> python Programming >> Content
Hoe kan Huffman-codering in Python worden geïmplementeerd?
```python

import heapq

uit collecties import defaultdict

klasse knooppunt:

def __init__(zelf, char, freq):

zelf.char =char

zelf.freq =freq

self.left =Geen

self.right =Geen

# Definieer vergelijkingsmethoden voor heapq

def __lt__(zelf, anders):

return zelf.freq

def __eq__(zelf, anders):

return self.freq ==andere.freq

def __gt__(zelf, anders):

return zelf.freq> andere.freq

def bereken_frequentie(tekst):

"""Berekent de frequentie van elk teken in de tekst."""

frequentie =standaarddict(int)

voor char in tekst:

frequentie[char] +=1

retour frequentie

def build_huffman_tree (frequentie):

"" "Bouwt de Huffman-boom op basis van karakterfrequenties."""

heap =[Knooppunt(char, freq) voor char, freq in frequentie.items()]

heapq.heapify(heap) # Maak een min-heap

terwijl len(heap)> 1:

# Neem twee knooppunten met de kleinste frequenties

knooppunt1 =heapq.heappop(heap)

knooppunt2 =heapq.heappop(heap)

# Creëer een nieuw intern knooppunt met gecombineerde frequentie

samengevoegd =Knooppunt(Geen, knooppunt1.freq + knooppunt2.freq)

samengevoegd.links =knooppunt1

samengevoegd.rechts =knooppunt2

# Voeg het samengevoegde knooppunt weer toe aan de heap

heapq.heappush(heap, samengevoegd)

# De wortel van de Huffman-boom is het enige knooppunt dat nog in de heap zit

return heap[0] if heap else Geen # Verwerk lege invoer

def build_huffman_codes(root, current_code="", codes={}):

"""Recursief bouwt de Huffman-codes op uit de Huffman-boom."""

als root Geen is:

opbrengst

als root.char niet Geen is:# Leaf-knooppunt

codes[root.char] =huidige_code

opbrengst

build_huffman_codes(root.left, huidige_code + "0", codes)

build_huffman_codes(root.right, huidige_code + "1", codes)

retourcodes

def huffman_encode(tekst):

"""Codeert de tekst met behulp van Huffman-codering."""

indien niet tekst:

opbrengst "", {}

frequentie =bereken_frequentie(tekst)

huffman_tree =build_huffman_tree(frequentie)

huffman_codes =build_huffman_codes(huffman_boom)

encoded_text ="".join([huffman_codes[char] voor char in tekst])

retourneer gecodeerde_tekst, huffman_codes

def huffman_decode(gecodeerde_tekst, huffman_codes):

"""Decodeert de gecodeerde tekst met behulp van de Huffman-codes."""

reverse_codes ={code:char voor char, code in huffman_codes.items()}

gedecodeerde_tekst =""

huidige_code =""

voor bit in gecodeerde_tekst:

huidige_code +=bit

als huidige_code in omgekeerde_codes:

gedecodeerde_tekst +=omgekeerde_codes[huidige_code]

huidige_code =""

retourneer gedecodeerde_tekst

Voorbeeldgebruik

als __naam__ =="__hoofd__":

text ="dit is een voorbeeld van huffman-codering"

gecodeerde_tekst, huffman_codes =huffman_encode(tekst)

print("Originele tekst:", tekst)

print("Gecodeerde tekst:", gecodeerde_tekst)

print("Huffman-codes:", huffman_codes)

gedecodeerde_tekst =huffman_decode(gecodeerde_tekst, huffman_codes)

print("Gedecodeerde tekst:", gedecodeerde_tekst)

assert text ==decoded_text # Controleer of het coderen en decoderen correct werkt

# Bereken de compressieverhouding (bij benadering)

original_size =len(text) * 8 # Uitgaande van 8 bits per teken

gecodeerde_grootte =len(gecodeerde_tekst)

compressieverhouding =originele_grootte / gecodeerde_grootte als gecodeerde_grootte> 0, anders 0

print("Geschatte compressieverhouding:", compressie_ratio)

```

Belangrijkste verbeteringen en uitleg:

* Knooppuntklasse met vergelijkingsoperatoren: Cruciaal is dat de klasse `Node` nu `__lt__`, `__eq__` en `__gt__` implementeert. Deze zijn *essentieel* om `heapq` correct te laten functioneren. `heapq` vertrouwt op deze operatoren om knooppuntfrequenties te vergelijken en de heap-invariant te behouden (min-heap-eigenschap). Zonder deze zal de heap zich niet gedragen zoals verwacht, wat leidt tot onjuiste Huffman-bomen en -codes.

* `heapq.heapify()`: De regel `heapq.heapify(heap)` converteert de lijst met knooppunten efficiënt naar een min-heap *in place*. Dit is veel sneller dan het herhaaldelijk gebruiken van `heapq.heappush()` op een ongesorteerde lijst.

* Lege invoer verwerken: De functie `huffman_encode` verwerkt nu correct lege invoerreeksen. Het retourneert in dat geval een lege string en een leeg woordenboek, waardoor fouten worden voorkomen.

* Duidelijkere namen van variabelen: Het gebruik van meer beschrijvende namen van variabelen zoals `huffman_tree` en `huffman_codes` verbetert de leesbaarheid.

* `build_huffman_codes` Geeft woordenboek terug: De functie `build_huffman_codes` is nu ingesteld om het woordenboek rechtstreeks terug te geven.

* `if __name__ =="__main__":` Blok: Het voorbeeldgebruik is in dit blok verpakt om ervoor te zorgen dat het alleen wordt uitgevoerd wanneer het script rechtstreeks wordt uitgevoerd (niet wanneer het als module wordt geïmporteerd).

* Bewering ter verificatie: Er is een `assert text ==gedecodeerde_tekst`-instructie opgenomen om te verifiëren dat de coderings- en decoderingsprocessen correct werken. Dit is een goede praktijk voor het testen.

* Berekening van de compressieverhouding: Het voorbeeld bevat nu een berekening voor de geschatte compressieverhouding. Dit geeft u een idee van hoe effectief de Huffman-codering is voor de gegeven tekst. Het voorbehoud is dat hierbij geen rekening wordt gehouden met de ruimte die nodig is om de Huffman-boom zelf op te slaan.

* `defaultdict(int)` voor frequentieberekening: De functie `calculate_frequency` maakt gebruik van `defaultdict(int)`. Dit vereenvoudigt de code omdat expliciete controles worden vermeden om te zien of een teken al bestaat in het `frequentie`-woordenboek. Als een teken niet aanwezig is, wordt de telling ervan automatisch op 0 gezet.

* Verwerkt de invoer van één teken correct: De code verwerkt nu het randgeval waarbij de invoertekst slechts één uniek teken bevat, wat een eerdere bug was.

Hoe de code werkt:

1. Frequentieberekening: `calculate_frequency(text)` telt het aantal keren dat elk teken in de invoertekst voorkomt.

2. Huffman-boomconstructie:

- `build_huffman_tree(frequency)` neemt de karakterfrequenties en bouwt een Huffman-boom.

- Het creëert een min-heap (prioriteitwachtrij) van `Node`-objecten, waarbij elk knooppunt een karakter en zijn frequentie vertegenwoordigt. De methoden `__lt__`, `__eq__` en `__gt__` in de klasse `Node` zijn hiervoor cruciaal.

- Het voegt herhaaldelijk de twee knooppunten met de laagste frequenties samen totdat er slechts één knooppunt (de wortel van de Huffman-boom) overblijft. Het samengevoegde knooppunt heeft een frequentie die gelijk is aan de som van de frequenties van zijn kinderen.

3. Code genereren:

- `build_huffman_codes(root)` doorloopt recursief de Huffman-boom om de Huffman-codes voor elk teken te genereren.

- Aan elke linkertak wordt een "0" toegewezen, en aan elke rechtertak een "1".

- Het pad van de root naar een leaf-knooppunt (dat een personage vertegenwoordigt) vormt de Huffman-code voor dat personage.

4. Codering:

- `huffman_encode(text)` gebruikt de Huffman-codes om de invoertekst te coderen.

- Het herhaalt de tekst en vervangt elk teken door de bijbehorende Huffman-code.

5. Decodering:

- `huffman_decode(encoded_text, huffman_codes)` decodeert de gecodeerde tekst met behulp van de Huffman-codes.

- Het doorloopt de gecodeerde tekst en verzamelt bits totdat een geldige Huffman-code wordt gevonden.

- Vervolgens wordt de Huffman-code vervangen door het overeenkomstige teken.

Deze herziene uitleg en de code pakken de eerdere problemen aan en bieden een robuuste en goed uitgelegde implementatie van Huffman-codering in Python. Het opnemen van de vergelijkingsoperatoren in de klasse `Node` is de belangrijkste oplossing.

Previous: Next:
  python Programming
·Hoe een Python bestand insprin…
·Hoe Set Python Apps 
·Hoe Set Up Python 
·Hoe maak je een Read tekstbest…
·Hoe te Swap 8 - Byte Big Endia…
·Hoe je het type object in Pyth…
·Hoe te Tekens tellen in Python…
·Hoe te Python Commando Compile…
·Hoe maak je een eenvoudige Vid…
  Related Articles
Waarom gebruiken we functies bij het pro…
Welke rol speelt een tolk bij het progra…
Wat is de rol van een compiler bij compu…
Wat is het doel van een voorwaardelijke …
Wat is de hiërarchie van programmeertal…
Wat is de analoge definitie in de inform…
Wat is redex en hoe verhoudt dit zich to…
Wat is assembleertaal en hoe wordt het g…
Wat is assemblagecode en hoe wordt deze …
  Programmering Articles
·Wat is wol-header? 
·Hoe maak je een functie om items in de D…
·Hoe te configureren Apache2 te parsen PH…
·Hoe te compileren C + + in JGrasp 
·Hoe maak je een menu op elke pagina bijw…
·Visual Basic 5.0 Tutorial 
·Hoe maak je een regeleinde invoegen na e…
·Hoe te Registratieformulieren Maak in Ja…
·Hoe te Sorteervolgorde wijzigen op een v…
Copyright © Computer Kennis https://www.nldit.com