मुझे यह देखने के लिए एक शॉट देने की कोशिश करें कि मैं कसाई को कितना दे सकता हूं। :-)
तो, शुरू करने के लिए, आपको एक नियमित ब्लॉम फ़िल्टर बनाने में सक्षम होने की आवश्यकता होती है जो एक झूठी सकारात्मक की अधिकतम संभावना वाले तत्वों की एक सीमित संख्या की अनुमति देता है। एक स्केलेबल कार्यान्वयन के निर्माण के प्रयास से पहले आपके मूल फ़िल्टर के लिए इन सुविधाओं को जोड़ना आवश्यक है।
इससे पहले कि हम संभावना को नियंत्रित और अनुकूलित करने का प्रयास करें, यह पता लगाने देता है कि दिए गए ब्लूम फ़िल्टर आकार के लिए संभावना क्या है।
पहले हम बिटफ़ील्ड को विभाजित करते हैं कि हमारे पास कितने हैश फ़ंक्शन हैं (बिट्स की कुल संख्या / हैश फ़ंक्शन = स्लाइस) बिट्स के स्लाइस प्राप्त करने के लिए जो प्रत्येक हैश फ़ंक्शन का प्रतिनिधित्व करते हैं ताकि हर तत्व हमेशा के बिट्स द्वारा वर्णित हो।
यदि आप स्लाइस की संख्या या बिट्स की संख्या प्रति स्लाइस बढ़ाते हैं, तो झूठी सकारात्मक की संभावना कम हो जाएगी।
यह भी अनुसरण करता है कि जैसे-जैसे तत्व जोड़े जाते हैं, अधिक बिट्स 1 पर सेट होते हैं, इसलिए झूठी सकारात्मकता बढ़ जाती है। हम इसे प्रत्येक स्लाइस के "भरण अनुपात" के रूप में संदर्भित करते हैं।
जब फ़िल्टर बड़ी मात्रा में डेटा रखता है, तो हम मान सकते हैं कि इस फ़िल्टर के लिए झूठी सकारात्मकता की संभावना स्लाइस की संख्या के लिए उठाया गया अनुपात है (यदि हम अनुपात का उपयोग करने के बजाय वास्तव में बिट्स की गणना करते हैं, तो यह सरल हो जाता है पुनरावृत्ति समस्या के साथ एक क्रमचय)।
तो, हम कैसे पता लगाते हैं कि एक खिलने वाले फिल्टर में झूठी सकारात्मकता की संभावना कैसे चुनें? हम स्लाइस की संख्या को संशोधित कर सकते हैं (जो भरण अनुपात को प्रभावित करेगा)।
यह पता लगाने के लिए कि हमारे पास कितने स्लाइस हैं, हम एक स्लाइस के लिए इष्टतम भरण अनुपात का पता लगाने के साथ शुरू करते हैं। चूंकि भरण अनुपात बिट्स की संख्या से एक स्लाइस में निर्धारित होता है जो 1 बनाम बिट्स की संख्या है जो 0 हैं, हम यह निर्धारित कर सकते हैं कि प्रत्येक बिट एक स्लाइस में (100% - (1 / बिट्स) की संभावना से परेशान रहेगा। )। चूंकि हम कई आइटम सम्मिलित करने जा रहे हैं, हमारे पास प्रतिष्ठा की समस्या के साथ एक और क्रमचय है और हम चीजों को अपेक्षित भराव अनुपात तक बढ़ाते हैं, जो (100% - (100% - (एक स्लाइस में बिट्स)) ^ है "तत्वों को डाला"))। खैर, यह पता चला है कि यह दूसरे समीकरण के समान है। कागज में, वे भराव अनुपात को दूसरे समीकरण से संबंधित करते हैं, इसलिए यह टेलर श्रृंखला (1-ई ^ (- n / m)) में अच्छी तरह से फिट बैठता है। इस के साथ थोड़ा सा चक्कर लगाने के बाद, यह पता चला है कि इष्टतम भरण अनुपात हमेशा 50% है,
इसलिए, चूंकि एक फ़िल्टर की संभावना स्लाइस की संख्या के लिए उठाया गया अनुपात है, हम 50% में भर सकते हैं और P = (50%) ^ k या k = log_2 (1 / P) प्राप्त कर सकते हैं। फिर हम इस फ़ंक्शन का उपयोग स्केलेबल ब्लेंडर फिल्टर के लिए फिल्टर की सूची में दिए गए फ़िल्टर के लिए उत्पन्न स्लाइस की संख्या की गणना करने के लिए कर सकते हैं।
def slices_count(false_positive_probability):
return math.ceil(math.log(1 / false_positive_probability, 2))
संपादित करें: इसे लिखने के बाद, मुझे "पचास-प्रतिशत नियम" का उल्लेख आया, जब TAoCP Vol 1 में मित्र प्रणाली आधारित डायनामिक मेमोरी आवंटन पर पढ़ना, pp 442-445 के साथ एक बहुत क्लीनर तर्क के साथ वक्र को फिटिंग करने के लिए (1) -e ^ (- n / मीटर))। नुथ एक पेपर "द पचास प्रतिशत रूल रिविजिटेड" कॉन्सेप्ट पर बैकग्राउंड की थोड़ी सी पृष्ठभूमि ( पीडीएफ यहां उपलब्ध है ) का संदर्भ देता है ।