def dequeue(Q):

  currentNode = Q.head

  if length(Q) == 0:
    return None
  
  elif (length(Q) == 1):
    
    deleteElement = access(Q, length(Q)-1)
    
    Q.head = currentNode.nextNode

    return  deleteElement
  
  else:
    deleteElement = access(Q, length(Q)-1)
    currentPosition = 0

    while (currentNode != None) and (currentPosition < length(Q)-2):
      currentNode = currentNode.nextNode
      currentPosition += 1

     # una vez ubicado en el nodo anterior al nodo a eliminar, apunto el puntero del currentNode al nodo que se encuentra siguiente al nodo a eliminar. Ésta operación desvincula o elimina el nodo.
    currentNode.nextNode = currentNode.nextNode.nextNode

    return deleteElement
Пример #2
0
def maxChild(BH,i,currentsize):
    """ Determina dado un nodo i, cual de sus hijos es el mayor y devuelve la posicion 
    """
    if i * 2 + 1 > currentsize:
        return i * 2
    else:
        if linkedlist.access(BH.bheaplist,i*2) > linkedlist.access(BH.bheaplist,i*2+1):
            return i * 2 
        else:
            return i * 2 + 1
Пример #3
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
Пример #4
0
 def test_access_from_list(self):
     """ -- Accede a un elemento en una lista y verifica que acces() devuelva el valor correcto
     """
     L = LinkedList()
     add(L, "hola")
     add(L, "jorge")
     res = access(L, 1)
     self.assertEqual(res, "hola")
Пример #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
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
Пример #8
0
def pop(S):

    currentNode = S.head

    if (length(S) == 0):
        return None

    else:
        #accedo al elemento de la posicion 0
        deleteElement = access(S, 0)

        S.head = currentNode.nextNode

        return deleteElement
Пример #9
0
 def test_access_from_empty_list(self):
     """ -- Accede a un elemento que no se encuentra en la lista y verifica que access() devuelve None
     """
     L = LinkedList()
     res = access(L, 1)
     self.assertEqual(res, None)