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

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


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

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

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

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

इनपुट

10, 35, 20, 40 डालें, फिर एक यादृच्छिक संख्या प्राप्त करें, मान लें 40, फिर 20 हटाएं, फिर यादृच्छिक तत्व प्राप्त करें, जो मान लें 35 है।

आउटपुट

40 35

  1. C++ में ट्री नोड्स डिलीट करें C++ में ट्री नोड्स डिलीट करें

    मान लीजिए हमारे पास एक ट्री है, यह ट्री नोड 0 पर रूटेड है, यह निम्नानुसार दिया गया है -नोड्स की संख्या nodes हैi-वें नोड का मान value[i] हैi-वें नोड का पैरेंट parent[i] हैहमें हर उस सबट्री को हटाना है जिसके नोड्स के मानों का योग 0 है, ऐसा करने के बाद ट्री में शेष नोड्स की संख्या लौटाएं। यदि ट्री इस

  1. - C++ STL में set::insert() फ़ंक्शन

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

  1. C++ में BST से नोड हटाना C++ में BST से नोड हटाना

    मान लीजिए हमारे पास एक बाइनरी सर्च ट्री (BST) है। हमें एक कुंजी k दी जाती है, जिसे BST से हटाकर अपडेटेड BST लौटाना है। उदाहरण: ट्री [5,3,6,2,4,null,7] से कुंजी 3 हटाने पर ट्री [5,4,6,2,null,null,7] बनता है। BST डिलीशन एल्गोरिदम deleteRoot(root) हेल्पर: रूट नोड को हटाता है। यदि राइट सबट्री नहीं