次の問題があるとします。
「一連の数字から最大の 5000 個の数字を保存する」
頭に浮かぶ解決策は、ツリー内のノード数のカウントと、カウントが 5000 に達すると最小のノードへの参照を維持するバイナリ サーチ ツリーです。カウントが 5000 に達すると、追加するそれぞれの新しい数をツリーの最小のアイテム。大きい場合は、新しい数を追加してから、最小のものを削除し、新しい最小値を計算できます (これは、以前の最小値を既に持っている非常に単純なはずです)。
このソリューションに関する私の懸念は、バイナリ ツリーが自然に歪んでしまうことです (片側だけを削除しているため)。
ひどく歪んだツリーを作成しないこの問題を解決する方法はありますか?
誰かがそれを望む場合に備えて、これまでのソリューションの疑似コードを以下に含めました。
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++
}