返回

精辟解析 O(1) 时间插入、删除和获取随机元素:一览数据结构运用题的精妙 挥洒算法魅力

后端

前言

数据结构,作为计算机科学中不可或缺的基础,为我们处理和组织数据提供了有力支撑。在数据结构的领域,有一类问题备受关注,即“O(1) 时间插入、删除和获取随机元素”问题,它要求我们设计一种数据结构,能够以恒定时间复杂度完成这三个操作,在本文中,我们将带领您一探究竟,领略数据结构运用题的精妙之处。

题目概述

LeetCode 上的 380. O(1) 时间插入、删除和获取随机元素 问题如下:

设计一个数据结构,支持以下操作:

  • insert(val):将元素 val 插入到数据结构中。
  • remove(val):将元素 val 从数据结构中删除。
  • getRandom():从数据结构中随机获取一个元素。

所有操作都应在 O(1) 时间复杂度内完成。

解题思路

为了解决这个问题,我们可以借助哈希表和数组两种数据结构的优势。哈希表可以帮助我们快速查找元素,而数组可以帮助我们随机访问元素。

  1. 哈希表: 我们可以使用哈希表来存储元素及其在数组中的索引。当我们插入一个元素时,我们将其插入哈希表,并将其索引存储在数组中。当我们删除一个元素时,我们从哈希表中删除该元素,并从数组中删除其索引。
  2. 数组: 我们可以使用数组来存储元素。当我们随机获取一个元素时,我们从数组中随机选择一个索引,并返回该索引对应的元素。

代码实现

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) 时间插入、删除和获取随机元素 问题充分体现了数据结构运用题的精髓。通过巧妙地结合哈希表和数组这两种数据结构,我们可以设计出满足问题要求的数据结构,以恒定时间复杂度完成插入、删除和获取随机元素这三个操作。