Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में पूर्णांक सरणी का माध्यिका (Median) ढूंढने का प्रोग्राम


परिचय

मान लीजिए हमें MedianClass नामक एक क्लास लागू करनी है जिसमें निम्नलिखित मेथड्स हों:

  • add(value) जो डेटा संरचना में एक मान जोड़ता है।
  • median() वर्तमान में डेटा संरचना में मौजूद सभी संख्याओं का माध्यिका ढूंढता है।

तो, यदि हम 5, 3, 8 जोड़ते हैं और माध्यिका ढूंढते हैं, तो आउटपुट 5.0 होगा, फिर यदि हम 9 जोड़ते हैं और माध्यिका ढूंढते हैं, तो आउटपुट 6.5 होगा।

समाधान दृष्टिकोण

इस समस्या को हल करने के लिए हम दो प्रायोरिटी क्यू (हीप) का उपयोग करते हैं:

  • एक मैक्स-हीप (left) छोटे आधे तत्वों के लिए
  • एक मिन-हीप (right) बड़े आधे तत्वों के लिए

हम दोनों हीप्स को संतुलित रखते हैं ताकि उनके आकार में अंतर अधिकतम 1 हो।

उदाहरण कोड

#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;
    }
};

int main(){
    MedianClass ob;
    ob.addNum(5);
    ob.addNum(3);
    ob.addNum(8);
    cout << ob.findMedian() << " ";
    ob.addNum(9);
    cout << ob.findMedian() << endl;
    return 0;
}

इनपुट

ob.addNum(5); ob.addNum(3); ob.addNum(8); cout << ob.findMedian() << endl; ob.addNum(9); cout << ob.findMedian() << endl;

आउटपुट

5.0 6.5

व्याख्या

[5,3,8] के लिए सॉर्टेड: [3,5,8], माध्यिका = 5

[5,3,8,9] के लिए सॉर्टेड: [3,5,8,9], माध्यिका = (5+8)/2 = 6.5

निष्कर्ष

दो हीप्स का उपयोग करके स्ट्रीमिंग डेटा के लिए माध्यिका O(log n) प्रति इंसर्शन में निकाली जा सकती है। यह दृष्टिकोण बड़े डेटा स्ट्रीम के लिए कुशल है। यदि आपके कोई प्रश्न हैं, तो कमेंट सेक्शन में पूछें।


  1. - C++ में सरणी का सबसे बड़ा एलिमेंट खोजने का प्रोग्राम

    एक सरणी में कई एलिमेंट्स होते हैं और सरणी में सबसे बड़ा एलिमेंट वह होता है जो अन्य एलिमेंट्स से बड़ा होता है। उदाहरण के लिए। 5 1 7 2 4 उपरोक्त सरणी में, 7 सबसे बड़ा एलिमेंट है और यह इंडेक्स 2 पर है। सरणी का सबसे बड़ा एलिमेंट खोजने का एक प्रोग्राम निम्नलिखित है। उदाहरण #include <iostream>

  1. - C++ प्रोग्राम: LCM (लघुत्तम समापवर्त्य) खोजें

    परिचयदो संख्याओं का लघुत्तम समापवर्त्य (LCM) वह सबसे छोटी संख्या है जो दोनों का गुणक है। उदाहरण के लिए: मान लें हमारे पास दो संख्याएं हैं: 15 और 9। 15 = 5 * 3 9 = 3 * 3 इसलिए, 15 और 9 का LCM 45 है। उदाहरण (लूप का उपयोग करके)#include <iostream> using namespace std; int main() { int a = 7,

  1. - C++ प्रोग्राम: GCD (महत्तम समापवर्तक) खोजें

    परिचयदो संख्याओं का महत्तम समापवर्तक (GCD) वह सबसे बड़ी संख्या है जो दोनों को विभाजित करती है। उदाहरण के लिए: मान लें हमारे पास दो संख्याएं हैं 45 और 27। 45 = 5 * 3 * 3 27 = 3 * 3 * 3 इसलिए, 45 और 27 का GCD 9 है। उदाहरण 1 (यूक्लिडियन एल्गोरिदम)#include <iostream> using namespace std; int gcd(