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

C++ में नंबरों की रनिंग स्ट्रीम का माध्यिका

इस समस्या में, हमें एक डेटा स्ट्रीम दिया जाता है जो लगातार पूर्णांक पढ़ रहा है। हमारा काम एक प्रोग्राम बनाना है जो तत्वों को पढ़ेगा और इन तत्वों के लिए माध्यिका की गणना करेगा।

द मेडियन एक सरणी का एक क्रमबद्ध अनुक्रम से मध्य तत्व है (यह आरोही या अवरोही हो सकता है)।

माध्यिका की गणना करना

विषम गणना के लिए, माध्यिका मध्य तत्व है

सम संख्या के लिए, माध्यिका दो मध्य तत्वों का औसत है

समस्या को समझने के लिए एक उदाहरण लेते हैं,

इनपुट -3, 65, 12, 20, 1

प्रत्येक इनपुट पर,

Input - 3 : sequence -(3) : median - 3
Input - 65 : sequence -(3, 65) : median - 34
Input - 12 : sequence -(3, 12, 65) : median - 12
Input - 20 : sequence -(3, 12, 20, 65) : median - 16
Input - 1 : sequence -(1, 3, 12, 20, 65) : median - 12

हमने माध्यिका गणना को आसान बनाने के लिए यहां क्रमबद्ध अनुक्रम का उपयोग किया है।

इस समस्या को हल करने के लिए, हमारे पास कई समाधान हैं जो प्रत्येक चरण में छँटाई का उपयोग कर रहे हैं और फिर माध्यिका का पता लगा रहे हैं, एक स्व-संतुलन BST बना रहे हैं, या ढेर का उपयोग कर रहे हैं। मंझला खोजने के लिए ढेर सबसे आशाजनक समाधान प्रतीत होता है। मैक्स-हीप या मिन-हीप दोनों ही हमें हर इंसर्शन पर माध्यिका प्रदान कर सकते हैं और यह एक प्रभावी समाधान भी है।

उदाहरण

हमारे समाधान के कार्यान्वयन को दिखाने के लिए कार्यक्रम,

#include <iostream>
using namespace std;
#define MAX_HEAP_SIZE (128)
#define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0])
void swap(int &a, int &b){
   int temp = a;
   a = b;
   b = temp;
}
bool Greater(int a, int b){
   return a > b;
}
bool Smaller(int a, int b){
   return a < b;
}
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 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]) ) {
            swap(A[i], A[p]);
            heapify(p);
         }
      }
      int deleteTop(){
         int del = -1;
         if( heapSize > -1){
            del = A[0];
            swap(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) { }
      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) { }
      int GetTop() {
         return top();
      }
      int ExtractTop() {
         return deleteTop();
      }
      int GetCount() {
         return count();
      }
      bool Insert(int key) {
         return insertHelper(key);
      }
};
int findMedian(int e, int &median, Heap &left, Heap &right){
   switch(Signum(left.GetCount(), right.GetCount())){
      case 0: if( e < median ) {
         left.Insert(e);
         median = left.GetTop();
      }
      else{
         right.Insert(e);
         median = right.GetTop();
      }
      break;
      case 1: if( e < median ){
         right.Insert(left.ExtractTop());
         left.Insert(e);
      }
      else
         right.Insert(e);
         median = ((left.GetTop()+right.GetTop())/2);
      break;
      case -1: if( e < median )
         left.Insert(e);
      else {
         left.Insert(right.ExtractTop());
         right.Insert(e);
      }
      median = ((left.GetTop()+right.GetTop())/2);
      break;
   }
   return median;
}
void printMedianStream(int A[], int size){
   int median = 0;
   Heap *left = new MaxHeap();
   Heap *right = new MinHeap();
   for(int i = 0; i < size; i++) {
      median = findMedian(A[i], median, *left, *right);
      cout<<"Median of elements : ";
      for(int j = 0; j<=i;j++) cout<<A[j]<<" ";
      cout<<"is "<<median<<endl;
   }
}
int main(){
   int A[] = {12, 54, 9, 6, 1};
   int size = ARRAY_SIZE(A);
   printMedianStream(A, size);
   return 0;
}

आउटपुट

Median of elements : 12 is 12
Median of elements : 12 54 is 33
Median of elements : 12 54 9 is 12
Median of elements : 12 54 9 6 is 10
Median of elements : 12 54 9 6 1 is 9

  1. सी ++ में संख्याओं की एक सरणी के उत्पाद में पहला अंक

    इस ट्यूटोरियल में, हम सीखेंगे कि किसी सरणी के उत्पाद का पहला अंक कैसे खोजा जाए। आइए समस्या को हल करने के लिए चरणों को देखें। ऐरे को इनिशियलाइज़ करें। सरणी में तत्वों का गुणनफल खोजें। परिणाम को 10 से कम होने तक विभाजित करें। सिंगल-डिजिट प्रिंट करें उदाहरण आइए कोड देखें। #include <b

  1. C++ में पहले N Iccanobif नंबर खोजने का कार्यक्रम

    इस ट्यूटोरियल में, हम N lccanobif संख्याओं को खोजने के लिए एक प्रोग्राम पर चर्चा करेंगे। इसके लिए हमें एक पूर्णांक प्रदान किया जाएगा। हमारा काम उस स्थिति में lccanobif संख्या ज्ञात करना है। वे फाइबोनैचि संख्या के समान हैं, सिवाय इसके कि हम पिछली दो संख्याओं को उनके अंकों को उलटने के बाद जोड़ते हैं।

  1. C++ में किसी सरणी में सभी अभाज्य संख्याओं का गुणनफल

    कुछ तत्वों के साथ एक पूर्णांक सरणी arr[] को देखते हुए, कार्य उस संख्याओं की सभी अभाज्य संख्याओं का गुणनफल खोजना है। अभाज्य संख्याएँ वे संख्याएँ होती हैं जिन्हें या तो 1 से या स्वयं संख्या से विभाजित किया जाता है, या एक अभाज्य संख्या एक ऐसी संख्या होती है जो 1 और स्वयं संख्या को छोड़कर किसी अन्य संख