Tendría que pensar en cómo hacer la búsqueda, ya que hay dos métodos que el conjunto necesita, __hash__
y __eq__
.
El hash es una "pieza suelta" que puede llevarse, pero el __eq__
no es una pieza suelta que puede guardar; debes tener dos cadenas para la comparación.
Si solo necesita la confirmación negativa (este elemento no es parte del conjunto), puede completar una colección de conjuntos que implementó con sus cadenas, luego "finaliza" el conjunto quitando todas las cadenas, excepto aquellas con colisiones (se guardan para eq pruebas), y promete no agregar más objetos a su Conjunto. Ahora tiene una prueba exclusiva disponible ... puede ver si un objeto no es en su Conjunto. No puede estar seguro si "obj en Set == True" es un falso positivo o no.
Editar: Esto es básicamente un filtro de floración que fue hábilmente vinculado, pero un filtro de floración puede usar más de un hash por elemento que es realmente inteligente.
Edit2: Este es mi 3 minutos filtro Bloom:
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)
por cierto, ¿está relacionado con * el * Tarjan? – yairchu
+1, esta pregunta trajo respuestas muy interesantes. –
¿Qué tan grande es el lote? – u0b34a0f6ae