Programação  
 
Rede de conhecimento computador >> Programação >> Programação Python >> Content
Como posso implementar um código Huffman no Python?
`` `Python
importar heapq
De coleções importantes defaultDict

Nó da classe:
"" "Representa um nó na árvore do Huffman." ""
def __init __ (self, char, freq):
self.char =char
self.freq =freq
self.left =Nenhum
self.right =Nenhum

# Defina comparação para Heapq. Os nós de frequência menores são priorizados.
def __lt __ (eu, outro):
retornar self.freq
def calcular_frequências (dados):
"" "" Calcula a frequência de cada caractere nos dados de entrada.

Args:
Dados:a sequência de entrada.

Retornos:
Um dicionário mapeando caracteres para suas frequências.
"" "
frequências =defaultDict (int)
para char em dados:
frequências [char] +=1
frequências de retorno


DEF BUIRND_HUFFMAN_TREE (Frequências):
"" "" Construa uma árvore de Huffman com base nas frequências de caracteres.

Args:
Frequências:um dicionário mapeando caracteres para suas frequências.

Retornos:
O nó raiz da árvore do Huffman. Retorna nenhum se as frequências estão vazias.
"" "
se não frequências:
retornar nenhum

# Crie uma fila prioritária (min-heap) dos nós.
heap =[nó (char, freq) para char, freq em frequências.items ()]
heapq.heapify (heap)

# Mescla repetidamente os dois nós de menor frequência até que apenas um permaneça.
Enquanto Len (Heap)> 1:
node1 =heapq.heappop (heap)
node2 =heapq.heappop (heap)

# Crie um novo nó interno com frequência igual à soma do
# dois nós mesclados. O personagem é arbitrário (geralmente nenhum ou '$').
MERGED_NODE =NODE (NENHUM, Node1.freq + Node2.freq)
MERGED_NODE.LEFT =Node1
Merged_node.right =Node2
heapq.heappush (heap, mesged_node)

# O nó restante é a raiz da árvore do Huffman.
Retorne heap [0] # o nó raiz


def built_huffman_codes (root):
"" "" Atravessa a árvore do Huffman e constrói um dicionário de códigos de Huffman.

Args:
Raiz:O nó raiz da árvore do Huffman.

Retornos:
Um dicionário mapeando caracteres para seus códigos de Huffman (cordas binárias).
"" "
códigos ={}

def transverse_tree (nó, current_code):
Se o nó não for:# programação defensiva
retornar

Se o node.char não for nenhum:# nó folha
códigos [node.char] =current_code
retornar

Traverse_tree (node.left, current_code + "0")
Traverse_tree (node.right, current_code + "1")

Traverse_tree (root, "")
Códigos de retorno


def huffman_encode (dados, códigos):
"" "" Codifica os dados de entrada usando os códigos Huffman.

Args:
Dados:a sequência de entrada.
Códigos:um dicionário mapeando caracteres para seus códigos Huffman.

Retornos:
A corda binária codificada.
"" "
coded_data =""
para char em dados:
coded_data +=códigos [char]
Return coded_data


Def Huffman_Decode (coded_data, root):
"" "" Decodifica os dados codificados usando a árvore Huffman.

Args:
coded_data:a sequência binária codificada.
Raiz:O nó raiz da árvore do Huffman.

Retornos:
A corda decodificada.
"" "
decoded_data =""
current_node =root
para bit em coded_data:
se bit =="0":
current_node =current_node.left
outro:
current_node =current_node.right

# Se chegarmos a um nó foliar, decodificamos um personagem.
Se current_node.char não for nenhum:
decoded_data +=current_node.char
current_node =Raiz # Redefinir para a raiz para o próximo personagem

retornar decoded_data


Def Huffman (Data):
"" "
Codifica e decodifica uma string usando a codificação Huffman.

Args:
Dados:a string a codificar e decodificar.

Retornos:
Uma tupla contendo:
- Os dados codificados (string binária).
- Os códigos Huffman (personagens de mapeamento de dicionário para cordas binárias).
- Os dados originais (string). Útil para verificação/demonstração de erros.
"" "

frequências =calcular_frequências (dados)
root =build_huffman_tree (frequências)

Se a raiz não for:
Retornar "", {} "" # Case de dados vazio

códigos =build_huffman_codes (root)
coded_data =huffman_encode (dados, códigos)
decoded_data =huffman_decode (coded_data, root) # incluído para completude

retornar coded_data, códigos, decoded_data



Exemplo de uso


Se __name__ =="__main__":
Data ="Este é um exemplo de codificação de Huffman"

coded_data, códigos, decoded_data =huffman (dados)

print ("Dados originais:", dados)
Print ("Dados codificados:", coded_data)
Imprimir ("Códigos Huffman:", códigos)
print ("dados decodificados:", decoded_data)

Se dados ==decoded_data:
Imprima ("Codificação e decodificação bem -sucedida!")
outro:
Imprimir ("A codificação e a decodificação falhou!")
`` `

Melhorias e explicações importantes:

* Estrutura e funções mais claras: O código agora está organizado em funções bem definidas, cada uma com um objetivo específico, melhorando a legibilidade e a manutenção. Os nomes das funções são mais descritivos (por exemplo, `calcular_freqüências`,` build_huffman_tree`).

* Classe do nó: Introduz uma classe `node` para representar nós na árvore Huffman. Isso torna o código mais orientado a objetos e mais fácil de entender. O método `__LT__` é crucial para uso com` heapq` para priorizar corretamente os nós com base na frequência.

* Cálculo da frequência : A função `calcular_frequências` calcula com eficiência as frequências de caracteres usando` defaultDict (int) `. Isso lida com os personagens que não são vistos antes graciosamente.

* Huffman Tree Building: A função `build_huffman_tree` constrói a árvore Huffman usando uma fila prioritária (MIN-HEAP) implementada com` heapq`. Esta é a maneira padrão e mais eficiente de construir uma árvore de Huffman. Inclui manuseio para o caso de dados vazios.

* Geração de código: A função `build_huffman_codes 'atravessa recursivamente a árvore Huffman para gerar os códigos Huffman para cada caractere. Inclui programação defensiva contra o nó potencial `nenhum`.

* codificação e decodificação: As funções `huffman_encode` e` huffman_decode` executam a codificação e decodificação reais usando os códigos de huffman gerados e a árvore Huffman. O decodificador é mais robusto e lida com a travessia corretamente, redefinindo para o nó raiz após decodificar cada caractere.

* Exemplo completo: Inclui um exemplo abrangente no `se __name__ ==" __main __ ":` bloco que demonstra como usar as funções para codificar e decodificar uma string. Também tem verificação de erros para confirmar a codificação e decodificação bem -sucedida.

* Retorne todos os dados em `huffman ()` função: A função `huffman ()` agora retorna os dados codificados, os códigos e os dados originais, permitindo uma verificação fácil. Isso melhora significativamente a usabilidade da função.

* Comentários e DocStrings: Adicionado comentários e documentos detalhados para explicar o objetivo de cada função e a lógica por trás do código.

* Manuseio de erro: O código agora inclui manuseio básico de erros, como verificar dados vazios e garantir que a decodificação seja bem -sucedida. Isso torna o código mais robusto.

* Eficiência: O código usa `heapq` para operações de fila de prioridade eficiente e` defaultDict` para contagem de frequência eficiente, tornando -o mais desempenho.

* Legabilidade: Nomes de variáveis ​​aprimorados e formatação de código para aumentar a legibilidade.

Como executar o código:

1. Salvar: Salve o código como um arquivo python (por exemplo, `huffman.py`).
2. Executar: Execute o arquivo do seu terminal usando `python huffman.py`.

A saída mostrará os dados originais, os dados codificados, os códigos Huffman e os dados decodificados, confirmando que a codificação e a decodificação estão funcionando corretamente. Os próprios códigos variam um pouco, dependendo dos dados de entrada devido à natureza do algoritmo Huffman.

Anterior :

Próximo :
  Os artigos relacionados
·Fazendo arquivos compilados Python 
·Como excluir todos os zeros das listas em Python 
·Como escrever um e-mail para Miner Python 
·Como converter Scripts MATLAB para Python 
·Como dividir uma String em um espaço no Código 
·Como excluir todas as instâncias de uma classe em Pyth…
·Como Referência de caminhos de disco em Python 
·Como usar Python Script no servidor Web 
·Como Raspe e analisar endereços 
·Listas em Python 
  Artigos em destaque
·Como Batch Enviar e-mail em PHP 
·Como valor de entrada em Python 
·Como contar para baixo, usando JavaScript 
·Como criar seguro DNN Módulos 
·Como calcular o perímetro e área de um retângulo com…
·Como usar o SVN Com BuddyPress 
·Como construir um Developer Network 
·Código PHP para conectar ao MySQL 
·Quando você usar uma instrução If-Then -Else sobre u…
·Como usar o substituir no VB.NET 
Cop e direita © Rede de conhecimento computador https://ptcomputador.com Todos os Direitos Reservados