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

C++ में इंटीजर्स की स्ट्रीम में मीडियन (रनिंग इंटीजर्स)


समस्या विवरण

दिया गया है कि इंटीजर्स को एक डेटा स्ट्रीम से पढ़ा जाता है। अब तक पढ़े गए एलिमेंट्स के मीडियन को कुशल तरीके से ढूंढें

स्ट्रीम के 1st एलिमेंट को पढ़ने के बाद - 10 -> मीडियन - 10

स्ट्रीम के 2nd एलिमेंट को पढ़ने के बाद - 10, 20 -> मीडियन - 15

स्ट्रीम के 3rd एलिमेंट को पढ़ने के बाद - 10, 20, 30 -> मीडियन - 20, इसी तरह...

एल्गोरिदम

1. प्रभावी मीडियन से कम एलिमेंट्स को दर्शाने के लिए लेफ्ट साइड पर मैक्स हीप और प्रभावी मीडियन से अधिक एलिमेंट्स को दर्शाने के लिए राइट साइड पर मिन हीप का उपयोग करें 2. एक आने वाले एलिमेंट को प्रोसेस करने के बाद, हीप्स में एलिमेंट्स की संख्या अधिकतम 1 एलिमेंट से भिन्न होती है 3. जब दोनों हीप्स में समान संख्या में एलिमेंट्स होते हैं, तो हम दोनों हीप्स के रूट डेटा के औसत को प्रभावी मीडियन के रूप में चुनते हैं 4. जब हीप्स बैलेंस्ड नहीं होते हैं, तो हम अधिक एलिमेंट्स वाले हीप के रूट से प्रभावी मीडियन चुनते हैं

उदाहरण

#include <iostream> using namespace std; #define MAX_HEAP_SIZE (128) #define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0]) inline void Exch(int &a, int &b){    int aux = a;    a = b;    b = aux; } bool Greater(int a, int b){    return a > b; } bool Smaller(int a, int b){    return a < b; } int Average(int a, int b){    return (a + b) / 2; } int Signum(int a, int b){    if( a == b ) {       return 0;    }    return a < b ? -1 : 1; } class Heap{    public:       Heap(int *b, bool (*c)(int, int)) : A(b), comp(c){          heapSize = -1;       }       virtual ~Heap(){          if( A ) {             delete[] A;          }       }       virtual bool Insert(int e) = 0;       virtual int GetTop() = 0;       virtual int ExtractTop() = 0;       virtual int GetCount() = 0;       protected:       int left(int i){          return 2 * i + 1;       }       int right(int i){          return 2 * (i + 1);       }       int parent(int i){          if( i <= 0 ) {             return -1;          }          return (i - 1)/2;       }       int *A;       bool (*comp)(int, int);       int heapSize;       int top(void){          int max = -1;          if( heapSize >= 0 ) {             max = A[0];          }          return max;       }       int count(){          return heapSize + 1;       }       void heapify(int i){          int p = parent(i);          if( p >= 0 && comp(A[i], A[p]) ) {             Exch(A[i], A[p]);             heapify(p);          }       }       int deleteTop(){          int del = -1;          if( heapSize > -1) {             del = A[0];             Exch(A[0], A[heapSize]);             heapSize--;             heapify(parent(heapSize+1));          }          return del;       }       bool insertHelper(int key){          bool ret = false;          if( heapSize < MAX_HEAP_SIZE ) {             ret = true;             heapSize++;             A[heapSize] = key;             heapify(heapSize);          }          return ret;       } }; class MaxHeap : public Heap{ private: public:    MaxHeap() : Heap(new int[MAX_HEAP_SIZE], &Greater) { }    ~MaxHeap() { }    int GetTop(){       return top();    }    int ExtractTop(){       return deleteTop();    }    int GetCount(){       return count();    }    bool Insert(int key){       return insertHelper(key);    } }; class MinHeap : public Heap{ private: public:    MinHeap() : Heap(new int[MAX_HEAP_SIZE], &Smaller) { }    ~MinHeap() { }    int GetTop(){       return top();    }    int ExtractTop(){       return deleteTop();    }    int GetCount(){       return count();    }    bool Insert(int key){       return insertHelper(key);    } }; int getMedian(int e, int &m, Heap &l, Heap &r){    int sig = Signum(l.GetCount(), r.GetCount());    switch(sig){       case 1:          if( e < m ) {             r.Insert(l.ExtractTop());             l.Insert(e);          } else {             r.Insert(e);          }          m = Average(l.GetTop(), r.GetTop());          break;          case 0:          if( e < m ) {             l.Insert(e);             m = l.GetTop();          } else {             r.Insert(e);             m = r.GetTop();          }          break;          case -1:          if( e < m ) {             l.Insert(e);          } else {             l.Insert(r.ExtractTop());             r.Insert(e);          }          m = Average(l.GetTop(), r.GetTop());          break;       }    return m; } void printMedian(int A[], int size){    int m = 0;    Heap *left = new MaxHeap();    Heap *right = new MinHeap();    for(int i = 0; i < size; ++i) {       m = getMedian(A[i], m, *left, *right);       cout << m << endl;    }    delete left;    delete right; } // Driver code int main(){    int A[] = {10, 20, 30};    int size = ARRAY_SIZE(A);    cout "Result:\n";    printMedian(A, size);    return 0; }

आउटपुट

जब आप उपरोक्त प्रोग्राम को कंपाइल और एक्जीक्यूट करते हैं। यह निम्नलिखित आउटपुट उत्पन्न करता है −

Result: 10 15 20

  1. - C++ में 4Sum समस्या

    मान लीजिए हमारे पास संख्याओं की एक सरणी है। यह n पूर्णांकों को संग्रहीत करती है, सरणी में चार तत्व a, b, c और d हैं। हमारे पास एक और लक्ष्य मान है, जैसे कि a + b + c + d = लक्ष्य। सरणी में सभी अद्वितीय चौगुनी (quadruplets) ढूंढें जो स्थिति को संतुष्ट करते हैं। तो यदि सरणी [-1,0,1,2,0,-2] जैसी है और

  1. - C++ में काउंटिंग सॉर्ट का उपयोग करके माध्यिका और बहुलक

    मान लीजिए हमारे पास आकार n की एक सरणी है, हमें काउंटिंग सॉर्ट तकनीक का उपयोग करके माध्यिका (Median) और बहुलक (Mode) ढूंढना है। यह तकनीक उपयोगी है, जब सरणी तत्व सीमित रेंज में हैं। मान लीजिए तत्व {1, 1, 1, 2, 7, 1} हैं, तो बहुलक 1 है, और माध्यिका 1.5 है। आइए देखें कि माध्यिका क्या है और बहुलक क्या है

  1. - C++ में static_cast

    static_cast का उपयोग सामान्य/साधारण प्रकार रूपांतरण के लिए किया जाता है। यह निहित प्रकार जबरदस्ती (implicit type coercion) के लिए भी जिम्मेदार कास्ट है और इसे स्पष्ट रूप से भी बुलाया जा सकता है। आपको इसका उपयोग फ्लोट को इंट में, चार को इंट में आदि जैसे मामलों में करना चाहिए। यह संबंधित प्रकार के क्