python-leetcode-705. 设计哈希集合

705. 设计哈希集合 - 力扣(LeetCode)

这里是一个使用链地址法(chaining)实现的 MyHashSet,不依赖任何内建的哈希表库:

class MyHashSet:
    def __init__(self, capacity=1000):
        """
        Initialize the HashSet with a given capacity.
        """
        self.capacity = capacity
        self.buckets = [[] for _ in range(self.capacity)]
    
    def _hash(self, key):
        """
        Compute the hash value of the key.
        """
        return key % self.capacity
    
    def add(self, key):
        """
        Insert key into the HashSet.
        """
        hash_value = self._hash(key)
        if key not in self.buckets[hash_value]:
            self.buckets[hash_value].append(key)
    
    def contains(self, key):
        """
        Return whether the key is in the HashSet.
        """
        hash_value = self._hash(key)
        return key in self.buckets[hash_value]
    
    def remove(self, key):
        """
        Remove key from the HashSet.
        """
        hash_value = self._hash(key)
        if key in self.buckets[hash_value]:
            self.buckets[hash_value].remove(key)

设计思路:

  1. 哈希函数: 采用简单的取模运算 key % capacity 来计算索引,确保键值能够均匀分布在 capacity 个桶中。

  2. 桶结构: 采用列表数组 self.buckets 来存储数据,每个桶是一个独立的链表(列表)。

  3. 添加操作 (add): 计算哈希值并插入到对应的桶中,若该值已存在,则不重复插入。

  4. 查找操作 (contains): 计算哈希值,并检查该值是否在对应的桶中。

  5. 删除操作 (remove): 计算哈希值并从相应的桶中移除该值。

该实现的平均时间复杂度接近 O(1),在最坏情况下(所有键值冲突)可能达到 O(n)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值