def test_simple(): heap = HeapMax() items_priority = [15, 12, 9, 14, 8, 3, 7, 13, 11, 5] items_priority2 = [3, 3, 3, 5, 5, 5, 0, 9] random.shuffle(items_priority) for idx, priority in enumerate(items_priority): heap.insert(HeapItem(priority, f'item {idx + 1}')) print(heap)
def schargepmtn_nlogn(jobs_list): R = HeapMin() Q = HeapMax() i=0 for job in jobs_list: R.add(Cell(value=job.head[0], job=i)) i += 1 # S = np.zeros(len(jobs_list)) # momenty rozpoczęcia wykonywania zadań # C = np.zeros(len(jobs_list)) # momenty zakończenia wykonywania zadań Nn = list(range(len(jobs_list))) Ng = [] # order = [] # Algorymt t = 0 l = 0 Cmax = 0 while len(Nn) > 0 or len(Ng) > 0: while len(Nn) > 0 and R.min().value <= t: j = R.min(True).job Nn.remove(j) Ng.append(j) Q.add(Cell(value=jobs_list[j].tail[0], job=j)) if jobs_list[j].tail[0] > jobs_list[l].tail[0]: jobs_list[l].body[0] = t - jobs_list[j].head[0] t = jobs_list[j].head[0] if jobs_list[l].body[0] > 0: Ng.append(l) Q.add(Cell(value=jobs_list[l].tail[0], job=l)) if len(Ng) == 0: t = R.min().value else: j = Q.max(True).job Ng.remove(j) l = j t = t + jobs_list[j].body[0] Cmax = max(Cmax, t + jobs_list[j].tail[0]) return Cmax
# cola_combinada.mover_final() # 16. Utilice cola de prioridad, para atender la cola de impresión tomando en cuenta el siguiente criterio (1- empleados, 2- staff de tecnologías de la información “TI”, 3- gerente), y resuelva la siguiente situación: # a. cargue tres documentos de empleados (cada documento se representa solamente con un nombre). # b. imprima el primer documento de la cola (solamente mostrar el nombre de este por pantalla). # c. cargue dos documentos del staff de TI. # d. cargue un documento del gerente. # e. imprima los dos primeros documentos de la cola. # f. cargue dos documentos de empleados y uno de gerente. # g. imprima todos los documentos de la cola de impresión. empleado = 1 ti = 2 gerente = 3 cola_prioridad = HeapMax() documentos = [['Investigacion', empleado], ['Informe', empleado], ['Resumen', empleado]] # a. cargue tres documentos de empleados (cada documento se representa solamente con un nombre) cola_prioridad.arribo_muchos(documentos) # b. imprima el primer documento de la cola (solamente mostrar el nombre de este por pantalla). # print(cola_prioridad.atencion()[1]) # c. cargue dos documentos del staff de TI. documentos_2 = [['Revision', ti], ['Semi informe', ti]] cola_prioridad.arribo_muchos(documentos_2) # d. cargue un documento del gerente. documentos_3 = [['Revision - gerencial', gerente]]
# 16. Utilice cola de prioridad, para atender la cola de impresión tomando en cuenta el siguiente # criterio (1- empleados, 2- staff de tecnologías de la información “TI”, 3- gerente), y resuelva la # siguiente situación: # a. cargue tres documentos de empleados (cada documento se representa solamente con # un nombre). # b. imprima el primer documento de la cola (solamente mostrar el nombre de este por pantalla). # c. cargue dos documentos del staff de TI. # d. cargue un documento del gerente. # e. imprima los dos primeros documentos de la cola. # f. cargue dos documentos de empleados y uno de gerente. # g. imprima todos los documentos de la cola de impresión from cola import Cola from heap import HeapMax cola_prioridad = HeapMax() # Punto A cola_prioridad.arribo('DocumentoEmpleado1', 1) cola_prioridad.arribo('DocumentoEmpleado2', 1) cola_prioridad.arribo('DocumentoEmpleado3', 1) # Punto B print(cola_prioridad.atencion()[1]) print() # Punto C cola_prioridad.arribo('DocumentoTI1', 2) cola_prioridad.arribo('DocumentoTI2', 2) # Punto D cola_prioridad.arribo('DocumentoGerente1', 3)
def __init__(self): #unfortunatelly min and max have different interfaces self.max = HeapMax() self.min = []
class Median: def __init__(self): #unfortunatelly min and max have different interfaces self.max = HeapMax() self.min = [] def get(self): diff = len(self.max.v) - len(self.min) if diff > 0: #it should not be >1 key, obj = self.max.top() return key elif diff < 0: return self.min[0] else: key, obj = self.max.top() return (key + self.min[0]) / 2.0 def add(self, value): sz = self.size() if sz == 0: #push it anywhere self.max.push(value, None) elif sz == 1: if len(self.min) > 0: right = self.min[0] if value > right: heappush(self.min, value) else: self.max.push(value, None) else: left, obj = self.max.top() if value < left: self.max.push(value, None) else: heappush(self.min, value) else: #for sure three are items in both the heaps right = self.min[0] if value > right: heappush(self.min, value) else: self.max.push(value, None) self.__rebalance() def size(self): return self.max.size() + len(self.min) def __rebalance(self): diff = self.max.size() - len(self.min) if diff > 1: value, obj = self.max.pop() heappush(self.min, value) elif diff < -1: value = heappop(self.min) self.max.push(value, None) else: pass
def colaPrioridad(): cola = HeapMax() cola.arribo('Empleado 1', 1) cola.arribo('Empleado 2', 1) cola.arribo('Empleado 3', 1) print(cola.atencion()) cola.arribo('Staff TI 1', 2) cola.arribo('Staff TI 2', 2) cola.arribo('Gerente 1', 3) print(cola.atencion()) print(cola.atencion()) cola.arribo('Empleado 4', 1) cola.arribo('Empleado 5', 1) cola.arribo('Gerente 2', 3) while not cola.vacio(): print(cola.atencion())
def ejercicio_16(): prio_empleado = 1 prio_staff_TI = 2 prio_gerente = 3 heapmax_documentos = HeapMax() documentos_empleados = [ ['documento 1 empleado', prio_empleado], ['documento 2 empleado', prio_empleado], ['documento 3 empleado', prio_empleado], ] documentos_empleados_2 = [ ['documento 4 empleado', prio_empleado], ['documento 5 empleado', prio_empleado], ] documentos_staff_TI = [ ['documento 6 staff TI', prio_staff_TI], ['documento 7 staff TI', prio_staff_TI], ] documentos_gerente = [ ['documento 8 gerente', prio_gerente], ] documentos_gerente_2 = [ ['documento 9 gerente', prio_gerente], ] #PUNTO A heapmax_documentos.arribo_muchos(documentos_empleados) #PUNTO B print(heapmax_documentos.atencion()[1]) #PUNTO C heapmax_documentos.arribo_muchos(documentos_staff_TI) #PUNTO D heapmax_documentos.arribo_muchos(documentos_gerente) #PUNTO E print() for i in range(2): print(heapmax_documentos.atencion()[1]) #PUTNO F heapmax_documentos.arribo_muchos(documentos_empleados_2) heapmax_documentos.arribo(documentos_gerente_2[0][0], documentos_gerente_2[0][1]) #PUNTO G print() while(not heapmax_documentos.vacio()): print(heapmax_documentos.atencion()[1])
def schrange_nlogn(jobs_list): ''' Simulate RPQ problem :param jobs_list: :param order: :return: ''' R = HeapMin() Q = HeapMax() i=0 for job in jobs_list: R.add(Cell(value=job.head[0], job=i)) i += 1 S = np.zeros(len(jobs_list)) # momenty rozpoczęcia wykonywania zadań C = np.zeros(len(jobs_list)) # momenty zakończenia wykonywania zadań Nn = list(range(len(jobs_list))) Ng = [] order = [] # Algorymt t = R.min().value while len(Nn) > 0 or len(Ng) > 0: while len(Nn) > 0 and R.min().value <= t: j = R.min(True).job Nn.remove(j) Ng.append(j) Q.add(Cell(value=jobs_list[j].tail[0], job=j)) if len(Ng) == 0: t = R.min().value else: j = Q.max(True).job Ng.remove(j) order.append(j) t += jobs_list[j].body[0] # S czas rozpoczecia zadania first = True for i in order: if first: S[i] = jobs_list[i].head[0] i_last = i first = False else: S[i] = max(jobs_list[i].head[0], S[i_last]+jobs_list[i_last].body[0]) i_last = i # C czas zakonczenia zadania for i in order: C[i] = S[i] + jobs_list[i].body[0] # Obliczenie cmax cmax = [] for i in order: cmax.append(C[i]+jobs_list[i].tail[0]) # Najdłuższy czas jako ostatnie zakonczone zadania cmax = max(cmax) return order, cmax
def __init__(self): #unfortunatelly min and max have different interfaces self.max=HeapMax() self.min=[]
class Median: def __init__(self): #unfortunatelly min and max have different interfaces self.max=HeapMax() self.min=[] def get(self): diff=len(self.max.v)-len(self.min) if diff>0: #it should not be >1 key,obj=self.max.top() return key elif diff<0: return self.min[0] else: key,obj=self.max.top() return (key+self.min[0])/2.0 def add(self, value): sz=self.size() if sz == 0: #push it anywhere self.max.push(value,None) elif sz==1: if len(self.min)>0: right=self.min[0] if value>right: heappush(self.min,value) else: self.max.push(value,None) else: left, obj=self.max.top() if value<left: self.max.push(value,None) else: heappush(self.min,value) else: #for sure three are items in both the heaps right=self.min[0] if value>right: heappush(self.min,value) else: self.max.push(value,None) self.__rebalance() def size(self): return self.max.size()+len(self.min) def __rebalance(self): diff=self.max.size()-len(self.min) if diff>1: value,obj=self.max.pop() heappush(self.min,value) elif diff<-1: value=heappop(self.min) self.max.push(value,None) else: pass
def heap_sort(source: List[int]) -> List[int]: heap = HeapMax() for i in source: heap.insert(HeapItem(i, None)) return [heap.get_item_max().priority for _ in range(heap.size())]
def build_heap(source: List[int]): heap = HeapMax(source) for i in range(heap.size() // 2, -1, -1): heap.sift_down(i) return heap