elcocodrilotito

Prioridad 3

May 26th, 2017
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.30 KB | None | 0 0
  1. #Daniel Bedialauneta
  2. #EJERCICIO 3 COLA PRIORIDAD
  3.  
  4. class Cola_Prioridad:
  5.    
  6.     def __init__(self, pri_f, MAX=8):
  7.         self.elems = [None]*MAX
  8.         self.priority = pri_f # pri_f(x) devuelve un entero, cp descendente
  9.         self.head = 0
  10.         self.q = -1
  11.         self.nelems = 0
  12.         self.size = MAX
  13.  
  14.     def enqueue(self,x):
  15.         if self.isFull():
  16.             return False
  17.         p=self.priority(x)
  18.         i=0
  19.         j=self.nelems-1
  20.         while i<=j:
  21.             m=(i+j)//2
  22.             y=self.elems[(self.head+m)%self.size]
  23.             if p>self.priority(y):
  24.                 j=m-1
  25.             elif p<self.priority(y):
  26.                 i=m+1
  27.             else:
  28.                 break
  29.         if i>j:
  30.             m=i
  31.         if m<self.nelems//2:
  32.             for i in range(m):
  33.                 read_pos=(self.head+i)%self.size
  34.                 write_pos=(read_pos-1)%self.size
  35.                 self.elems[write_pos]=self.elems[read_pos]
  36.             self.head=(self.head-1)%self.size
  37.         else:
  38.             for i in range(self.nelems-1,m-1,-1):
  39.                 read_pos=(self.head+i)%self.size
  40.                 write_pos=(read_pos+1)%self.size
  41.                 self.elems[write_pos]=self.elems[read_pos]
  42.             self.q=(self.q+1)%self.size
  43.         self.elems[(self.head+m)%self.size]=x
  44.         self.nelems+=1
  45. #Coste t(MAX)=log(MAX)+m, donde log es en base 2 y m es la cantidad de posiciones que hay de self.head
  46. #a la posición donde se debe insertar el elemento. Este m no va a ser mayor que MAX/2.
  47. #PEOR CASO: se completa el while hasta i>j, es decir, ya tenemos log(MAX) y luego m=(MAX//2)+1 o m=(MAX//2)-1,
  48. #en tal caso, el coste es t(MAX)=MAX//2+log(MAX)
  49. #MEJOR CASO: que m=0, es decir, el elemento que vamos a insertar tiene más prioridad que cualquier otro, y
  50. #se va a colocar a la cabeza. En tal caso, t(MAX)=log(MAX)
  51.  
  52.     def dequeue(self):
  53.         assert not self.isEmpty(), "Error en deq(): Cola de prioridad vacía"
  54.         x=self.elems[self.head]
  55.         self.head=(self.head+1)%self.size
  56.         self.nelems-=1
  57.         return x
  58. #Coste fijo
  59.  
  60.     def __len__(self):
  61.         return self.nelems
  62. #Coste fijo
  63.  
  64.     def isEmpty(self):
  65.         return self.nelems == 0
  66. #Coste fijo
  67.  
  68.     def isFull(self):
  69.         return self.nelems==self.size
  70. #Coste fijo
Add Comment
Please, Sign In to add comment