コード例 #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)
コード例 #2
0
ファイル: schrage.py プロジェクト: jkpawlowski96/SPD
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
コード例 #3
0
#     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]]
コード例 #4
0
# 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)
コード例 #5
0
 def __init__(self):
     #unfortunatelly min and max have different interfaces
     self.max = HeapMax()
     self.min = []
コード例 #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
コード例 #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())
コード例 #8
0
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])
コード例 #9
0
ファイル: schrage.py プロジェクト: jkpawlowski96/SPD
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
コード例 #10
0
ファイル: median.py プロジェクト: jpecci/algorithms
	def __init__(self):
		#unfortunatelly min and max have different interfaces
		self.max=HeapMax()
		self.min=[]
コード例 #11
0
ファイル: median.py プロジェクト: jpecci/algorithms
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
コード例 #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())]
コード例 #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