Advertisement
elcocodrilotito

Prioridad, 1

May 26th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.21 KB | None | 0 0
  1. #Daniel Bedialauneta
  2. #EJERCICIO 1 DE COLAS DE PRIORIDAD
  3. class Cola_Prioridad:
  4.     """Implementación estática circular, pertenencia marcada
  5.    mediante una lista de posiciones excluidas, y las inserciones
  6.    se realizan en cola. Alternativa 1a"""
  7.  
  8.     def __init__(self,pri_f,MAX=100):
  9.         self.elems=[None]*MAX
  10.         self.fuera=set() #Conjunto que contiene las posiciones de los elementos que no estan en la self.elems
  11.                       #es decir, contienes las posiciones que se pueden sustituir por otro valor.
  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.     def compactacion(self): #Voy a crear una nueva lista
  21.         nueva_lista=[]
  22.         for i in range(len(self.elems)): #Añado a una nueva lista solo los elementos que no estén en self.fuera
  23.             if i not in self.fuera:
  24.                 nueva_lista.append(self.elems[i])
  25.         self.head=0
  26.         self.q=len(nueva_lista)-1
  27.         for i in range(len(self.fuera)): #La lista tiene que ser de tamaño MAX, hay elementos que estaban en self.fuera que no hemos añadido,
  28.                                          #añado ahora None para tener longitud MAX
  29.             nueva_lista.append(None)
  30.         self.fuera.clear()
  31.         self.elems=nueva_lista
  32.  
  33. #Coste t(MAX) = 1+MAX+1+k+1 = MAX+k+3, donde MAX es la longitud de self.elems, y k es la longitud de self.fuera (la cantidad de posiciones excluidas)
  34.  
  35.     def enqueue(self,x): #Coste fijo
  36.         if self.isFull():
  37.             return False
  38.        
  39.         if not self.isEmpty() and (self.q+1)%self.size==self.head: #Hay que recurrir a la compactación
  40.             self.compactacion()
  41.         self.q=(self.q+1)%self.size
  42.         self.elems[self.q]=x
  43.         self.nelems+=1
  44.         return True
  45. #Coste fijo a menos que (self.q+1)%self.size==self.head, en cuyo caso tendría prácticamente el coste de compactacion()
  46.  
  47.     def dequeue(self):
  48.         assert not self.isEmpty(), "Error en dequeue(): cola vacía"
  49.         pri=None
  50.         for i in range(self.size):
  51.             if i in self.fuera:
  52.                 continue
  53.             pri_parcial = self.priority(self.elems[i])
  54.             if pri==None or pri_parcial > pri:
  55.                 pri = pri_parcial
  56.                 pos=i
  57.         self.fuera.add(pos)
  58.         while self.q in self.fuera: #Por si acaso el elemento que se ha extraido era el de la cola
  59.             self.q=(self.q-1)%self.size
  60.            
  61.         self.nelems-=1
  62.         return self.elems[pos]
  63. #Coste t(MAX)=MAX+2, por lo general
  64. #Ahora bien, en caso de que el elemento de mayor prioridad que se extrae fuese la cola, se disminuye la cola cuanto sea necesario hasta indicar una posición fuera de los huecos
  65. #En este caso el coste sería t(MAX)=MAX+2+k, donde k es la cantidad de huecos seguidos que están justo delante de la cola
  66.  
  67.     def __len__(self):
  68.         return self.nelems
  69. #Coste fijo
  70.  
  71.     def isEmpty(self):
  72.         return self.nelems==0
  73. #Coste fijo
  74.  
  75.     def isFull(self):
  76.         return self.nelems==self.size
  77. #Coste fijo
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement