예제 #1
0
 def test_update_from_list(self):
     """ -- Accede a un elemento de la lista y modifica su valor y luego verifica que sea se haya actualizado con dicho valor
     """
     l = LinkedList()
     add(l, "hola")
     add(l, "jorge")
     update(l, "pepe", 1)
     self.assertEqual(l.head.nextNode.value, "pepe")
예제 #2
0
def shiftUp(BH, i):
    """ Recorre el arbol desde los nodos hacia la raiz y va reemplazando el nodo i por su padre
        siempre y cuando i sea mayor. La operacion matematica i // 2 nos permite rapidamente encontrar al padre.
    """

    while i // 2 > 0:
        padre = linkedlist.access(BH.bheaplist, i // 2)
        hijo = linkedlist.access(BH.bheaplist, i)

        if padre < hijo:
            linkedlist.update(BH.bheaplist, padre, i)
            linkedlist.update(BH.bheaplist, hijo, i // 2)

        i = i // 2
예제 #3
0
 def test_update_from_list_out_of_range(self):
     """ -- Accede a un elemento fuera dede la lista, modifica su valor y verifica que devuelva False
     """
     L = LinkedList()
     add(L, "hola")
     add(L, "jorge")
     res = update(L, "pepe", 4)
     self.assertEqual(res, None)
예제 #4
0
 def test_update_from_list(self):
     """ -- Accede a un elemento de la lista, modifica su valor y verifica que devuelva True
     """
     l = LinkedList()
     add(l, "hola")
     add(l, "jorge")
     res = update(l, "pepe", 1)
     self.assertEqual(res, 1)
예제 #5
0
def shiftDown(BH, i, currentsize=None):
    """ Recorre el arbol desde la raiz y  hacia los nodos (arriba hacia abajo) va reemplazando el nodo i por sus hijos
        siempre y cuando alguno de sus hijos sea mayor. 
    """
    if currentsize == None:
        currentsize = linkedlist.length(BH.bheaplist) - 1

    while (i * 2) <= currentsize:
        #indice del hijo mayor
        mc = maxChild(BH, i, currentsize)

        padre = linkedlist.access(BH.bheaplist, i)
        hijoMayor = linkedlist.access(BH.bheaplist, mc)
        if hijoMayor > padre:
            linkedlist.update(BH.bheaplist, hijoMayor, i)
            linkedlist.update(BH.bheaplist, padre, mc)

        i = mc
예제 #6
0
def delMax(BH):
    """ 
    Recupera el mayor elemento del heap. Este siempre se encontrara al comienzo (posicion 1).
    Para manter la esctrucura del arbol binario se reemplaza el nodo raiz por el ultimo nodo.
    
    Luego mediante la funcion shiftDown se va recorriendo el arbol hasta encontrar la posicion 
    correcta de dicho nodo. De esta manara se garantiza la propiedad heap.
    """

    retval = linkedlist.access(BH.bheaplist, 1)
    ultimo = linkedlist.access(BH.bheaplist, length(BH))

    linkedlist.delete(BH.bheaplist, ultimo)
    linkedlist.update(BH.bheaplist, ultimo, 1)

    shiftDown(BH, 1)

    return retval
예제 #7
0
파일: heap_sort.py 프로젝트: Brunidas/Algo1
def heapsort(L):
    BH = Bheap()
    listaInterna = linkedlist.LinkedList()

    #copiar valores
    for i in range(linkedlist.length(L) - 1, -1, -1):
        linkedlist.add(listaInterna, linkedlist.access(L, i))

    heapify(BH, listaInterna)

    for i in range(length(BH)):
        if length(BH) == 1:
            primero = linkedlist.access(BH.bheaplist, 1)
            linkedlist.add(listaInterna, primero)
        else:
            shiftDown(BH, 1)

            # intercambia el primero con el ultimo
            primero = linkedlist.access(BH.bheaplist, 1)
            ultimo = linkedlist.access(BH.bheaplist, length(BH))

            linkedlist.update(BH.bheaplist, primero, length(BH))
            linkedlist.update(BH.bheaplist, ultimo, 1)

            # se coloco esta liena para que sea mas facil leer el codigo
            ultimo = primero

            # se agrega el primero a listaInterna y se elimina el ultimo elemento
            # del Bheap
            linkedlist.add(listaInterna, ultimo)
            linkedlist.delete(BH.bheaplist, ultimo)

    # actualizar valores
    for i in range(linkedlist.length(L)):
        linkedlist.update(L, linkedlist.access(listaInterna, i), i)


# URL : https://repl.it/@BrunoFuentes/Binary-Heaps-y-HeapSort