Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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)
Ejemplo n.º 5
0
 def __init__(self):
     #unfortunatelly min and max have different interfaces
     self.max = HeapMax()
     self.min = []
Ejemplo n.º 6
0
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
Ejemplo n.º 7
0
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])
Ejemplo n.º 9
0
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
Ejemplo n.º 10
0
	def __init__(self):
		#unfortunatelly min and max have different interfaces
		self.max=HeapMax()
		self.min=[]
Ejemplo n.º 11
0
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
Ejemplo n.º 12
0
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())]
Ejemplo n.º 13
0
def build_heap(source: List[int]):
    heap = HeapMax(source)
    for i in range(heap.size() // 2, -1, -1):
        heap.sift_down(i)
    return heap