Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky
import hale
Z kolekcií import defaultDict
uzol triedy:
"" "Predstavuje uzol v strome Huffman." "
def __init __ (ja, char, freq):
self.char =char
self.freq =freq
self.left =žiadny
self.right =žiadny
# Definujte porovnanie pre HEAPQ. Menšie frekvenčné uzly sú prioritné.
def __lt __ (ja, iné):
return self.freq
def vypočítať_frequencies (údaje):
"" "Vypočíta frekvenciu každého znaku vo vstupných údajoch.
ARG:
Dáta:Vstupný reťazec.
Návraty:
Znaky mapovania slovníka na ich frekvencie.
"" "
frekvencie =defaultDict (int)
pre char v údajoch:
frekvencie [char] +=1
frekvencie
def Build_huffman_tree (frekvencie):
"" "Vytvára strom Huffman na základe frekvencií znakov.
ARG:
Frekvencie:Slovník mapovanie znakov ich frekvencií.
Návraty:
Koreňový uzol stromu Huffman. Vracia sa, ak je frekvencie prázdne.
"" "
ak nie frekvencie:
NOT
# Vytvorte prioritný front (min-haap) uzlov.
halda =[uzol (char, freq) pre char, freq vo frekvenciách.items ()]
Hepq.Heapify (halda)
# Opakovane zlúčte dva uzly s najnižšou frekvenciou, kým nezostane iba jeden.
zatiaľ čo Len (halda)> 1:
NODE1 =hEAPQ.HEAPPOP (halda)
NODE2 =hEAPQ.HEAPPOP (halda)
# Vytvorte nový vnútorný uzol s frekvenciou rovnajúcou sa súčtu
# dva zlúčené uzly. Postava je svojvoľná (zvyčajne žiadna alebo „$“).
merged_node =node (none, node1.freq + node2.freq)
merged_node.left =node1
merged_node.right =node2
Hepq.Heappush (Heap, merged_node)
# Zostávajúci uzol je koreňom stromu Huffman.
návrat haldy [0] # koreňový uzol
def Build_huffman_codes (root):
"" "Prechádza huffmanovým stromom a stavia slovník Huffmanov kódov.
ARG:
Koreň:koreňový uzol stromu Huffman.
Návraty:
Znaky mapovania slovníka pre ich kódy Huffman (binárne reťazce).
"" "
kódy ={}
def traverse_tree (uzol, current_code):
Ak uzol nie je:# Defenzívne programovanie
návrat
Ak node.char nie je nijaké:# uzol listov
kódy [node.char] =current_code
návrat
Traverse_tree (Node.left, current_code + "0")
Traverse_tree (Node.right, Current_code + "1")
Traverse_tree (root, "")
spätné kódy
def huffman_encode (údaje, kódy):
"" "Kóduje vstupné údaje pomocou kódov Huffman.
ARG:
Dáta:Vstupný reťazec.
Kódy:Slovník mapovanie znakov ich Huffmanov kódov.
Návraty:
Kódovaný binárny reťazec.
"" "
Encoded_data =""
pre char v údajoch:
Encoded_data +=Codes [char]
return ucoded_data
def huffman_decode (CONDODED_DATA, root):
"" "Dekóduje kódované údaje pomocou stromu Huffman.
ARG:
Encoded_data:kódovaný binárny reťazec.
Koreň:koreňový uzol stromu Huffman.
Návraty:
Dekódovaný reťazec.
"" "
Decoded_data =""
current_node =root
pre bit v Codcoded_data:
Ak bit =="0":
current_node =current_node.left
inak:
current_node =current_node.Right
# Ak dosiahneme uzol listov, dekódovali sme postavu.
Ak current_node.char nie je nijaké:
Decoded_data +=current_node.char
current_node =root # reset na koreň pre ďalší znak
návrat dekódovaný_data
def huffman (údaje):
"" "
Kóduje a dekóduje reťazec pomocou kódovania Huffman.
ARG:
Dáta:reťazec na kódovanie a dekódovanie.
Návraty:
Tuple obsahujúce:
- kódované údaje (binárny reťazec).
- Huffmanove kódy (znaky mapovania slovníka na binárne reťazce).
- Pôvodné údaje (reťazec). Užitočné na kontrolu/demonštráciu chýb.
"" "
frekvencie =výpočet_frequencies (údaje)
root =build_huffman_tree (frekvencie)
Ak koreň nie je:
návrat "", {}, "" # prázdny dátový prípad
Codes =Build_Huffman_Codes (root)
Encoded_data =huffman_encode (dáta, kódy)
Decoded_data =huffman_decode (CONDODED_DATA, ROOT) # Zahrnuté pre úplnosť
return encoded_data, kódy, dekódované_data
Ak __name__ =="__main__":
data ="Toto je príklad kódovania Huffmana"
CONDODED_DATA, Kódy, Decoded_data =Huffman (dáta)
tlač ("Pôvodné údaje:", údaje)
Print ("kódované údaje:", CONDODED_DATA)
tlač ("Huffmanove kódy:", kódy)
Print ("Dekódované údaje:", Decoded_data)
Ak dáta ==Decoded_data:
tlač („Úspešné kódovanie a dekódovanie!“)
inak:
tlač („Kódovanie a dekódovanie zlyhalo!“)
`` `
Kľúčové vylepšenia a vysvetlenia:
* Čistejšia štruktúra a funkcie: Kód je teraz usporiadaný do dobre definovaných funkcií, z ktorých každá má špecifický účel, zlepšuje čitateľnosť a udržiavateľnosť. Názvy funkcií sú opisnejšie (napr. `CALL_FREQUENCIES`,` BUBULT_HUFFMAN_TREE`).
* trieda uzlov: Predstavuje triedu „uzol“, ktorá reprezentuje uzly v strome Huffman. Vďaka tomu je kód viac objektovo orientovaný a ľahšie pochopiteľný. Metóda `__lt__` je rozhodujúca pre použitie s` hEAPQ` na správne uprednostňovanie uzlov na základe frekvencie.
* Výpočet frekvencie: Funkcia `výpočet_frequencies` efektívne vypočíta frekvencie znakov pomocou` defaultDict (int) `. To zvládne znaky, ktoré sa predtým nevideli elegantne.
* Huffman Tree Building: Funkcia `Build_huffman_tree` konštruuje strom Huffman pomocou prioritného frontu (min-haap) implementovaný s` hEAPQ`. Toto je štandardný a najúčinnejší spôsob, ako vybudovať strom Huffman. Zahŕňa manipuláciu s prázdnym dátovým puzdrom.
* Generovanie kódu: Funkcia `Build_huffman_codes` rekurzívne prechádza stromom Huffman, aby vygeneroval kódy Huffman pre každú postavu. Zahŕňa obranné programovanie proti potenciálnemu uzlu „žiadny“.
* kódovanie a dekódovanie: Funkcie „Huffman_enCode` a` Huffman_decode` vykonávajú skutočné kódovanie a dekódovanie pomocou vygenerovaných kódov Huffman a Huffman Tree. Dekodér je robustnejší a spracováva sa správne prechádza stromom a po dekódovaní každého znaku sa resetuje na koreňový uzol.
* Kompletný príklad: Zahŕňa komplexný príklad v `if __name__ ==" __main __ ":` blok, ktorý demonštruje, ako používať funkcie na kódovanie a dekódovanie reťazca. Má tiež kontrolu chýb, aby sa potvrdilo úspešné kódovanie a dekódovanie.
* Vráťte všetky údaje v `huffman ()` funkcia: Funkcia „Huffman ()“ teraz vracia kódované údaje, kódy a pôvodné údaje, čo umožňuje ľahké overenie. To výrazne zlepšuje použiteľnosť funkcie.
* Komentáre a dokument: Pridané podrobné komentáre a dokumenty, ktoré vysvetľujú účel každej funkcie a logiku za kódom.
* Manipulácia s chybami: Kód teraz obsahuje základné spracovanie chýb, ako napríklad kontrola prázdnych údajov a zabezpečenie úspešnosti dekódovania. Vďaka tomu je kód robustnejším.
* Účinnosť: Kód používa „hEAPQ` na efektívne prioritné operácie frontov a„ defaultDict “na efektívne počítanie frekvencie, čo je výkonnejšie.
* Čítateľnosť: Vylepšené názvy premenných a formátovanie kódu na zlepšenie čitateľnosti.
Ako spustiť kód:
1. uložiť: Uložte kód ako súbor Python (napr. „Huffman.py`).
2. beh: Vykonajte súbor z terminálu pomocou `Python huffman.py`.
Výstup zobrazí pôvodné údaje, kódované údaje, kódy Huffman a dekódované údaje, čo potvrdzuje, že kódovanie a dekódovanie fungujú správne. Samotné kódy sa budú mierne líšiť v závislosti od vstupných údajov v dôsledku povahy algoritmu Huffman.
Príklad použitia