मान लीजिए, हम एक डेटा संरचना बनाना चाहते हैं, जो कुछ संचालन का समर्थन करती है, इन कार्यों को ओ (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