কম্পিউটার টিউটোরিয়াল

C++-এ ইন্সার্ট ডিলিট গেটর্যান্ডম O(1) - ডুপ্লিকেট অনুমোদিত

র‍্যান্ডোমাইজড কলেকশন (ডুপ্লিকেট অনুমোদিত)

একটি ডেটা স্ট্রাকচার তৈরি করতে হবে যা নিচের অপারেশনগুলো O(1) সময়ে সমর্থন করে:

  • insert(val): মান যোগ করুন, নতুন হলে true ফেরত দিন
  • remove(val): মান মুছুন, সফল হলে true ফেরত দিন
  • getRandom(): কালেকশন থেকে একটি র‍্যান্ডোম উপাদান ফেরত দিন

ডুপ্লিকেট মান অনুমোদিত।

সমাধানের পদ্ধতি

  • ভেক্টর nums: প্রতিটি এন্ট্রি হলো pair<value, index_in_map_vector>
  • আনঅর্ডার্ড ম্যাপ m: কী = মান, মান = সূচকগুলোর ভেক্টর (যেগুলো nums-এ অবস্থান করে)
  • ইনসার্ট: nums-এ যোগ করুন, ম্যাপে সূচক যোগ করুন
  • রিমুভ: শেষ উপাদানটি মুছে ফেলা উপাদানের জায়গায় স왪 করুন, তারপর পপ করুন। ম্যাপ আপডেট করুন
  • গেটর্যান্ডম: nums[rand() % size].first ফেরত দিন

C++ কোড উদাহরণ

#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, (int)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;
    }
};

int 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;
    return 0;
}

ইনপুট

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-এ set::insert() ফাংশন

  3. BST-এ নোড ডিলিট C++-এ

  4. পাইথনে O(1) এ Insert, Delete, GetRandom ইম্প্লিমেন্টেশন