สมมติว่าเรามีโครงสร้างข้อมูลที่รองรับการดำเนินการต่อไปนี้ทั้งหมดในเวลาเฉลี่ย O(1)
-
insert(val) − สิ่งนี้จะแทรก val รายการไปยังชุดหากยังไม่มีอยู่
-
remove(val) − สิ่งนี้จะลบ val ของไอเท็มออกจากเซ็ตหากมีอยู่
-
getRandom - สิ่งนี้จะส่งคืนองค์ประกอบสุ่มจากชุดองค์ประกอบปัจจุบัน แต่ละองค์ประกอบต้องมีความน่าจะเป็นที่จะถูกส่งกลับเท่ากัน
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
สำหรับการเริ่มต้น ให้กำหนดแผนผังหลักและอาร์เรย์องค์ประกอบ
-
สำหรับฟังก์ชัน insert() จะใช้ val เป็นอินพุต
-
ถ้า val ไม่มีอยู่ใน parent map หรือ parent[val] =0 ให้ใส่ val เข้าไปในองค์ประกอบ แล้วตั้งค่า parent[val] :=1 แล้วคืนค่า true
-
-
คืนค่าเท็จ
-
สำหรับเมธอด remove() จะใช้ val เพื่อลบ
-
ถ้า val ไม่มีอยู่ใน parent map หรือ parent[val] =0 ให้คืนค่าเท็จ
-
ตั้งค่าหลัก[val] :=0
-
index :=ดัชนีของ val ในอาร์เรย์องค์ประกอบ
-
หากดัชนีไม่เท่ากับความยาวขององค์ประกอบ – 1
-
temp :=องค์ประกอบสุดท้ายขององค์ประกอบ
-
ตั้งค่าองค์ประกอบสุดท้ายขององค์ประกอบ :=val
-
ตั้งค่าองค์ประกอบ[ดัชนี] :=อุณหภูมิ
-
-
ลบองค์ประกอบสุดท้ายขององค์ประกอบ
-
เมธอด getRandom() จะคืนค่าสุ่มใดๆ ที่มีอยู่ในอาร์เรย์องค์ประกอบ
ตัวอย่าง(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()) อินพุต
Initialize the class, then call the insert(), remove(), getRandom() functions. See the implementation.
ผลลัพธ์
True False True 2 True False 2