Advertisement
elcocodrilotito

Heaps 3

May 26th, 2017
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.50 KB | None | 0 0
  1. Daniel Bedialauneta
  2. class Cola_Prioridad:
  3.    
  4.  
  5.  
  6.     def __init__(self,pri_f,MAX=-1):
  7.         self.elems=[0] #Primera posición reservada al numero de elementos
  8.         self.max=MAX
  9.         self.pri=[None] ##Primera posición reservada al numero de elementos
  10.         self.priority=pri_f
  11.        
  12. ########################################################################
  13.        
  14. #Dejo aquí mi función flotar que uso como referencia en enqueue, pero no la llamo
  15.        
  16.     def flotar(h,x): #Supongo la primera posición reservada al numero de elementos
  17.         h[0]+=1
  18.         h.append(x)
  19.         i=h[0]//2
  20.         j=h[0]
  21.         while i>0 and x>h[i]:
  22.             h[j]=h[i]
  23.             i=i//2
  24.             j=j//2
  25.         h[j]=x
  26.        
  27. #Y aquí mi función del_maxheap que utilizo en dequeue como referencia, no la llamo
  28.        
  29.     def del_maxheap(h):
  30.         maxheap=h[1] #Guardo el primer elemento para luego retornarlo
  31.         x=h.pop() #Elimino el último elemento y lo guardo en x
  32.         h[0]-=1 #Disminuyo en 1 el tamaño del heap
  33.         i=1
  34.         while 2*i<=h[0]: #Mientras el hijo de i esté en una posición menor o igual que el tamaño del heap
  35.             if x>=h[2*i] and x>=h[2*i+1]: #Si x ya es mayor o igual que su hijos, salgo del ciclo
  36.                 break
  37.             if 2*i+1>h[0]: #Para el caso en el que solo tenga un hijo al final y no se produzca index out of range
  38.                 h[i]=h[2*i]
  39.                 i=2*i
  40.                 break  #En realidad, este break no es necesario, ya que a este if solo entra en el último caso, pero bueno
  41.             elif h[2*i]>h[2*i+1]:
  42.                 h[i]=h[2*i]
  43.                 i=2*i
  44.             else:
  45.                 h[i]=h[2*i+1]
  46.                 i=2*i+1
  47.         h[i]=x
  48.        
  49. ########################################################################
  50.        
  51.     def enqueue(self,x): #Básicamente lo que he hecho es copiar mi función flotar de heap, adaptándola claro
  52.         if self.isFull():
  53.             return False
  54.         p=self.priority(x)
  55.         self.elems[0]+=1
  56.         self.elems.append(x)
  57.         self.pri.append(p)
  58.         i=self.elems[0]//2
  59.         j=self.elems[0]
  60.         while i>0 and p>self.pri[i]:
  61.             self.elems[j]=self.elems[i]
  62.             self.pri[j]=self.pri[i]
  63.             i=i//2
  64.             j=j//2
  65.         self.elems[j]=x
  66.         self.pri[j]=p
  67.         return True
  68.  
  69.     def dequeue(self):
  70.         assert not self.isEmpty(), "Error en dequeue(): Cola de prioridad vacía"
  71.         maxheap=self.elems[1]
  72.         x=self.elems.pop()
  73.         p=self.pri.pop()
  74.         self.elems[0]-=1
  75.         i=1
  76.         while 2*i<=self.elems[0]:
  77.             if p>=self.pri[2*i] and p>=self.pri[2*i+1]:
  78.                 break
  79.             if 2*i+1>self.elems[0]:
  80.                 self.pri[i]=self.pri[2*i]
  81.                 self.elems[i]=self.elems[2*i]
  82.                 i=2*i
  83.                 break
  84.             elif self.pri[2*i]>self.pri[2*i+1]:
  85.                 self.pri[i]=self.pri[2*i]
  86.                 self.elems[i]=self.elems[2*i]
  87.                 i=2*i
  88.             else:
  89.                 self.pri[i]=self.pri[2*i+1]
  90.                 self.elems[i]=self.elems[2*i+1]
  91.                 i=2*i+1
  92.         self.elems[i]=x
  93.         self.pri[i]=p
  94.         return maxheap
  95.  
  96.     def __len__(self):
  97.         return self.elems[0]
  98.  
  99.     def isEmpty(self):
  100.         return self.elems[0]==0
  101.  
  102.     def isFull(self):
  103.         if self.max==-1:
  104.             return False
  105.         else:
  106.             return self.elems[0]==self.max
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement