মনে করুন আমাদের একটি ডেটা স্ট্রাকচার তৈরি করতে হবে যা নিচের সকল অপারেশন গড়ে O(1) টাইমে সাপোর্ট করবে:
insert(val)— যদিvalসেটে না থাকে তবে ইনসার্ট করবে।remove(val)— যদিvalসেটে থাকে তবে রিমুভ করবে।getRandom()— বর্তমান সেটের এলিমেন্টগুলোর মধ্যে থেকে যেকোনো একটি র্যান্ডমলি রিটার্ন করবে। প্রতিটি এলিমেন্টের সমান প্রোবাবিলিটি থাকবে।
এটি সমাধান করতে আমরা নিচের ধাপগুলো ফলো করব (হ্যাশ ম্যাপ + ডাইনামিক অ্যারে):
ইনিশিয়ালাইজেশনে:
parentম্যাপ এবংelementsঅ্যারে ডিফাইন করুন।insert()ফাংশনvalনেবে:যদি
valparent-এ না থাকে বাparent[val] == 0, তবেelements-এ অ্যাপেন্ড করুন,parent[val] := 1, এবংtrueরিটার্ন করুন।
falseরিটার্ন করুন।remove()মেথডvalনেবে:যদি
valparent-এ না থাকে বাparent[val] == 0, তবেfalseরিটার্ন করুন।parent[val] := 0index := elements-এ val-এর ইনডেক্সযদি
index != len(elements) - 1:temp := elements[-1]elements[-1] := valelements[index] := temp
elements.pop()(লাস্ট এলিমেন্ট ডিলিট)
getRandom()মেথডelementsঅ্যারেতে থাকা যেকোনো র্যান্ডম ভ্যালু রিটার্ন করবে।
উদাহরণ (Python)
নিচের ইমপ্লিমেন্টেশন দেখুন ভালো বুঝতে।
import random
class RandomizedSet(object):
def __init__(self):
self.present = {}
self.elements = []
def insert(self, val):
if val not in self.present or self.present[val] == 0:
self.elements.append(val)
self.present[val] = 1
return True
return False
def remove(self, val):
if val not in self.present or self.present[val] == 0:
return False
self.present[val] = 0
index = self.elements.index(val)
if index != len(self.elements) - 1:
temp = self.elements[-1]
self.elements[-1] = val
self.elements[index] = temp
self.elements.pop()
return True
def getRandom(self):
return random.choice(self.elements)
ob = RandomizedSet()
print(ob.insert(1))
print(ob.remove(2))
print(ob.insert(2))
print(ob.getRandom())
print(ob.remove(1))
print(ob.insert(2))
print(ob.getRandom())
ইনপুট
ক্লাস ইনিশিয়ালাইজ করুন, তারপর insert(), remove(), getRandom() ফাংশন কল করুন। ইমপ্লিমেন্টেশন দেখুন।
আউটপুট
True False True 2 True False 2