Python 中的插入删除 GetRandom O(1)

pythonserver side programmingprogramming更新于 2023/10/8 4:11:00

假设我们有一个数据结构,它支持平均 O(1) 时间内的所有后续操作。

  • insert(val) − 如果尚不存在项 val,则将项 val 插入到集合中。

  • remove(val) − 如果存在项 val,则将项 val 从集合中删除。

  • getRandom − 这将从当前元素集合中返回一个随机元素。每个元素必须具有相同的返回概率。

为了解决这个问题,我们将遵循以下步骤 −

  • 对于初始化,定义一个父映射和元素数组

  • 对于 insert() 函数,它将以 val 作为输入

    • 如果父映射中不存在 val,或者 parent[val] = 0,则将 val 插入元素,并设置 parent[val] := 1,并返回 true

  • 返回 false

  • 对于 remove() 方法,它将使用 val 来删除

  • 如果父映射中不存在 val,或者 parent[val] = 0,则返回 false

  • 设置 parent[val] := 0

  • index := elements 数组中 val 的索引

  • 如果索引与元素长度不同 – 1

    • temp := elements 的最后一个元素

    • 设置 elements 的最后一个元素 := val

    • 设置 elements[index] := temp

  • 删除 elements 的最后一个元素

  • 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())

输入

Initialize the class, then call the insert(), remove(), getRandom() functions. See the implementation.

输出

True
False
True
2
True
False
2

相关文章