Вам нужно будет подумать о том, как выполнить поиск, поскольку для этого необходимы два метода, __hash__
и __eq__
.
Хэш - это «свободная часть», которую можно отнять, но __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)
Кстати, вы имеете отношение к * the * Tarjan? – yairchu
+1, этот вопрос привел очень интересные ответы. –
Насколько велика партия? – u0b34a0f6ae