kuroshan1104

codigo_huffman

Jun 23rd, 2021 (edited)
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.92 KB | None | 0 0
  1. import os
  2. from time import time
  3.  
  4. class Node: #Declaración de variables para crear los nodos
  5.     probability =0.0 #Declarada como fload
  6.     symbol = " " #Variable vacia
  7.     encodings = ""
  8.     visited = False #variable Boolean
  9.     parent = -1 #Longitud de 0 a -1 variable entera
  10. class Huffman: #Declaración de variables para la creación del arbol de Huffman
  11.     Tree = None #Retornar arbol
  12.     Root = None #Retornar raiz
  13.     Nodes = []
  14.     probs = {} #bloque, instancia el método
  15.     dictEncoder = {}
  16.  
  17.     #1
  18.     def __init__(self,symbols): #Inicianilizamos las funciones, con los atributos que va a utilizar
  19.         self.initNodes(symbols) #retorna valores
  20.         self.buildTree()
  21.         self.buildDictionary()
  22.     #2
  23.  
  24.     def initNodes(self,probs): #creamos los nodos con sus respectivas posibilidades
  25.         for symbol in probs:
  26.             node =Node() #inicializamos el node
  27.             node.symbol = symbol
  28.             node.probability = probs[symbol] # Asiganamos una probabilidad a cada simbolo o letra
  29.             node.visited = False #Variable que no es fija que va a ir cambiando
  30.             self.Nodes.append(node) #creamos una lista para cada nodo creado
  31.             self.probs[symbol]=probs[symbol] #Establece para ca probabilidad de simbolo
  32.     #3
  33.  
  34.     def buildTree(self): #Realizamos las operaciones de acuerdo a la lógica de Huffman
  35.         indexMin1 = self.getNodeWithMinimumProb() #buscamos el menor número de la primera probabilidad
  36.         indexMin2 = self.getNodeWithMinimumProb() #buscamos el menor número de la segunda probabilidad
  37.  
  38.         while indexMin1 != -1 and indexMin2 !=-1: #(!= evalua como verdadero si 2 variable son diferentes)
  39.             node =Node()
  40.             node.symbol="." # se llama el simbolo digitado para que salga el resultado
  41.             node.encodings=""
  42.             #llamamos a las dos probabilidades minimas
  43.             prob1 = self.Nodes[indexMin1].probability
  44.             prob2 = self.Nodes[indexMin2].probability
  45.             node.probability = prob1 + prob2
  46.             node.visited =False #false =1
  47.             node.parent = -1 #restamos la probabilidad a -1
  48.             self.Nodes.append(node)
  49.             self.Nodes[indexMin1].parent = len(self.Nodes) - 1 #lista o cadena que queremos medir
  50.             self.Nodes[indexMin2].parent = len(self.Nodes) - 1
  51.  
  52.             #Regla: 0 a mayor probabilidad, 1 a menor probalidad
  53.             if prob1 >= prob2:
  54.                 self.Nodes[indexMin1].encoding = "0"
  55.                 self.Nodes[indexMin2].encoding = "1"
  56.             else:
  57.                 self.Nodes[indexMin1].encoding = "1"
  58.                 self.Nodes[indexMin2].encoding = "0"
  59.             indexMin1 = self.getNodeWithMinimumProb()
  60.             indexMin2 = self.getNodeWithMinimumProb()
  61.     #4
  62.     def getNodeWithMinimumProb(self):
  63.         minProb = 1.0
  64.         indexMin = -1
  65.         for index in range(0, len(self.Nodes)):
  66.             if (self.Nodes[index].probability) < minProb and (not self.Nodes[index].visited):
  67.                 minProb = self.Nodes[index].probability
  68.                 indexMin = index
  69.  
  70.         if indexMin != -1:
  71.             self.Nodes[indexMin].visited = True
  72.         return indexMin
  73.     #5
  74.     def showSymbolEncoding(self, symbol):
  75.         found = False
  76.         index = 0
  77.         encoding = ""
  78.         for i in range(0, len(self.Nodes)):
  79.             if self.Nodes[i].symbol ==symbol:
  80.                 found = True
  81.                 index = i
  82.                 break
  83.         if found:
  84.             while index != -1:
  85.                 encoding = "%s%s" % (self.Nodes[index].encoding, encoding)
  86.                 index = self.Nodes[index].parent
  87.         else:
  88.             encoding = "simbolo desconocido"
  89.         return encoding
  90.  
  91.     # 6
  92.     def buildDictionary(self):  # Creacion de diccionaio, se guardan los simbolos con sus respectivos
  93.     # codigos binarios resueltos por el arbol
  94.         for symbol in self.probs:
  95.             encoding = self.showSymbolEncoding(symbol)
  96.             self.dictEncoder[symbol] = encoding
  97.  
  98.     # 7
  99.     def encode(self, plain): #Agrupa los codigos binarios codificados de acuerdo al mensaje escrito
  100.         #en la consola
  101.         encoded =""
  102.         for symbol in plain:
  103.             encoded = "%s%s" % (encoded, self.dictEncoder[symbol])
  104.         return encoded
  105.  
  106.     # Inicio de la decodificacion
  107.     def decode(self, encoded):  # Recibe la cadena del codigo binario
  108.         index = 0
  109.         decoded = ""
  110.  
  111.         while index < len(encoded):
  112.             found = False
  113.             #Busca cada en parte codificada un simbolo, buscando cuál es compatible
  114.             #con otra
  115.             aux = encoded[index:]
  116.  
  117.             for symbol in self.probs:
  118.                 if aux.startswith(self.dictEncoder[symbol]):
  119.                     decoded = "%s%s" % (decoded, symbol)
  120.                     index = index + len(self.dictEncoder[symbol])
  121.                     break
  122.  
  123.             return decoded
  124.     #Fin
  125.  
  126. if __name__ == "__main__":
  127.     print ("\n\n............CODIFICACION........\n\n")
  128.     mensaje =input("Ingrese la palabra u oracion: ")
  129.     print ("\n\nTotal de simbolos: \n\n %s"% (len(mensaje)))
  130.     simbolos=''
  131.     probabilidad=[]
  132.     msm=mensaje
  133.     d=0
  134.  
  135.     for i in mensaje:
  136.         if i in msm:
  137.             simbolos+=i
  138.             probabilidad.append(float(float ( msm.count(i))/float(len(mensaje))))
  139.             msm=msm.replace(i, '')
  140.             d+= 1
  141.  
  142.     symbols=dict(zip(simbolos, probabilidad)) #Funcion para llamar al simbolo y a su probabilidad
  143.     print ("\n\nSimbolos comprimidos: \n\n" ,d) #Imprime la cantidad de simbolos que contabilizalo la funcion count
  144.     print ("\n\nPROBABILIDAD DE CADA SIMBOLO:\n\n" , symbols)
  145.     tiempo_inicial=time() #Funcion para determinar el tiempo del programa
  146.     #Codificacion de los simbolos
  147.     huffman=Huffman(symbols) #Llamamos a la clase Huffman
  148.     print ("\n\nSimbolos codificados usando el arbol de Huffman: \n\n")
  149.     for symbol in symbols:
  150.         print ("Simbolo: %s; Codificacion: %s" % (symbol, huffman.showSymbolEncoding(symbol)))
  151.     encoded = huffman.encode(mensaje) #Llama funcion tras funcion para el procedimiento de codificacion
  152.     print ("\n\nMensaje que se esta codificando: \n\n%s" % (mensaje))
  153.     print ("\n\nCodificacion en bits : \n\n%s" % (encoded)) #Notamos el msj en bits
  154.     print ("\n\nLa longitud de codigo binario es: \n\n%s" % (len(encoded)))
  155.     data = encoded
  156.  
  157. #Decodificacion
  158.     print ("\n\n..................DECODIFICACION..................\n\n")
  159.     decoded = huffman.decode(data) #Llamamos a las funciones correspondientes y el mensaje llamado data
  160.     print ("El codigo binario a decodificar es:\n\n", data )
  161.     print ("\n\nEl mensaje decodificando es: \n\n %s" % (decoded)) #Imprimimos el resultado de la funcion decoded
  162.  
  163. #Calculo para el tiempo del procedimiento
  164.     tiempo_final= time()
  165.     tiempo_ejecucion= tiempo_final - tiempo_inicial
  166.     print ('\n\nEl tiempo de transmision es: ',tiempo_ejecucion)
  167. os._exit(0)
Add Comment
Please, Sign In to add comment