题目:
不使用任何内建的哈希表库设计一个哈希集合(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] * 1000001
def add(self, key):
"""
:type key: int
:rtype: None
"""
self.hashset[key] = True
def remove(self, key):
"""
:type key: int
:rtype: None
"""
self.hashset[key] = False
def 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 = 1000
self.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 True
return False
提交通过:
文章讲述了如何不使用内建哈希表库,分别通过超大数组和哈希函数+链地址法实现MyHashSet类,包括添加、移除和查找操作。两种方法的优缺点及适用场景对比。
481

被折叠的 条评论
为什么被折叠?



