मान लीजिए कि हमें मेडियनक्लास नामक एक वर्ग को लागू करना है जिसमें निम्नलिखित तरीके शामिल हैं -
-
add(value) जो डेटा संरचना में एक मान जोड़ता है।
-
माध्य () डेटा संरचना में वर्तमान में मौजूद सभी संख्याओं का माध्यिका ढूँढता है।
इसलिए, यदि हम 5, 3, 8 जोड़ते हैं और माध्यिका पाते हैं, तो आउटपुट 5.0 होगा, फिर यदि हम 9 जोड़ते हैं और माध्यिका पाते हैं, तो आउटपुट 6.5 होगा।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
प्राथमिकता कतार को बाएँ और दाएँ परिभाषित करें
-
AddNum विधि को परिभाषित करें, यह संख्या को इनपुट के रूप में लेगा -
-
यदि बायां खाली है या संख्या <बाएं का शीर्ष तत्व है, तो,
-
बाईं ओर संख्या डालें
-
-
अन्यथा
-
संख्या को दाईं ओर डालें
-
-
यदि बाएँ का आकार <दाएँ का आकार है, तो,
-
अस्थायी:=दाईं ओर का शीर्ष तत्व
-
आइटम को दाईं ओर से हटाएं
-
बाईं ओर अस्थायी डालें
-
-
यदि बाएँ का आकार - दाएँ का आकार> 1, तो,
-
अस्थायी:=बाईं ओर का शीर्ष तत्व
-
बाईं ओर से आइटम हटाएं
-
दाईं ओर अस्थायी डालें
-
-
FindMedian() विधि को परिभाषित करें, यह इस प्रकार कार्य करेगा -
बाएं के शीर्ष पर लौटें यदि बाएं का आकार> दाएं का आकार, अन्यथा (बाएं का शीर्ष + दाएं का शीर्ष) / 2 बेहतर समझ प्राप्त करने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h> using namespace std; typedef double lli; class MedianClass { priority_queue <int> left; priority_queue <int, vector <int>, greater<int>> right; public: void addNum(int num) { if(left.empty() || num<left.top()){ left.push(num); }else right.push(num); if(left.size()<right.size()){ lli temp = right.top(); right.pop(); left.push(temp); } if(left.size()−right.size()>1){ lli temp = left.top(); left.pop(); right.push(temp); } } double findMedian() { return left.size()>right.size()?left.top():(left.top()+right.top())*0.5; } }; main(){ MedianClass ob; ob.addNum(5); ob.addNum(3); ob.addNum(8); cout << ob.findMedian() << " "; ob.addNum(9); cout << ob.findMedian() << endl; }
इनपुट
ob.addNum(5); ob.addNum(3); ob.addNum(8); cout << ob.findMedian() << endl; ob.addNum(9); cout << ob.findMedian() << endl;
आउटपुट
5.0 6.5