Учитывая следующую проблему:
"Храните самые большие 5000 номеров из потока чисел"
Решением, которое приходит в голову, является двоичное дерево поиска, поддерживающее подсчет количества узлов в дереве и ссылку на наименьший node, когда счет достигает 5000. Когда счетчик достигает 5000, каждый новый номер add можно сравнить с наименьшим элементом в дереве. Если больше, можно добавить новый номер, а затем самый маленький удаленный и новый наименьший расчет (который должен быть очень простым, если иметь предыдущий наименьший).
Моя забота об этом решении заключается в том, что бинарное дерево, естественно, будет искажаться (поскольку я только удаляю одну сторону).
Есть ли способ решить эту проблему, которая не создаст ужасно искаженного дерева?
В случае, если кто-то этого захочет, я включил псевдо-код для моего решения, находящегося ниже:
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++
}