Dado el siguiente problema:tienda los mayores 5000 números de una serie de números
"tienda de los mayores 5000 números de una serie de números"
La solución que viene a la mente es una árbol binario de búsqueda manteniendo un recuento del número de nodos en el árbol y una referencia al nodo más pequeño una vez que el recuento alcanza 5000. Cuando el recuento alcanza 5000, cada nuevo número para agregar se puede comparar con el elemento más pequeño del árbol. Si es mayor, se puede agregar el nuevo número, luego el más pequeño eliminado y el nuevo más pequeño calculado (que debería ser muy simple, ya teniendo el anterior más pequeño).
Mi preocupación con esta solución es que el árbol binario se sesgará de forma natural (ya que solo estoy borrando por un lado).
¿Hay alguna manera de resolver este problema que no creará un árbol terriblemente sesgado?
En caso de que alguien lo quiere, he incluido pseudo-código para mi solución en lo que va a continuación:
process(number)
{
if (count == 5000 && number > smallest.Value)
{
addNode(root, number)
smallest = deleteNodeAndGetNewSmallest (root, smallest)
}
}
deleteNodeAndGetNewSmallest(lastSmallest)
{
if (lastSmallest has parent)
{
if (lastSmallest has right child)
{
smallest = getMin(lastSmallest.right)
lastSmallest.parent.right = lastSmallest.right
}
else
{
smallest = lastSmallest.parent
}
}
else
{
smallest = getMin(lastSmallest.right)
root = lastSmallest.right
}
count--
return smallest
}
getMin(node)
{
if (node has left)
return getMin(node.left)
else
return node
}
add(number)
{
//standard implementation of add for BST
count++
}
Puede usar un árbol de búsqueda equilibrado como AVL o similar (https://en.wikipedia.org/wiki/AVL_tree). Pero una solución basada en montones es más natural. –