题目:
不使用任何内建的哈希表库设计一个哈希集合(HashSet)。
实现 MyHashSet
类:
void add(key)
向哈希集合中插入值key
。bool contains(key)
返回哈希集合中是否存在这个值key
。void remove(key)
将给定值key
从哈希集合中删除。如果哈希集合中没有这个值,什么也不做。
提示:
0 <= key <= 10^6
- 最多调用
104
次add
、remove
和contains
思考:
偷懒做法:超大数组
因为 0<= key <= 10^6,所以可以建立一个长度为 10^6 + 1 的超大数组,数组的索引代表key值,数组的值(True / False)代表是否存在key值。代码如下:
class MyHashSet(object):def __init__(self):self.hashset = [False] * 1000001def add(self, key):""":type key: int:rtype: None"""self.hashset[key] = Truedef remove(self, key):""":type key: int:rtype: None"""self.hashset[key] = Falsedef contains(self, key):""":type key: int:rtype: bool"""return self.hashset[key]
提交通过:
正经做法:哈希函数+链地址法
设置一个长度为volume的数组hash,由volume个空列表组成。哈希函数为index=key%volume。那么对于任意值key,用哈希函数计算得到key所在的列表的位置,然后在列表中进行add、remove、contains操作。
由于 0<= key <= 10^6,所以取volume值为10^3,代码如下:
class MyHashSet(object):def __init__(self):self.volume = 1000self.hashset = [[] for _ in range(self.volume)]def _hash(self, key):return key % self.volume # 哈希函数def add(self, key):""":type key: int:rtype: None"""index = self._hash(key)if key not in self.hashset[index]:self.hashset[index].append(key)def remove(self, key):""":type key: int:rtype: None"""index = self._hash(key)if key in self.hashset[index]:self.hashset[index].remove(key)def contains(self, key):""":type key: int:rtype: bool"""index = self._hash(key)if key in self.hashset[index]:return Truereturn False
提交通过: