Вам следует подумать о том, как выполнить поиск, поскольку существует два метода, которые необходимы для набора: __hash__
и __eq__
.
Хеш - это «свободная часть», которую вы можете убрать, но __eq__
- это не свободная часть, которую вы можете сохранить; Для сравнения необходимо иметь две строки.
Если вам нужно только отрицательное подтверждение (этот элемент не является частью набора), вы можете заполнить коллекцию Set, которую вы реализовали, своими строками, а затем «завершить» набор, удалив все строки, кроме строк с коллизиями ( они сохраняются для eq тестов), и вы обещаете не добавлять больше объектов в ваш сет. Теперь у вас есть эксклюзивный тест. Вы можете сказать, не является ли объект не в вашем наборе. Вы не можете быть уверены, является ли «obj in Set == True» ложным срабатыванием или нет.
Редактировать: Это в основном фильтр Блума, который был ловко связан, но фильтр Блума может использовать более одного хеша на элемент, который действительно умный.
Edit2: Это мой 3-минутный фильтр Блума:
class BloomFilter (object):
"""
Let's make a bloom filter
http://en.wikipedia.org/wiki/Bloom_filter
__contains__ has false positives, but never false negatives
"""
def __init__(self, hashes=(hash, )):
self.hashes = hashes
self.data = set()
def __contains__(self, obj):
return all((h(obj) in self.data) for h in self.hashes)
def add(self, obj):
self.data.update(h(obj) for h in self.hashes)