কম্পিউটার

C++ এ স্লাইডিং উইন্ডো মিডিয়ান


ধরুন আমাদের সংখ্যার একটি তালিকা আছে, এবং আমাদের একটি উইন্ডো সাইজ k, আমাদের স্লাইডিং উইন্ডো পদ্ধতি ব্যবহার করে মধ্যমাগুলির তালিকা খুঁজে বের করতে হবে। সুতরাং, যদি বন্টন নিচের মত হয় -

উইন্ডোর অবস্থান মাঝারি
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]

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

  • এক সেট arr সংজ্ঞায়িত করুন
  • একটি ফাংশন সন্নিবেশ () সংজ্ঞায়িত করুন, এটি x লাগবে,
  • এআর-এ x ঢোকান
  • একটি ফাংশন সংজ্ঞায়িত করুন delete_(), এটি x লাগবে,
  • আর থেকে x মুছুন, যদি এটি বিদ্যমান থাকে
  • একটি ফাংশন getMedian()
  • সংজ্ঞায়িত করুন
  • n :=arr এর আকার
  • a :=n/2-এ ঝাঁপ দাও - arr-এর প্রথম উপাদান থেকে 1 ধাপ এগিয়ে, এবং মান পান
  • b :=arr-এর প্রথম উপাদান থেকে n/2 ধাপ এগিয়ে যান এবং মান পান
  • যদি arr এর আকার হয়, তাহলে −
    • ফেরত b
  • রিটার্ন (a + b) * 0.5
  • প্রধান পদ্ধতি থেকে নিম্নলিখিতগুলি করুন
  • একটি অ্যারে উত্তর সংজ্ঞায়িত করুন
  • অ্যারে সাফ করুন
  • আরম্ভ করার জন্য i :=0, যখন i করুন
  • ফাংশন সন্নিবেশ কল করুন(সংখ্যা[i])
  • আরম্ভ করার জন্য i :=k, j :=0, যখন i <সংখ্যার আকার, আপডেট করুন (i 1 দ্বারা বৃদ্ধি করুন), (j 1 দ্বারা বৃদ্ধি করুন), করুন −
    • উত্তর শেষে getMedian() এর ফেরত মান সন্নিবেশ করুন
    • ফাংশনটিকে কল করুন delete_(সংখ্যা[j])
    • ফাংশন সন্নিবেশ কল করুন(সংখ্যা[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++-এ একটি অ্যারের মধ্যম সর্বোচ্চ করুন

    2. C++ এ শাফেল বনাম এলোমেলো_শাফেল

    3. উইন্ডোতে C++ এর সেরা IDE কি?

    4. উইন্ডোতে c++ এর জন্য শীর্ষ IDE কি?