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

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


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

विंडो स्थितिमेडियन
13-1-353681
13-1-35368-1
13-1-35368-1
13-1-353683
13-1-353685
13-1-353686

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

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

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

बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें -

उदाहरण

#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++ में shuffle बनाम random_shuffle

    यहां हम C++ में shuffle और random_shuffle देखेंगे। पहले random_shuffle देखते हैं। इसका उपयोग रेंज [left, right) में एलिमेंट्स को रैंडमली रिअरेंज करने के लिए किया जाता है। यह फंक्शन प्रत्येक एलिमेंट की पोजीशन को रैंडमली चुनी गई पोजीशन के साथ स्वैप करता है। हम कुछ रैंडम जेनरेटर फंक्शन प्रदान कर सकते

  1. - विंडोज पर C++ के लिए सर्वश्रेष्ठ IDE कौन सा है?

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

  1. - विंडोज पर C++ के लिए शीर्ष IDE

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