返回
精辟解析 O(1) 时间插入、删除和获取随机元素:一览数据结构运用题的精妙 挥洒算法魅力
后端
2023-09-19 00:24:06
前言
数据结构,作为计算机科学中不可或缺的基础,为我们处理和组织数据提供了有力支撑。在数据结构的领域,有一类问题备受关注,即“O(1) 时间插入、删除和获取随机元素”问题,它要求我们设计一种数据结构,能够以恒定时间复杂度完成这三个操作,在本文中,我们将带领您一探究竟,领略数据结构运用题的精妙之处。
题目概述
LeetCode 上的 380. O(1) 时间插入、删除和获取随机元素 问题如下:
设计一个数据结构,支持以下操作:
insert(val)
:将元素val
插入到数据结构中。remove(val)
:将元素val
从数据结构中删除。getRandom()
:从数据结构中随机获取一个元素。
所有操作都应在 O(1) 时间复杂度内完成。
解题思路
为了解决这个问题,我们可以借助哈希表和数组两种数据结构的优势。哈希表可以帮助我们快速查找元素,而数组可以帮助我们随机访问元素。
- 哈希表: 我们可以使用哈希表来存储元素及其在数组中的索引。当我们插入一个元素时,我们将其插入哈希表,并将其索引存储在数组中。当我们删除一个元素时,我们从哈希表中删除该元素,并从数组中删除其索引。
- 数组: 我们可以使用数组来存储元素。当我们随机获取一个元素时,我们从数组中随机选择一个索引,并返回该索引对应的元素。
代码实现
class RandomizedSet:
def __init__(self):
"""
Initialize your data structure here.
"""
self.nums = []
self.val_to_idx = {}
def insert(self, val: int) -> bool:
"""
Inserts a value to the set. Returns true if the set did not already contain the specified element.
"""
if val in self.val_to_idx:
return False
self.nums.append(val)
self.val_to_idx[val] = len(self.nums) - 1
return True
def remove(self, val: int) -> bool:
"""
Removes a value from the set. Returns true if the set contained the specified element.
"""
if val not in self.val_to_idx:
return False
idx = self.val_to_idx[val]
last_val = self.nums[-1]
self.nums[idx] = last_val
self.val_to_idx[last_val] = idx
self.nums.pop()
del self.val_to_idx[val]
return True
def getRandom(self) -> int:
"""
Get a random element from the set.
"""
idx = random.randint(0, len(self.nums) - 1)
return self.nums[idx]
时间复杂度分析
在上述实现中,插入、删除和获取随机元素的时间复杂度都是 O(1),因为我们使用了哈希表来快速查找元素及其索引。
结语
LeetCode 上的 380. O(1) 时间插入、删除和获取随机元素 问题充分体现了数据结构运用题的精髓。通过巧妙地结合哈希表和数组这两种数据结构,我们可以设计出满足问题要求的数据结构,以恒定时间复杂度完成插入、删除和获取随机元素这三个操作。