কম্পিউটার

ঢোকান মুছুন GetRandom O(1) - C++-এ অনুমোদিত নকল


ধরুন, আমরা একটি ডেটা স্ট্রাকচার তৈরি করতে চাই, যা কিছু ক্রিয়াকলাপকে সমর্থন করে, এই অপারেশনগুলিকে অবশ্যই O(1) সময়ের মধ্যে প্রিফর্ম করতে হবে। সুতরাং এই অপারেশনগুলি −

এর মতো হোক
  • ঢোকান(x):সংগ্রহে x সন্নিবেশ করান
  • মুছুন(x):সংগ্রহ থেকে x মুছে দিন
  • getRandom():এটি সংগ্রহের র্যান্ডম উপাদানটি খুঁজে পাবে।

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

  • একটি অ্যারে সংখ্যা তৈরি করুন
  • একটি মানচিত্র তৈরি করুন m
  • একটি ফাংশন সন্নিবেশ () সংজ্ঞায়িত করুন, এটি ভাল লাগবে,
  • ret :=যখন val m না থাকে
  • m[val] এর শেষে সংখ্যার আকার সন্নিবেশ করুন
  • সংখ্যার শেষে { val, m[val] - 1} জোড়া সন্নিবেশ করুন
  • রিটার্ন রিটার্ন
  • একটি ফাংশন রিমুভ () সংজ্ঞায়িত করুন, এটি ভাল লাগবে,
  • ret :=যখন val m না থাকে
  • যদি ret অ-শূন্য হয়, তাহলে −
    • শেষ =সংখ্যার শেষ উপাদান
    • m[শেষের কী][শেষের মান] :=m[val] এর শেষ উপাদান
    • সংখ্যা[[m[val]] এর শেষ উপাদান :=শেষ
    • m[val] থেকে শেষ উপাদান মুছুন
    • যদি m[val] খালি হয়, তাহলে −
      • m থেকে ভ্যাল মুছুন
    • সংখ্যা থেকে শেষ উপাদান মুছুন
  • রিটার্ন রিটার্ন
  • একটি ফাংশন সংজ্ঞায়িত করুন getRandom()
  • সংগ্রহ থেকে একটি এলোমেলো উপাদান ফেরত দিন

আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -

উদাহরণ

#include <bits/stdc++.h>
using namespace std;
class RandomizedCollection {
public:
   vector <pair <int, int>> nums;
   unordered_map <int, vector<int>> m;
   RandomizedCollection() {
   }
   bool insert(int val) {
      bool ret = m.find(val) == m.end();
      m[val].push_back(nums.size());
      nums.push_back({val, m[val].size() - 1});
      return ret;
   }
   bool remove(int val) {
      bool ret = m.find(val) != m.end();
      if(ret){
         pair <int, int> last = nums.back();
         m[last.first][last.second] = m[val].back();
         nums[m[val].back()] = last;
         m[val].pop_back();
         if(m[val].empty())m.erase(val);
         nums.pop_back();
      }
      return ret;
   }
   int getRandom() {
      return nums[rand() % nums.size()].first;
   }
};
main(){
   RandomizedCollection ob;
   ob.insert(10);
   ob.insert(35);
   ob.insert(20);
   ob.insert(40);
   cout << (ob.getRandom()) << endl;
   ob.remove(20);
   cout << (ob.getRandom()) << endl;
}

ইনপুট

Insert 10, 35, 20, 40, then get one random number, say 40, then remove 20, again get random element, that is say 35.

আউটপুট

40
35

  1. C++ এ ট্রি নোড মুছুন

  2. C++ STL-এ insert() সেট করুন

  3. C++ এ BST-তে নোড মুছুন

  4. Python এ Delete GetRandom O(1) সন্নিবেশ করান