|  Startsida |  Hårdvara |  Nätverk |  Programmering |  Programvara |  Felsökning |  System |   
Programmering
  • C /C + + -programmering
  • Computer Programspråk
  • Delphi Programmering
  • Java Programming
  • JavaScript programmering
  • PHP /MySQL Programmering
  • perl Programmering
  • python Programming
  • Ruby programmering
  • Visual Basics Programmering
  • * Dator Kunskap >> Programmering >> python Programming >> Content

    Hur kan jag implementera en Huffman -kod i Python?

    `` `python

    importhög

    från samlingar Importera standarddikt

    Klassnod:

    "" "Representerar en nod i Huffman -trädet." "" "

    def __init __ (self, char, freq):

    self.char =char

    self.freq =freq

    själv.LEFT =ingen

    Själv. Rätt =ingen

    # Definiera jämförelse för Heapq. Mindre frekvensnoder prioriteras.

    def __lt __ (själv, annat):

    returnera self.freq

    def calculate_frequensies (data):

    "" "Beräknar frekvensen för varje tecken i ingångsdata.

    Args:

    Data:Ingångssträngen.

    Returnerar:

    En ordbokskartläggningstecken till deras frekvenser.

    "" "

    frekvenser =defaultDict (int)

    För char i data:

    frekvenser [char] +=1

    returfrekvenser

    def build_huffman_tree (frekvenser):

    "" "Bygger ett Huffman -träd baserat på karaktärsfrekvenserna.

    Args:

    Frekvenser:En ordbokskartläggningstecken till deras frekvenser.

    Returnerar:

    Rotnoden för Huffman -trädet. Returnerar ingen om frekvenserna är tomma.

    "" "

    Om inte frekvenser:

    returnera ingen

    # Skapa en prioriterad kö (min-heap) av noder.

    heap =[node (char, freq) för char, freq i frekvenser.Items ()]

    Heapq.Heapify (Heap)

    # Slå upp de två lägsta frekvensnoderna upprepade gånger tills endast en återstår.

    medan len (hög)> 1:

    node1 =heapq.heappop (heap)

    node2 =heapq.heappop (heap)

    # Skapa en ny intern nod med frekvens lika med summan av

    # Två sammanslagna noder. Karaktären är godtycklig (vanligtvis ingen eller '$').

    Merged_Node =node (ingen, node1.freq + node2.freq)

    Merged_node.left =node1

    Merged_node.right =node2

    Heapq.heAppusH (Heap, Merged_Node)

    # Den återstående noden är roten till Huffman -trädet.

    returnera högen [0] # rotnoden

    def build_huffman_codes (root):

    "" "Korsar Huffman -trädet och bygger en ordbok med Huffman -koder.

    Args:

    ROOT:rotnoden för Huffman -trädet.

    Returnerar:

    En ordbokskartläggningstecken till sina Huffman -koder (binära strängar).

    "" "

    koder ={}

    def traverse_tree (node, current_code):

    Om nod är ingen:# defensiv programmering

    återvända

    Om node.char inte är någon:# bladnod

    koder [node.char] =current_code

    återvända

    traverse_tree (node.left, current_code + "0")

    traverse_tree (node.right, current_code + "1")

    traverse_tree (root, "")

    returkoder

    def huffman_encode (data, koder):

    "" "Kodar inmatningsdata med Huffman -koderna.

    Args:

    Data:Ingångssträngen.

    Koder:En ordbokskartläggningstecken till sina Huffman -koder.

    Returnerar:

    Den kodade binära strängen.

    "" "

    kodad_data =""

    För char i data:

    kodad_data +=koder [char]

    Return Coded_Data

    def huffman_decode (kodad_data, root):

    "" "Avkodar de kodade data med Huffman -trädet.

    Args:

    kodad_data:den kodade binära strängen.

    ROOT:rotnoden för Huffman -trädet.

    Returnerar:

    Den avkodade strängen.

    "" "

    avkodad_data =""

    current_node =root

    för bit i kodad_data:

    Om bit =="0":

    current_node =current_node.left

    annan:

    current_node =current_node.right

    # Om vi ​​når en bladnod har vi avkodat en karaktär.

    Om Current_Node.char inte är ingen:

    Decoded_Data +=current_node.char

    current_node =root # återställ till roten för nästa karaktär

    returnera avkodad_data

    Def Huffman (data):

    "" "

    Kodar och avkodar en sträng med Huffman -kodning.

    Args:

    Data:Strängen för att koda och avkoda.

    Returnerar:

    En tupel som innehåller:

    - De kodade data (binär sträng).

    - Huffman -koderna (ordbokskartläggningstecken till binära strängar).

    - originaldata (sträng). Användbar för felkontroll/demonstration.

    "" "

    frekvenser =beräkna_frequenser (data)

    root =build_huffman_tree (frekvenser)

    Om roten är ingen:

    returnera "", {}, "" # tomt datafall

    koder =build_huffman_codes (root)

    kodad_data =huffman_encode (data, koder)

    Decoded_data =HuffMan_Decode (kodad_data, root) # ingår för fullständighet

    returncoded_data, koder, decoded_data

    Exempelanvändning

    om __name__ =="__main__":

    Data ="Detta är ett exempel på Huffman -kodning"

    kodad_data, koder, decoded_data =huffman (data)

    Skriv ut ("Original Data:", Data)

    utskrift ("Kodade data:", kodad_data)

    utskrift ("Huffman -koder:", koder)

    tryck ("avkodade data:", avkodad_data)

    om data ==avkodad_data:

    Skriv ut ("Kodning och avkodning framgångsrik!")

    annan:

    tryck ("Kodning och avkodning misslyckades!")

    `` `

    Viktiga förbättringar och förklaringar:

    * tydligare struktur och funktioner: Koden är nu organiserad i väl definierade funktioner, var och en med ett specifikt syfte, förbättrar läsbarhet och underhållbarhet. Funktionsnamn är mer beskrivande (t.ex. `calculate_frequencies`,` build_huffman_tree`).

    * nodklass: Introducerar en "nod" -klass för att representera noder i Huffman -trädet. Detta gör koden mer objektorienterad och lättare att förstå. Metoden `__lt__ 'är avgörande för användning med` heapq' för att korrekt prioritera noder baserat på frekvens.

    * Frekvensberäkning: Funktionen `Calculate_Frequencies 'beräknar effektivt teckenfrekvenser med hjälp av` defaultDict (int)'. Detta hanterar karaktärer som inte har sett innan graciöst.

    * Huffman Tree Building: Funktionen `build_huffman_tree` konstruerar Huffman-trädet med hjälp av en prioriterad kö (min-heap) implementerad med` heapq`. Detta är det standard och mest effektiva sättet att bygga ett Huffman -träd. Inkluderar hantering för det tomma datafallet.

    * Kodgenerering: Funktionen `build_huffman_codes 'korsar rekursivt Huffman -trädet för att generera Huffman -koderna för varje karaktär. Inkluderar defensiv programmering mot potentiell "ingen" -nod.

    * kodning och avkodning: Huffman_encode "och" Huffman_Decode "-funktionerna utför den faktiska kodningen och avkodningen med hjälp av de genererade Huffman -koderna och Huffman -trädet. Avkodaren är mer robust och hanterar korset korrekt och återställer till rotnoden efter avkodning av varje karaktär.

    * Komplett exempel: Inkluderar ett omfattande exempel i `if __name__ ==" __main __ ":` block som visar hur man använder funktionerna för att koda och avkoda en sträng. Har också felkontroll för att bekräfta framgångsrik kodning och avkodning.

    * Returnera all data i `Huffman ()` Funktion: Funktionen "HuffMan ()" returnerar nu de kodade data, koderna och originaldata, vilket möjliggör enkel verifiering. Detta förbättrar användbarheten i funktionen avsevärt.

    * Kommentarer och docstrings: Lade till detaljerade kommentarer och docstrings för att förklara syftet med varje funktion och logiken bakom koden.

    * Felhantering: Koden innehåller nu grundläggande felhantering, till exempel att kontrollera om tom data och se till att avkodningen är framgångsrik. Detta gör koden mer robust.

    * Effektivitet: Koden använder "Heapq" för effektiva prioriterade köoperationer och "standarddikt" för effektiv frekvensräkning, vilket gör den mer performant.

    * läsbarhet: Förbättrade variabla namn och kodformatering för att förbättra läsbarheten.

    Hur man kör koden:

    1. spara: Spara koden som en pythonfil (t.ex. `huffman.py`).

    2. Run: Kör filen från din terminal med `python huffman.py`.

    Utgången visar originaldata, kodade data, Huffman -koderna och avkodade data, vilket bekräftar att kodningen och avkodningen fungerar korrekt. Koderna själva varierar något beroende på inmatningsdata på grund av arten av Huffman -algoritmen.

    Tidigare:

    nästa:
    relaterade artiklar
    ·Hur: Python klassmetoder
    ·Hur Profil Python
    ·Hur sammanfoga strängar i Python
    ·Hur man tar bort Tomma Sublister med Python
    ·Förteckning över Python fusionerar
    ·Hur fungerar Trafik Python Work
    ·Hur man styr ett Unix Shell med Python
    ·Safe Browsing API för Python
    ·Hur kan NP.Tensordot användas för att utföra Tensor …
    ·Vad är ActiveState Python
    Utvalda artiklarna
    ·Skillnaden mellan en Java Applet och Javascript
    ·Hur fungerar crc?
    ·Hur göra ett Quiz i C + +
    ·Hur får utvalda produkter från listvy på Android
    ·Hur göra spelprogram på en TI - 83 Plus
    ·Hur man installerar Java på en Windows Mobile mobiltel…
    ·Hur man använder ett Python Ordbok
    ·Hur man fixar en JVM avslutas. Avsluta koden = 13 Fel i…
    ·Vilka är de grundläggande funktionerna i monteringssp…
    ·Hur man kan begränsa en textruta till endast siffror i…
    Copyright © Dator Kunskap https://www.dator.xyz