Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

แทรกลบ GetRandom O(1) ใน Python


สมมติว่าเรามีโครงสร้างข้อมูลที่รองรับการดำเนินการต่อไปนี้ทั้งหมดในเวลาเฉลี่ย 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