Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky

Domáce Hardware Siete Programovanie Softvér Otázka Systémy

Ako môžem implementovať Huffmanov kód v Pythone?

`` `Python

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

Príklad použitia

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.

Najnovšie články

Copyright © počítačové znalosti Všetky práva vyhradené