|
#Codigo de Huffman |
|
import string, operator |
|
alphabet = string.ascii_lowercase |
|
|
|
#adicionar 0 ou 1 para cada caracter |
|
def createHuffman(letter, b): |
|
if not letter.startswith('union'): |
|
dic_cdg[letter] += `b` |
|
else: |
|
for i in range(len(combinedArray)): |
|
if combinedArray[i][0] == letter: |
|
createHuffman(combinedArray[i][1], b) |
|
createHuffman(combinedArray[i][2], b) |
|
|
|
def getHuffman(message): |
|
message = list(string.lower(message)) |
|
huffmanCode = '' |
|
global dic_caracter |
|
dic_caracter = {} |
|
global combinedArray |
|
combinedArray = [] |
|
global dic_cdg |
|
dic_cdg = {} |
|
#inicializar dicionario |
|
for letter in alphabet: |
|
dic_caracter[letter] = 0 |
|
|
|
#calcular frequencia de cada letra |
|
for letter in message: |
|
if letter != ' ': |
|
dic_caracter[letter] += 1 |
|
dic_cdg[letter] = '' |
|
|
|
#deletar letras com frequencia = 0 |
|
for item in dic_caracter.items(): |
|
if item[1] == 0: |
|
del dic_caracter[item[0]] |
|
|
|
#calcular codigo de Huffman |
|
for i in range(len(dic_caracter)-1): |
|
#ordenar e adicionar os dois primeiros caracateres |
|
aux = sorted(dic_caracter.items(), key=operator.itemgetter(1)) |
|
dic_caracter['union'+`i`] = aux[0][1] + aux[1][1] |
|
combinedArray.append(['union'+`i`,aux[0][0],aux[1][0]]) |
|
if aux[0][1] <= aux[1][1]: |
|
createHuffman(aux[0][0],0) |
|
createHuffman(aux[1][0],1) |
|
else: |
|
createHuffman(aux[1][0],0) |
|
createHuffman(aux[0][0],1) |
|
del dic_caracter[aux[0][0]] |
|
del dic_caracter[aux[1][0]] |
|
|
|
#reverter codigo obtido para cada caracter |
|
for i in dic_cdg.items(): |
|
dic_cdg[i[0]] = dic_cdg[i[0]][::-1] |
|
|
|
#definir codigo com base na mensagem |
|
for letter in message: |
|
if letter != ' ': |
|
huffmanCode += dic_cdg[letter] |
|
|
|
return huffmanCode |