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

C++ में स्लाइडिंग विंडो मेडियन

मान लीजिए कि हमारे पास संख्याओं की एक सूची है, और हमारे पास एक विंडो आकार k है, हमें स्लाइडिंग विंडो तरीके का उपयोग करके माध्यिकाओं की सूची ढूंढनी होगी। तो, अगर वितरण नीचे जैसा है -

<वें colspan="2">माध्यिका
विंडो स्थिति
1 3 -1 -3 5 3 6 8 1
1 3 -1 -3 5 3 6 8 -1
1 3 -1 -3 5 3 6 8 -1
1 3 -1 -3 5 3 6 8 3
1 3 -1 -3 5 3 6 8 5
1 3 -1 -3 5 3 6 8 6

यहां हमने माना है कि k 3 है, और परिणाम [1,-1,-1,3,5,6]

होगा।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • एक सेट गिरफ्तारी परिभाषित करें
  • फ़ंक्शन इंसर्ट को परिभाषित करें (), इसमें x लगेगा,
  • गिरफ्तारी में x डालें
  • एक फ़ंक्शन को परिभाषित करें हटाएं_(), इसमें x लगेगा,
  • यदि यह मौजूद है, तो गिरफ्तारी से x हटाएं
  • एक फ़ंक्शन परिभाषित करें getMedian()
  • n :=गिरफ्तारी का आकार
  • a :=n/2 पर जाएं - गिरफ्तारी के पहले तत्व से 1 कदम आगे, और मान प्राप्त करें
  • b :=गिरफ्तारी के पहले तत्व से n/2 कदम आगे बढ़ें, और मान प्राप्त करें
  • यदि गिरफ्तारी का आकार है, तो −
    • वापसी ख
  • वापसी (ए + बी) * 0.5
  • मुख्य विधि से निम्न कार्य करें
  • एक सरणी को परिभाषित करें उत्तर
  • सरणी एरर साफ़ करें
  • इनिशियलाइज़ i :=0 के लिए, जब i करें
  • फ़ंक्शन इन्सर्ट को कॉल करें(nums[i])
  • इनिशियलाइज़ करने के लिए i :=k, j :=0, जब i <अंकों का आकार, अपडेट (i से 1 बढ़ाएँ), (j को 1 से बढ़ाएँ), करें -
    • उत्तर के अंत में getMedian() का लौटाया गया मान डालें
    • फ़ंक्शन को कॉल करें delete_(nums[j])
    • फ़ंक्शन इन्सर्ट को कॉल करें(nums[i])
  • उत्तर के अंत में getMedian() का लौटाया गया मान डालें
  • वापसी उत्तर
  • आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

    उदाहरण

    #include <bits/stdc++.h>
    using namespace std;
    void print_vector(vector<auto> v){
       cout << "[";
       for(int i = 0; i<v.size(); i++){
          cout << v[i] << ", ";
       }
       cout << "]"<<endl;
    }
    class Solution {
    public:
       multiset <double> arr;
       void insert(double x){
          arr.insert(x);
       }
       void delete_(double x){
          arr.erase(arr.find(x));
       }
       double getMedian(){
          int n = arr.size();
          double a = *next(arr.begin(), n / 2 - 1);
          double b = *next(arr.begin(), n / 2);
          if(arr.size() & 1)return b;
          return (a + b) * 0.5;
       }
       vector<double> medianSlidingWindow(vector<int>& nums, int k) {
          vector <double> ans;
          arr.clear();
          for(int i = 0; i < k; i++){
             insert(nums[i]);
          }
          for(int i = k, j = 0; i < nums.size(); i++, j++){
             ans.push_back(getMedian());
             delete_(nums[j]);
             insert(nums[i]);
          }
          ans.push_back(getMedian());
          return ans;
       }
    };
    main(){
       Solution ob;
       vector<int> v = {1,3,-1,-3,5,3,6,8};
       print_vector(ob.medianSlidingWindow(v, 3));
    }

    इनपुट

    {1,3,-1,-3,5,3,6,8}

    आउटपुट

    [1, -1, -1, 3, 5, 6, ]

    1. C++ में शफल बनाम random_shuffle

      यहां हम C++ में Shuffle और random_shuffle देखेंगे। आइए पहले random_shuffle देखें। इसका उपयोग तत्वों को [बाएं, दाएं] श्रेणी में बेतरतीब ढंग से पुनर्व्यवस्थित करने के लिए किया जाता है। यह फ़ंक्शन बेतरतीब ढंग से चुने गए कुछ पदों की स्थिति के साथ प्रत्येक तत्व की स्थिति को बेतरतीब ढंग से स्वैप करता है।

    1. विंडो पर C++ का सबसे अच्छा IDE क्या है?

      केवल टेक्स्ट एडिटर्स पर बड़े प्रोजेक्ट्स को मैनेज करना मुश्किल है। यदि आप ऐसे मामलों में आईडीई का उपयोग करते हैं तो आप अधिक उत्पादक और कम निराश होने की संभावना रखते हैं। विभिन्न प्रकार के आईडीई हैं और आपको अपनी आवश्यकताओं के अनुरूप सही का चयन करना चाहिए। विंडोज़ पर सी ++ के लिए कोई भी सर्वश्रेष्ठ आई

    1. विंडो पर c++ के लिए शीर्ष IDE क्या है?

      केवल टेक्स्ट एडिटर्स पर बड़े प्रोजेक्ट्स को मैनेज करना मुश्किल है। यदि आप ऐसे मामलों में आईडीई का उपयोग करते हैं तो आप अधिक उत्पादक और कम निराश होने की संभावना रखते हैं। विभिन्न प्रकार के आईडीई हैं और आपको अपनी आवश्यकताओं के अनुरूप सही का चयन करना चाहिए। यहां विंडो के लिए सर्वश्रेष्ठ C/C++ IDE की सू