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

सम्मिलित करें हटाएं GetRandom O(1) - C++ में अनुमत डुप्लिकेट्स

मान लीजिए, हम एक डेटा संरचना बनाना चाहते हैं, जो कुछ संचालन का समर्थन करती है, इन कार्यों को ओ (1) समय की मात्रा में पूर्वनिर्मित किया जाना चाहिए। तो चलिए ये ऑपरेशन इस तरह हैं -

  • सम्मिलित करें(x):संग्रह में x डालें
  • निकालें(x):संग्रह से x हटाएं
  • getRandom():यह उस संग्रह के रूप में यादृच्छिक तत्व ढूंढेगा।

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

  • सरणी संख्याएं बनाएं
  • एक नक्शा मी बनाएं
  • एक फ़ंक्शन डालने को परिभाषित करें (), यह वैल लेगा,
  • ret :=जब वैल m में न हो
  • m[val] के अंत में अंकों का आकार डालें
  • संख्याओं के अंत में { val, size of m[val] – 1} युग्म डालें
  • रिटर्न रिटर्न
  • एक फ़ंक्शन को परिभाषित करें निकालें(), यह वैल लेगा,
  • ret :=जब वैल m में न हो
  • यदि रिट गैर-शून्य है, तो −
    • अंतिम =अंकों का अंतिम तत्व
    • m [अंतिम की कुंजी] [अंतिम का मान] :=m का अंतिम तत्व [वैल]
    • अंक [[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++ में ट्री नोड्स हटाएं

    मान लीजिए कि हमारे पास एक पेड़ है, इस पेड़ की जड़ें नोड 0 पर हैं, यह इस प्रकार दिया गया है - नोड्स की संख्या नोड्स है ith नोड का मान मान है[i] ith नोड का जनक माता-पिता है[i] हमें प्रत्येक सबट्री को हटाना होगा जिसका नोड्स के मानों का योग 0 है, ऐसा करने के बाद पेड़ में शेष नोड्स की संख्या वापस कर द

  1. सी ++ एसटीएल में सम्मिलित करें () सेट करें

    इस लेख में हम C++ STL में सेट ::इन्सर्ट () फंक्शन, उनके सिंटैक्स, वर्किंग और उनके रिटर्न वैल्यू पर चर्चा करने जा रहे हैं। C++ STL में क्या सेट होता है? C++ STL में सेट ऐसे कंटेनर होते हैं जिनमें सामान्य क्रम में अद्वितीय तत्व होने चाहिए। सेट में अद्वितीय तत्व होने चाहिए क्योंकि तत्व का मान तत्व की

  1. सी ++ में बीएसटी में नोड हटाएं

    मान लीजिए कि हमारे पास एक बाइनरी सर्च ट्री है। हम एक कुंजी k लेंगे, और हमें दिए गए कुंजी k को BST से हटाना होगा, और अद्यतन BST को वापस करना होगा। तो अगर पेड़ जैसा है - और कुंजी k =3, तो आउटपुट ट्री होगा - इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - रूट नोड को हटाने के लिए deleteR