elcocodrilotito

Prioridad 2

May 26th, 2017
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.32 KB | None | 0 0
  1. #Daniel Bedialauneta
  2. #EJERCICIO 2
  3.  
  4. class Cola_Prioridad:
  5.     """Implementación estática circular, pertenencia marcada
  6.    mediante una lista de posiciones excluidas, y las inserciones
  7.    se realizan en el primer hueco disponible. Alternativa 1b"""
  8.  
  9.     def __init__(self,pri_f,MAX=8):
  10.         self.elems=[None]*MAX
  11.         self.fuera=set()    #Posiciones relativas de los huecos respecto de self.head
  12.         self.priority=pri_f #pri_f(x) devuelve un entero, prioridad descendente
  13.                             #es decir, la cabeza (head) tiene el valor más grande
  14.         self.head=0
  15.         self.q=-1
  16.         self.nelems=0
  17.         self.size=MAX
  18. #Coste fijo el de __init__()
  19.  
  20.    
  21.     def enqueue(self,x): #Coste fijo
  22.         if self.isFull():
  23.             return False
  24.         elif len(self.fuera)==0:
  25.             self.q=(self.q+1)%self.size
  26.             self.elems[self.q]=x
  27.             self.nelems+=1
  28.         else:
  29.             pos=min(self.fuera) #Porque supongp que self.q=0, porque en ningun momento lo modifico
  30.             self.fuera.remove(pos)
  31.             self.elems[(self.head+pos)%self.size]=x
  32.             self.nelems+=1
  33. #Coste fijo si no hay posiciones excluidas.
  34. #Si las hay, el coste es O(k) donde k es la cantidad de posiciones exluidas que hay en self.fuera
  35.            
  36.  
  37.     def dequeue(self):
  38.         assert not self.isEmpty(), "Error en dequeue(): cola vacía"
  39.         pri=None
  40.         for i in range(self.size):
  41.             if i in self.fuera:
  42.                 continue
  43.             pri_parcial = self.priority(self.elems[i])
  44.             if pri==None or pri_parcial > pri:
  45.                 pri = pri_parcial
  46.                 pos=i
  47.         while (self.q-self.head)%self.size in self.fuera: #En caso de que el elemento extraido sea el que está en la cola
  48.             self.q=(self.q-1)%self.size
  49.         self.fuera.add((pos-self.head)%self.size)
  50.         self.nelems-=1
  51.         return self.elems[pos]
  52. #Coste t(MAX)=MAX+2
  53. #Si el elemento extraido está en la cola el coste es t(MAX)=MAX+2+k, donde k es la cantidad de huecos seguidos que hay justo por delante de la cola antes de ser extraida.
  54.  
  55.     def __len__(self):
  56.         return self.nelems
  57. #Coste fijo
  58.  
  59.     def isEmpty(self):
  60.         return self.nelems==0
  61. #Coste fijo
  62.  
  63.     def isFull(self):
  64.         return self.nelems==self.size
  65. #Coste fijo
Add Comment
Please, Sign In to add comment