通过Python定义集合数据结构,而不使用库中的set类
假设我们想要实现一个集合数据结构,并带有以下方法 –
- 构造函数以构造集合的新实例
- add(val)将整数val插入到集合中
- exists(val)检查val是否在集合中
- remove(val)将val从集合中移除
因此,如果我们构造一个集合s,然后调用s.add(10),s.add(20),s.add(10),s.exists(10),s.remove(10),s.exists(10),s.exists(20) ,则输出为:
- 对于s.add(10),它将插入10
- 对于s.add(20),它将插入20
- 10已经在s中,所以不会发生任何事情
- s.exists(10)将返回真,因为10在那里
- 通过s.remove(10)删除10
- s.exists(10)将返回false,因为10已被删除,每个元素只能存在一次
- s.exists(20)将返回真,因为20存在那里。
为了解决这个问题,我们将按照以下步骤进行 –
- 定义构造函数。
- buckets:一个空映射,将保存数据列表
- 定义add()函数。这将采取val
- 如果exists(val)为false,则
- 在buckets [val]的末尾插入val
- 定义exists()函数。这将采取val
- 在buckets [val]中存在val时返回true,否则返回false
- 定义remove()函数。这将采取val
- 删除buckets [val]
示例
让我们看下面的实现以获得更好的理解 –
from collections import defaultdict
class MySet:
def __init__(self):
self.buckets = defaultdict(list)
def add(self, val):
if not self.exists(val):
self.buckets[val].append(val)
def exists(self, val):
return val in self.buckets[val]
def remove(self, val):
del self.buckets[val]
s = MySet()
s.add(10)
s.add(20)
s.add(10)
print(s.exists(10))
s.remove(10)
print(s.exists(10))
print(s.exists(20))
输入
s = MySet()
s.add(10)
s.add(20)
s.add(10)
s.exists(10)
s.remove(10)
s.exists(10)
s.exists(20)
输出
True
False
True