आपको लुकअप कैसे करना है, इसके बारे में सोचना होगा, क्योंकि सेट की आवश्यकता के दो तरीके हैं, __hash__
और __eq__
।
हैश एक "ढीला हिस्सा" है जिसे आप दूर ले सकते हैं, लेकिन __eq__
एक ढीला हिस्सा नहीं है जिसे आप बचा सकते हैं; तुलना के लिए आपके पास दो तार हैं।
यदि आपको केवल नकारात्मक पुष्टि की आवश्यकता है (यह आइटम सेट का हिस्सा नहीं है), तो आप अपने तारों के साथ स्वयं को लागू एक सेट संग्रह भर सकते हैं, फिर आप टकराव वाले लोगों को छोड़कर सभी तारों को हटाकर सेट को "अंतिम रूप दें" (उन्हें ईक परीक्षणों के लिए चारों ओर रखा जाता है), और आप अपने सेट में अधिक ऑब्जेक्ट्स न जोड़ने का वादा करते हैं। अब आपके पास एक अनन्य परीक्षण उपलब्ध है .. आप बता सकते हैं कि कोई ऑब्जेक्ट आपके सेट में नहीं है। आप निश्चित नहीं हो सकते हैं कि "सेट == ट्रू में obj" झूठी सकारात्मक है या नहीं।
संपादित करें: यह मूल रूप से एक ब्लूम फ़िल्टर है जो चालाकी से जुड़ा हुआ था, लेकिन एक ब्लूम फ़िल्टर प्रति तत्व एक से अधिक हैश का उपयोग कर सकता है जो वास्तव में चालाक है।
EDIT2:
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)
बीटीडब्ल्यू, क्या आप * * * टार्गन से संबंधित हैं? – yairchu
+1, इस सवाल ने बहुत रोचक जवाब लाए। –
कितना बड़ा है? – u0b34a0f6ae