Advertisement
kuroshan1104

huffmanmejorado

Jun 23rd, 2021 (edited)
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.97 KB | None | 0 0
  1. import os
  2. from time import time
  3.  
  4. class Node: # declaracion de variables para crear los nodos
  5.     # properties
  6.     probability = 0.0 # inicializamos
  7.     symbol = ""
  8.     encoding = ""
  9.     visited = False
  10.     parent = -1 # longitud de 0 a -1
  11.  
  12. class Huffman: # declaracion de variables para la creacion del arbol de Huffman
  13.     Tree = None # retornar arbol
  14.     Root = None # retornar raiz
  15.     Nodes = [] #Lista
  16.     probs = {} #bloque
  17.     dictEncoder = {}
  18.  
  19.     # methods
  20.     def __init__(self, symbols):
  21.         self.initNodes(symbols)
  22.         self.buildTree()
  23.         self.buildDictionary()
  24.  
  25.     def initNodes(self, probs): # creamos los nodos con sus respectivas probabiliddes
  26.         for symbol in probs:
  27.             node = Node() # inicializamos el node
  28.             node.symbol = symbol
  29.             node.probability = probs[symbol] # asignamos una probabilidad a cada simbolo o letra
  30.             node.visited = False # variable q no es fija que va ir cambiando
  31.             self.Nodes.append(node) # creamos una lista por cada nodo creado
  32.             self.probs[symbol]=probs[symbol]  # establece para cada probabilidad un simbolo
  33.  
  34.  
  35.     def buildTree(self): # Realizamos las operaciones de acuerdo al regamente para la construccion del arbol de Huffman
  36.         indexMin1 = self.getNodeWithMinimumProb() # Buscamos el menor numero de la primera probabilidad
  37.         indexMin2 = self.getNodeWithMinimumProb() # Buscamos el menor numero de la segunda probabilidad
  38.  
  39.         while indexMin1 != -1 and indexMin2 != -1: # != evalĂșa como verdadero si 2 variables son diferentes
  40.             node = Node() # inicializamos
  41.             node.symbol = "."
  42.             node.encoding = ""
  43.             # llamamos a las dos probabilidades minimas
  44.             prob1 = self.Nodes[indexMin1].probability
  45.             prob2 = self.Nodes[indexMin2].probability
  46.             node.probability = prob1 + prob2 # sumamos las probabilidades
  47.             node.visited = False # false = 1
  48.             node.parent = -1 # restamos la probabilidad a -1
  49.             self.Nodes.append(node)
  50.             self.Nodes[indexMin1].parent = len(self.Nodes) - 1 #  lista o cadena que queremos medir
  51.             self.Nodes[indexMin2].parent = len(self.Nodes) - 1
  52.  
  53.             # Regla: 0 a mayor probabilidad, 1 a menor probabilidad.
  54.             if prob1 >= prob2:
  55.                 self.Nodes[indexMin1].encoding = "0"
  56.                 self.Nodes[indexMin2].encoding = "1"
  57.             else:
  58.                 self.Nodes[indexMin1].encoding = "1"
  59.                 self.Nodes[indexMin2].encoding = "0"
  60.  
  61.             indexMin1 = self.getNodeWithMinimumProb()
  62.             indexMin2 = self.getNodeWithMinimumProb()
  63.  
  64.     def getNodeWithMinimumProb(self): # realizamos una comparacion para obteener el nodo de menor probabilidad
  65.         minProb = 1.0   # La minima probabilidad no puede ser mayor de 1
  66.         indexMin = -1 # indice para restar a la probalidad
  67.  
  68.         for index in range(0, len(self.Nodes)): # index es el numero de probabilidad
  69.             if (self.Nodes[index].probability < minProb  and
  70.                (not self.Nodes[index].visited)):
  71.                 minProb = self.Nodes[index].probability
  72.                 indexMin = index
  73.  
  74.         if indexMin != -1:
  75.             self.Nodes[indexMin].visited = True
  76.  
  77.         return indexMin
  78.  
  79.     def showSymbolEncoding(self, symbol): # designamos un codigo binario a cada simbolo resuelto por el arbol de Huffman
  80.         found = False
  81.         index = 0
  82.         encoding = ""
  83.  
  84.         for i  in range(0, len(self.Nodes)):
  85.             if self.Nodes[i].symbol == symbol:
  86.                 found = True
  87.                 index = i
  88.                 break
  89.  
  90.         if found: # encontro
  91.             while index != -1: # si son diferentes
  92.                 encoding = "%s%s" % (self.Nodes[index].encoding, encoding)
  93.                 index = self.Nodes[index].parent
  94.         else:
  95.             encoding = "simbolo desconocido"
  96.  
  97.         return encoding
  98.  
  99.     def buildDictionary(self): # creamos un diccionario, guardamos todos los simbolos con sus respectivos codigos binarios
  100.                                # resueltos por el arbol de Huffman
  101.         for symbol in self.probs:
  102.             encoding = self.showSymbolEncoding(symbol)
  103.             self.dictEncoder[symbol] = encoding
  104.  
  105.     def encode(self, plain): # agrupa los codigos binarios codificados de acuerdo al mensaje escrito en consola
  106.         encoded = ""
  107.         for symbol in plain:
  108.             encoded = "%s%s" % (encoded, self.dictEncoder[symbol])
  109.  
  110.         return encoded
  111.  
  112.     # INICIO DE LA DECODIFICACION ....................................................................................................................................................
  113.     def decode(self, encoded): # recibe la cadena del codigo binario enviado desde el emisor para decodificar
  114.         index = 0
  115.         decoded = ""
  116.  
  117.  
  118.         while index < len(encoded): # mientras buscamos en la longitud de la parte codificada
  119.  
  120.  
  121.             founf = False # establesemos una variable
  122.  
  123.             aux = encoded[index:] # va a buscar a cada parte codificada un simbolo
  124.                                   # no va ser fija va ir buscando cual es compatible con cada una
  125.  
  126.  
  127.             for symbol in self.probs:
  128.                 if aux.startswith(self.dictEncoder[symbol]): # se comprueba si la cadena es verdadera o falsa. si la parte axuliar inicia dentro del diccionario encodificado  nos va a dar
  129.                     decoded = "%s%s" % (decoded, symbol) # parte decodificada
  130.                     index = index + len(self.dictEncoder[symbol]) # busqueda para cada simbolo a cada probabilidad
  131.                     break
  132.  
  133.         return decoded
  134.  
  135.     #FIN DE LA DECODIFICACION ..........................................................................................................................................................
  136. if __name__=="__main__":
  137.  
  138.     print ("INGRESAR LOS SIMBOLOS O UN MENSAJE QUE DESEA COMPRIMIR:")
  139.     print (" " )
  140.     mensaje=input()
  141.     print (" ")
  142.  
  143.     print ("NUMERO TOTAL DE SIMBILOS O BITS INTRODUCIDOS PARA SER ENVIADOS:  %s" % (len(mensaje)))
  144.     print (" ")
  145.     print ("[ 1 PASO]: NUMERO DE SIMBOLOS O BITS, ERRADOS O REPETIDOS ")
  146.     print (" ")
  147.     simbolos=''
  148.     probabilidad=[]
  149.     msm=mensaje
  150.     d=0
  151.  
  152.     for i in mensaje:
  153.         if i in msm:
  154.             print (i,"=",int ( msm.count(i)))
  155.             simbolos+=i
  156.             probabilidad.append(float(float ( msm.count(i))/float(len(mensaje))))
  157.             msm=msm.replace(i,'')
  158.             d+= 1
  159.  
  160.     symbols=dict(zip(simbolos, probabilidad))
  161.     print (" ")
  162.     print ("NUMERO DE SIMBOLOS COMPRIMIDOS=",d)
  163.     print (" ")
  164.     print ("[ 2 PASO]:PROBABILIDAD DE CADA SIMBOLO P(S)= (numero de bit errados) / (numero total de bit enviados)")
  165.     print (" ")
  166.     print (symbols)
  167.     print (" ")
  168.     print ("[ 3-4 PASO]: LA FUNCION [buildTree] DEL CODIGO. ORDENA LAS PROBABILIDADES DE MENOR A MAYOR PROBABILIDAD")
  169.     print ("           Y REALIZA LAS OPERACIONES YA EXPLICADAS QUE SE REQUIEREN PARA IR ARMANDO EL ARBOL DE HUFFMAN")
  170.     print (" ")
  171.  
  172.  
  173.     tiempo_inicial= time()
  174.  
  175.  
  176.     # codificar instancia
  177.     huffman = Huffman(symbols)
  178.     print ("...........................................................................")
  179.     print ("...........................CODIFICACION....................................")
  180.     print ("...........................................................................")
  181.     print (" ")
  182.     print (" ")
  183.     print ("[ 5 PASO]:CODIFICACION BINARIA USANDO EL ARBOL DE HUFFMAN:")
  184.     print ( " ")
  185.     for symbol in symbols:
  186.         print ("Simbolo: %s; Codificacion: %s" % (symbol, huffman.showSymbolEncoding(symbol)))
  187.  
  188.     encoded = huffman.encode(mensaje)
  189.     print (" ")
  190.     print ("Mensaje que se esta codificando: %s;" % (mensaje))
  191.     print (" ")
  192.     print ("Codificacion en bits : %s" % (encoded))
  193.     print (" ")
  194.     print ("La longitud de codigo binario es:  %s" % (len(encoded)))
  195.     data = encoded
  196.     print (" ")
  197.     print ("Codigo codificado que esta siento enviado al receptor:  %s" % (data))
  198.  
  199.     # DECODIFICACION
  200.     print (" ")
  201.     print (" ")
  202.     print (" ")
  203.     print (" ")
  204.     print ("...........................................................................")
  205.     print ("...........................DECODIFICACION..................................")
  206.     print ("...........................................................................")
  207.     print (" ")
  208.     print (" ")
  209.     print ("Esperando el mensaje del emisor para su decodificacion......")
  210.  
  211.  
  212.     decoded = huffman.decode(data)
  213.     print (" ")
  214.     print ("CODIGO BINARIO RECIBIDO ES :", data )
  215.     print (" ")
  216.     print ("DECODIFICANDO EL CODIGO....................................")
  217.     print (" ")
  218.     print ("Mensaje decodificado : %s " % (decoded))
  219.  
  220.     # FIN
  221.  
  222.  
  223.     tiempo_final= time()
  224.     tiempo_ejecucion= tiempo_final - tiempo_inicial
  225.     print (" ")
  226.     print ('El tiempo de transmisiOn es:',tiempo_ejecucion) #En segundos)
  227.  
  228.  
  229.  
  230. os._exit(0)
  231.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement