निम्न समस्या को देखते हुए की एक धारा से सबसे बड़ी 5000 संख्या:स्टोर संख्या
"संख्या की एक धारा से सबसे बड़ी 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++
}
आप एवीएल या इसी तरह के एक संतुलित खोज पेड़ का उपयोग कर सकते हैं (https://en.wikipedia.org/wiki/AVL_tree)। लेकिन एक ढेर आधारित समाधान अधिक प्राकृतिक है। चयन एल्गोरिदम के लिए –