खिल फिल्टर का उपयोग करने के लिए क्या फायदा है?


108

मैं ब्लूम फ़िल्टर पर पढ़ रहा हूं और वे सिर्फ मूर्खतापूर्ण लगते हैं। कुछ भी आप एक ब्लूम फ़िल्टर के साथ पूरा कर सकते हैं, आप कम स्थान पर, अधिक कुशलता से, एक से अधिक हैश फ़ंक्शन का उपयोग करके कई के बजाय पूरा कर सकते हैं, या यही लगता है। आप एक ब्लूम फ़िल्टर का उपयोग क्यों करेंगे और यह कैसे उपयोगी है?


5
क्या आपने विकिपीडिया लेख पढ़ा है? यह बहुत अच्छी तरह से फायदे बताते हैं। en.wikipedia.org/wiki/Bloom_filter
एलेक्स बुडोव्स्की

@david कि संभावना नहीं है, हालांकि लगता है। एक स्थिर स्थान में k हैश फ़ंक्शन एक निरंतर स्थान में एक एकल हैश फ़ंक्शन की तुलना में कई अधिक टकराव होगा।
सिरदर्द

1
@ एलेक्स मैंने विकिपीडिया लेख पढ़ा है। मैं समझता हूं कि वहां क्या कहा गया है, लेकिन मुझे समझ नहीं आता कि यह बेहतर क्यों है। यह क्यों काम करता है सहज है। क्यों उपयोगी है यह नहीं है।
सिरदर्द

इस लेखक इसके साथ एक बहुत अच्छा काम करता है michaelnielsen.org/ddi/why-bloom-filters-work-the-way-they-do
dranxo

2
@dranxo, लिंक किया गया लेख jasondavies.com/bloomfilter बेहतर है।
पचेरियर

जवाबों:


155

से विकिपीडिया :

ब्लूम फ़िल्टर में सेट का प्रतिनिधित्व करने के लिए अन्य डेटा संरचनाओं पर एक मजबूत स्थान लाभ होता है, जैसे कि स्व-संतुलन बाइनरी सर्च ट्री, कोशिश, हैश टेबल, या सरल सरणियों या प्रविष्टियों की लिंक्ड सूची। इनमें से अधिकांश को कम से कम डेटा आइटमों को स्वयं संग्रहीत करने की आवश्यकता होती है, जिन्हें बिट्स की एक छोटी संख्या से कहीं भी आवश्यकता हो सकती है, छोटे पूर्णांकों के लिए, बिट्स की एक मनमानी संख्या के लिए, जैसे स्ट्रिंग्स के लिए (प्रयास एक अपवाद हैं, क्योंकि वे भंडारण को साझा कर सकते हैं। समान उपसर्ग वाले तत्व)। लिंक की गई संरचनाएं संकेत के लिए एक अतिरिक्त रैखिक स्थान को ऊपर उठाती हैं। 1% त्रुटि के साथ एक ब्लूम फ़िल्टर और दूसरी ओर कश्मीर का एक इष्टतम मूल्य, तत्वों के आकार की परवाह किए बिना - प्रति तत्व लगभग 9.6 बिट्स की आवश्यकता होती है। यह लाभ आंशिक रूप से, कॉम्पैक्ट से विरासत में मिला, और आंशिक रूप से इसकी संभावनावादी प्रकृति से। यदि 1% झूठी सकारात्मक दर बहुत अधिक लगती है, तो हर बार हम 4.8 बिट प्रति तत्व जोड़ते हैं जो हम इसे दस गुना घटाते हैं।

मेरे लिए बहुत स्पष्ट है।

एक ब्लूम फ़िल्टर स्वयं तत्वों को संग्रहीत नहीं करता है, यह महत्वपूर्ण बिंदु है। यदि आप एक तत्व मौजूद हैं, तो आप परीक्षण करने के लिए एक ब्लूम फ़िल्टर का उपयोग नहीं करते हैं, आप यह परीक्षण करने के लिए उपयोग करते हैं कि क्या यह निश्चित रूप से मौजूद नहीं है , क्योंकि यह कोई गलत विवरण की गारंटी नहीं देता है। यह आपको उन तत्वों के लिए अतिरिक्त काम नहीं करने देता है जो एक सेट में मौजूद नहीं हैं (जैसे कि डिस्क आईओ उन्हें देखने के लिए)।

और हैश टेबल की तरह कुछ की तुलना में काफी कम जगह में (जो बड़े डेटा सेट के लिए डिस्क पर आंशिक रूप से होने जा रहा है)। यद्यपि आप एक हैश टेबल जैसी संरचना के साथ एक खिलने वाले फिल्टर का उपयोग कर सकते हैं , एक बार जब आप निश्चित हो जाते हैं कि तत्व मौजूद होने का एक मौका है।

इसलिए एक उदाहरण उपयोग पैटर्न हो सकता है:

आपको डिस्क पर बहुत अधिक डेटा मिला है - आप यह तय करते हैं कि आप किस त्रुटि के लिए बाध्य हैं (उदाहरण के लिए 1%), जो मी के मूल्य को निर्धारित करता है । तब इष्टतम k निर्धारित किया जाता है (लेख में दिए गए सूत्र से)। आप एक बार इस डिस्क-बाउंड डेटा से अपने फ़िल्टर को पॉप्युलेट करते हैं।

अब आपके पास RAM में फ़िल्टर है। जब आपको कुछ तत्व को संसाधित करने की आवश्यकता होती है, तो आप अपने फ़िल्टर को यह देखने के लिए क्वेरी करते हैं कि क्या यह आपके डेटा सेट में मौजूदा का एक मौका है। यदि ऐसा नहीं होता है, तो कोई अतिरिक्त काम नहीं किया जाता है। कोई डिस्क नहीं पढ़ता है, आदि (जो आपको करना होगा अगर यह एक हैश या पेड़, आदि)।

अन्यथा, यदि फ़िल्टर "हां, यह वहां है" कहता है, तो 1% संभावना है कि यह गलत है, इसलिए आप यह पता लगाने के लिए आवश्यक कार्य करते हैं। समय के 99%, यह वास्तव में होगा वहाँ हो, तो काम शून्य के लिए नहीं था।


2
यदि यह स्पष्ट है, तो कृपया जवाब दें। यह एक ही आकार के सेट पर एकल हैश फ़ंक्शन की तुलना में संभवतः अधिक स्थान कुशल कैसे हो सकता है? यह बस अधिक टकराव पैदा करेगा। आप यह सुनिश्चित करने के लिए अलग-अलग हैश कार्यों पर खोज करेंगे कि आपके पास सभी हैश फ़ंक्शन में 1 है। मुझे समझ में नहीं आता कि यह एक हैश फ़ंक्शन का उपयोग करने से अधिक लाभ है।
सिरदर्द

19
एक हैश फ़ंक्शन कोड है, डेटा नहीं। हैश फ़ंक्शन का उपयोग करने का आपका क्या इरादा है? एक हैश टेबल? उस स्थिति में, आपकी तालिका को कुंजियों को संग्रहीत करने की आवश्यकता होगी, जो कि एक खिलने वाले फिल्टर के विपरीत, मनमाने आकार का हो सकता है। अंश ने इसका उल्लेख किया है।
एलेक्स बुडोव्स्की

3
कश्मीर के बजाय केवल एक हैश फ़ंक्शन के साथ एक ब्लूम फ़िल्टर पर विचार करें। अधिक हैश कार्यों को जोड़ने के लिए क्या लाभ है? यह बस अधिक टकराव पैदा करेगा। या मैं गलत हूँ?
सिरदर्द

2
इसका उत्तर विकिपीडिया लेख में "स्पेस एंड टाइम बेनिफिट्स" और "गलत सकारात्मकता की संभावना" खंड में अंतिम पैराग्राफ द्वारा दिया गया है।
एलेक्स बुडोव्स्की

4
यह बस क्लिक किया। बहुत बहुत धन्यवाद, इसने मुझे कुछ समय के लिए रोक दिया है। यह झूठी सकारात्मक की संख्या को कम करता है क्योंकि एक झूठे सकारात्मक को या तो एक की आवश्यकता होगी) आपके सभी हैश कार्यों पर टकराव होगा या ख) सभी रिक्त स्थान अन्य मानों द्वारा भरे गए हैं। आकार का चयन करना एक मुश्किल प्रक्रिया होनी चाहिए, फिर मुझे लगता है। अगर मैं गलत हूं तो मुझे सुधारो, लेकिन मुझे लगता है कि मैं इसे प्राप्त करता हूं। सभी का धन्यवाद।
सिरदर्द

156

एलेक्स ने इसे बहुत अच्छी तरह से समझाया है। उन लोगों के लिए जिन्हें अभी भी इस पर बहुत कुछ नहीं मिला है, उम्मीद है कि यह उदाहरण आपको समझने में मदद करेगा:

कहते हैं कि मैं Google के लिए, Chrome टीम में काम करता हूं, और मैं उस ब्राउज़र में एक सुविधा जोड़ना चाहता हूं जो उपयोगकर्ता को सूचित करता है कि उसने जो यूआरएल दर्ज किया है वह दुर्भावनापूर्ण URL है। इसलिए मेरे पास लगभग 1 मिलियन दुर्भावनापूर्ण URL का डेटासेट है, इस फ़ाइल का आकार 25MB के आसपास है। चूंकि आकार काफी बड़ा है, (ब्राउज़र के आकार की तुलना में बड़ा), मैं इस डेटा को एक दूरस्थ सर्वर पर संग्रहीत करता हूं।

केस 1: मैं हैश तालिका के साथ हैश फ़ंक्शन का उपयोग करता हूं। मैं एक कुशल हैशिंग फ़ंक्शन पर निर्णय लेता हूं, और हैश कीज़ प्राप्त करने के लिए हैशिंग फ़ंक्शन के माध्यम से सभी 1 मिलियन यूआरएल चलाते हैं। मैं तब एक हैश तालिका (एक सरणी) बनाता हूं, जहां हैश कुंजी मुझे उस URL को रखने के लिए अनुक्रमणिका देगी। इसलिए अब एक बार जब मैंने हैशिंग टेबल को भर दिया है, तो मैं उसका आकार जांचता हूं। मैंने सभी 1 मिलियन URL को हैश तालिका में उनकी कुंजी के साथ संग्रहीत किया है। तो आकार कम से कम 25 एमबी है। यह हैश तालिका, इसके आकार के कारण एक दूरस्थ सर्वर पर संग्रहीत किया जाएगा। जब कोई उपयोगकर्ता साथ आता है और एड्रेस बार में एक URL दर्ज करता है, तो मुझे यह जांचना होगा कि क्या यह दुर्भावनापूर्ण है। इस प्रकार मैं URL को हैश फ़ंक्शन के माध्यम से चलाता हूं (ब्राउज़र स्वयं ऐसा कर सकता है) और मुझे उस URL के लिए एक हैश कुंजी मिलती है। मुझे अब उस हैश कुंजी के साथ अपने रिमोट सर्वर के लिए एक अनुरोध करना होगा, यह जांचने के लिए कि क्या उस विशेष कुंजी के साथ मेरी हैश तालिका में विशेष URL है, वही है जो उपयोगकर्ता ने दर्ज किया है। यदि हाँ तो यह दुर्भावनापूर्ण है और यदि नहीं तो यह दुर्भावनापूर्ण नहीं है। इस प्रकार हर बार जब उपयोगकर्ता किसी URL में प्रवेश करता है, तो यह देखने के लिए दूरस्थ सर्वर से अनुरोध किया जाता है कि यह दुर्भावनापूर्ण URL है या नहीं। इसमें बहुत समय लगेगा और इस तरह मेरे ब्राउज़र को धीमा कर देगा।

केस 2: मैं एक ब्लूम फ़िल्टर का उपयोग करता हूं। 1 मिलियन URL की पूरी सूची को कई हैश फ़ंक्शंस का उपयोग करके ब्लूम फ़िल्टर के माध्यम से चलाया जाता है और संबंधित पदों को 0 के एक विशाल सरणी में 1 के रूप में चिह्नित किया जाता है। मान लें कि हम ब्लॉम फिल्टर कैलकुलेटर ( http://hur.st/bloomfilter?n=1000000&p=0.01) का उपयोग करके 1% की झूठी सकारात्मक दर चाहते हैं), हम केवल 1.13 एमबी के रूप में आवश्यक ब्लूम फ़िल्टर का आकार प्राप्त करते हैं। इस छोटे आकार की अपेक्षा की जाती है, भले ही सरणी का आकार बहुत बड़ा हो, हम केवल 1s या 0s का भंडारण कर रहे हैं और हैश तालिका के मामले में URL के रूप में नहीं। इस सरणी को थोड़ा सरणी के रूप में माना जा सकता है। यही है, क्योंकि हमारे पास केवल दो मान 1 और 0 हैं, हम बाइट्स के बजाय व्यक्तिगत बिट्स सेट कर सकते हैं। इससे 8 बार लिया गया स्थान कम हो जाएगा। अपने छोटे आकार के कारण यह 1.13 एमबी ब्लूम फ़िल्टर, वेब ब्राउज़र में ही संग्रहीत किया जा सकता है !! इस प्रकार जब कोई उपयोगकर्ता किसी URL के साथ आता है और प्रवेश करता है, तो हम केवल आवश्यक हैश फ़ंक्शंस (ब्राउज़र में ही) लागू करते हैं, और ब्लूम फ़िल्टर (जो ब्राउज़र में संग्रहीत होता है) के सभी पदों की जाँच करते हैं। किसी भी स्थिति में 0 का मान हमें बताता है कि यह URL दुर्भावनापूर्ण URL की सूची में मौजूद नहीं है और उपयोगकर्ता स्वतंत्र रूप से आगे बढ़ सकता है। इस प्रकार हमने सर्वर पर कॉल नहीं किया और इसलिए समय की बचत हुई। 1 का एक मान बताता है कि URL MIGHT दुर्भावनापूर्ण URL की सूची में है। इन मामलों में हम रिमोट सर्वर पर कॉल करते हैं और वहाँ पर हम कुछ हैश तालिका के साथ कुछ अन्य हैश फ़ंक्शन का उपयोग कर सकते हैं क्योंकि URL वास्तव में मौजूद है या नहीं, इसे पुनः प्राप्त करने और जांचने के लिए पहले मामले में। चूंकि अधिकांश समय, URL के दुर्भावनापूर्ण होने की संभावना नहीं होती है, ब्राउज़र के आंकड़ों में छोटा ब्लूम फ़िल्टर बाहर निकलता है और इसलिए दूरस्थ सर्वर पर कॉल से बचकर समय बचाता है। केवल कुछ मामलों में, यदि ब्लूम फ़िल्टर हमें बताता है कि URL MIGHT दुर्भावनापूर्ण है, केवल उन मामलों में हम सर्वर पर कॉल करते हैं। वह That MIGHT ’99% सही है। इन मामलों में हम रिमोट सर्वर पर कॉल करते हैं और वहाँ पर हम कुछ हैश तालिका के साथ कुछ अन्य हैश फ़ंक्शन का उपयोग कर सकते हैं क्योंकि URL वास्तव में मौजूद है या नहीं, इसे पुनः प्राप्त करने और जांचने के लिए पहले मामले में। चूंकि अधिकांश समय, URL के दुर्भावनापूर्ण होने की संभावना नहीं होती है, ब्राउज़र के आंकड़ों में छोटा ब्लूम फ़िल्टर बाहर निकलता है और इसलिए दूरस्थ सर्वर पर कॉल से बचकर समय बचाता है। केवल कुछ मामलों में, यदि ब्लूम फ़िल्टर हमें बताता है कि URL MIGHT दुर्भावनापूर्ण है, केवल उन मामलों में हम सर्वर पर कॉल करते हैं। वह That MIGHT ’99% सही है। इन मामलों में हम रिमोट सर्वर पर कॉल करते हैं और वहाँ पर हम कुछ हैश तालिका के साथ कुछ अन्य हैश फ़ंक्शन का उपयोग कर सकते हैं क्योंकि URL वास्तव में मौजूद है या नहीं, इसे पुनः प्राप्त करने और जांचने के लिए पहले मामले में। चूंकि अधिकांश समय, URL के दुर्भावनापूर्ण होने की संभावना नहीं होती है, ब्राउज़र के आंकड़ों में छोटा ब्लूम फ़िल्टर बाहर निकलता है और इसलिए दूरस्थ सर्वर पर कॉल से बचकर समय बचाता है। केवल कुछ मामलों में, यदि ब्लूम फ़िल्टर हमें बताता है कि URL MIGHT दुर्भावनापूर्ण है, केवल उन मामलों में हम सर्वर पर कॉल करते हैं। वह That MIGHT ’99% सही है। ब्राउज़र में छोटे ब्लॉम फिल्टर जो बाहर निकलते हैं और इसलिए रिमोट सर्वर पर कॉल से बचकर समय की बचत करते हैं। केवल कुछ मामलों में, यदि ब्लूम फ़िल्टर हमें बताता है कि URL MIGHT दुर्भावनापूर्ण है, केवल उन मामलों में हम सर्वर पर कॉल करते हैं। वह That MIGHT ’99% सही है। ब्राउज़र में छोटे ब्लॉम फिल्टर जो बाहर निकलते हैं और इसलिए रिमोट सर्वर पर कॉल से बचकर समय की बचत करते हैं। केवल कुछ मामलों में, यदि ब्लूम फ़िल्टर हमें बताता है कि URL MIGHT दुर्भावनापूर्ण है, केवल उन मामलों में हम सर्वर पर कॉल करते हैं। वह That MIGHT ’99% सही है।

इसलिए ब्राउज़र में एक छोटे से ब्लम फ़िल्टर का उपयोग करके, हमने बहुत समय बचाया है क्योंकि हमें दर्ज किए गए प्रत्येक URL के लिए सर्वर कॉल करने की आवश्यकता नहीं है।

हम देख सकते हैं कि एक हैश फ़ंक्शन के साथ हैश टेबल का उपयोग एक अलग उद्देश्य के लिए किया जाता है, जो कि एक ब्लूम फ़िल्टर से अलग होता है। उम्मीद है कि यह आपके संदेह को साफ करता है :)

संपादित करें :

मैंने पायथन में दुर्भावनापूर्ण URL परीक्षण के कार्य के लिए एक ब्लूम फ़िल्टर लागू किया है। कोड यहां पाया जा सकता है - https://github.com/tarunsharma1/Bloom-Filter कोड समझने में बहुत सरल है और रीडमी फ़ाइल में एक विस्तृत विवरण प्रदान किया गया है।


3
उपयोग की स्थिति के लिए धन्यवाद।
स्क्विग्स।

1
मुझे हैशिंग का हिस्सा नहीं मिला और 0 या 1. के मान को जोड़ रहा है। यदि हम किसी ऐरे का उपयोग कर रहे हैं, और उन में 0 और 1 स्टोर कर रहे हैं, तो हम परीक्षण करते समय url के हैश मान को कैसे देखते हैं। ?
divinedragon

1
इसलिए मूल रूप से हम हैश फ़ंक्शन नामक किसी चीज़ का उपयोग करते हैं..जो URL में स्ट्रिंग के रूप में लेता है..और एक नंबर देता है..हम इस नंबर का उपयोग करते हैं और संबंधित सरणी इंडेक्स मान को 1 पर सेट करते हैं। विभिन्न हैशिंग फ़ंक्शन का एक नंबर मौजूद है, लेकिन जो महत्वपूर्ण है वह यह है कि हर बार एक ही यूआरएल को हैशिंग फंक्शन से गुजारा जाता है, उसे एक ही नंबर जेनरेट करना होता है। एक हैशिंग फ़ंक्शन का एक उदाहरण एक URL में सभी वर्णों के एससीआई मूल्यों को जोड़ने के लिए हो सकता है। ब्लूम फ़िल्टर में हम कई हैशिंग फ़ंक्शंस का उपयोग करते हैं और उन सभी ऐरे इंडेक्स मानों को 1 पर सेट करते हैं। आशा है कि इससे आपका संदेह साफ़ हो जाएगा।
तरुण

1
एक पारंपरिक हैशटेबल जैसे C # HashSet<String>16-बाइट्स प्रति तत्व तत्व का उपयोग करेगा सबसे अच्छी स्थिति में जिसमें हैशटेबल पूरी तरह से भरा हुआ है: एक एंट्री टेबल में एक एंट्री टेबल में एक "बकेट" से 4 बाइट्स मैप (एक सरणी-पैक सिंगली-लिंक्ड) सूची), कैश्ड हैशकोड के लिए 4 बाइट, "नेक्स्ट" पॉइंटर के लिए 4 बाइट, कुंजी के लिए पॉइंटर के लिए 4 बाइट। और यह स्ट्रिंग के आकार की गिनती नहीं है। सबसे खराब स्थिति में यह 40 बाइट्स होता है: Stringपॉइंटर 64 अप्रयुक्त और 64-बिट आर्किटेक्चर के लिए 8 बाइट्स तक फैलने पर प्रति प्रविष्टि 20 बाइट्स ।
क्वर्टी

आपको हैश सेट में स्ट्रिंग को बचाने की आवश्यकता नहीं है। आप इसके हैश को मान के रूप में सहेज सकते हैं, जिससे हैशसेट बहुत छोटा हो जाता है। तब आप हैश आकार के साथ खेल सकते हैं - यह जितना बड़ा होगा, उतनी ही छोटी झूठी सकारात्मक दर होगी।
user1028741

24

मैं इस बात के स्पष्टीकरण के साथ शुरू करूंगा कि एक ब्लूम फ़िल्टर क्या है, यह क्या कर सकता है और नहीं कर सकता है, हमें इसकी आवश्यकता क्यों है, एक सहज विवरण दिखाएं कि यह कैसे काम करता है और फिर कुछ उदाहरण दें जब वे उपयोगी हो सकते हैं।

तो एक मानक खिलने फिल्टर एक है संभावित डेटा संरचना है कि कर सकते हैं * :


  • एक सेट में तत्व जोड़ें
  • जाँच करें कि कोई तत्व सेट में है definitely not in the setया कहकरpossibly in the set

यही possibly in the setकारण है कि इसे संभाव्य कहा जाता है। स्मार्ट शब्दों का उपयोग करने का अर्थ है कि झूठे सकारात्मक संभव हैं (ऐसे मामले हो सकते हैं जहां यह गलत तरीके से सोचता है कि तत्व सकारात्मक है) लेकिन गलत नकारात्मक असंभव है।

लेकिन यह नहीं हो सकता : *

  • सेट से कोई आइटम निकालें
  • आपको उन सभी तत्वों की सूची दें जो वर्तमान में आपके सेट पर हैं

* कैन / सेट का यह सेट एक बुनियादी ब्लॉम फिल्टर के लिए है। क्योंकि यह एक उपयोगी डेटा संरचना है जो बहुत समय पहले बनाई गई थी, लोगों ने पाया कि इसे अन्य उपयोगी सुविधाओं के साथ कैसे बढ़ाया जाए ।


लेकिन एक मिनट प्रतीक्षा करें: हम पहले से ही एक डेटा संरचना को जानते हैं जो बिना अस्पष्ट के सभी का उत्तर दे सकती है 'संभव' और सभी सीमाओं के बिना (सभी को हटा नहीं सकता है, सभी को नहीं दिखा सकता है)। और इसे एक सेट कहा जाता है । और यहाँ एक ब्लूम फ़िल्टर का मुख्य लाभ आता है: यह अंतरिक्ष कुशल और अंतरिक्ष स्थिर है

इसका मतलब यह है कि इससे कोई फर्क नहीं पड़ता कि हम कितने तत्वों को स्टोर करते हैं, अंतरिक्ष समान होगा। हाँ, 10^6तत्वों के साथ एक ब्लूम फ़िल्टर (बेकार ब्लूम फ़िल्टर) 10^20तत्वों के साथ एक ब्लूम फ़िल्टर के रूप में एक ही स्थान लेगा और तत्वों के साथ ब्लूम फ़िल्टर के रूप में एक ही स्थान होगा 0। तो इसमें कितना स्थान लगेगा? यह तय करना आपके ऊपर है (लेकिन इसका एक व्यापार है: जितने अधिक तत्व आपके पास हैं उतने अधिक अनिश्चित आप possible in the setजवाब देने के लिए हैं।

एक और अच्छी बात यह है कि यह अंतरिक्ष स्थिर है। जब आप डेटा को एक सेट में सहेजते हैं, तो आपको वास्तव में इस डेटा को सहेजना होगा। इसलिए यदि आप स्टोर this long string in the setकरते हैं तो आपको कम से कम 27 बाइट्स स्पेस का उपयोग करना होगा। लेकिन 1% त्रुटि और k ** के एक इष्टतम मूल्य के लिए , आपको किसी भी तत्व के प्रति ~ 9.6 बिट्स (<2 बाइट्स) की आवश्यकता होगी (चाहे वह संक्षिप्त इंट या पाठ की विशाल दीवार हो)।

एक और संपत्ति यह है कि सभी ऑपरेशन निरंतर समय ले रहे हैं, जो सेट के मामले में बिल्कुल स्थिर समय के समान नहीं है (याद रखें कि यदि सेट में टकराव होता है, तो यह O(n)समय में बिगड़ सकता है )।

** k ब्लॉम फिल्टर में उपयोग किए जाने वाले हैश फ़ंक्शन का एक मूल्य है


मैं यह वर्णन नहीं करूँगा कि ब्लूम फ़िल्टर कैसे काम करता है (विकिपीडिया लेख सब कुछ समझाते हुए बहुत अच्छा काम करता है)। यहां मैं मूल रूप से मूल बातें बताऊंगा।

  • आप लंबाई की एक खाली बिट सरणी आरंभ करते हैं m
  • आप kअलग-अलग हैश फ़ंक्शंस का चयन करते हैं (जितना अधिक स्वतंत्र उतना बेहतर)
  • यदि आप तत्व जोड़ना चाहते हैं, तो आप kइस मान के सभी हैश की गणना करते हैं और संबंधित बिट्स को 1 पर सेट करते हैं
  • यदि आप जांचना चाहते हैं कि क्या तत्व मौजूद है, तो आप सभी kहैश की गणना करते हैं और यदि उनमें से कम से कम एक सेट नहीं है, तो यह निश्चित रूप से सेट में नहीं है। अन्यथा यह सेट में हो सकता है।

यहां तक ​​कि यह विवरण यह समझने के लिए पर्याप्त है कि हम क्यों सुनिश्चित नहीं हो सकते हैं (आप सभी बिट्स को अन्य विभिन्न मूल्यों से सेट कर सकते हैं)। यहाँ बहुत अच्छा दृश्य है कि यह कैसे काम करता है

यहां छवि विवरण दर्ज करें


तो खिलने वाले फ़िल्टर कब उपयोगी हो सकते हैं? संक्षिप्त उत्तर हर जगह है जहां झूठे सकारात्मक स्वीकार्य हैं और जहां आप जांचना चाहते हैं कि क्या कुछ सेट में है , लेकिन भले ही वे नहीं हैं, यह सत्यापित करने के लिए महंगी कॉल को बाहर करने के लिए रक्षा की पहली पंक्ति हो सकती है।

यहाँ और अधिक ठोस विवरणों की एक सूची दी गई है:

  • दुर्भावनापूर्ण वेबसाइटों और ब्राउज़र का एक मानक उदाहरण लगभग किसी भी स्थान पर वर्णित किया गया है, जहां लोग ब्लूम फ़िल्टर के बारे में बात करते हैं
  • एक पासवर्ड कमजोर है: सभी संभावित कमजोर पासवर्डों का एक बड़ा सेट होने के बजाय, आप बस यह जांच सकते हैं कि क्या पासवर्ड निश्चित रूप से एक छोटे ब्लॉम फिल्टर के साथ कमजोर नहीं है
  • यदि आपके पास लेखों की सूची और उपयोगकर्ताओं की सूची है, तो आप उन उपयोगकर्ताओं के लेख दिखाने के लिए ब्लूम फ़िल्टर का उपयोग कर सकते हैं जो उन्होंने नहीं पढ़े हैं। दिलचस्प बात यह है कि आपके पास केवल एक फ़िल्टर हो सकता है (आप जांचते हैं कि क्या user_id + article_id का संयोजन है)
  • बिटकॉइन वॉलेट सिंक्रोनाइज़ेशन के लिए ब्लूम फ़िल्टर का उपयोग करता है
  • अकामाई के वेब सर्वर "एक-हिट-चमत्कार" को अपने डिस्क कैश में संग्रहीत करने से रोकने के लिए ब्लूम फिल्टर का उपयोग करते हैं। एक हिट-अजूबे उपयोगकर्ताओं द्वारा केवल एक बार अनुरोध की जाने वाली वेब वस्तुएं हैं, जो कि अकामाई ने अपने कोचिंग बुनियादी ढांचे के लगभग तीन-चौथाई पर लागू पाया। किसी वेब ऑब्जेक्ट के लिए दूसरे अनुरोध का पता लगाने के लिए ब्लूम फ़िल्टर का उपयोग करना और उस ऑब्जेक्ट को केवल उसके दूसरे अनुरोध पर डिस्क-कैश में प्रवेश करने से एक-हिट चमत्कार को रोकता है, डिस्क वर्कलोड को काफी कम करता है और डिस्क कैश हिट दरों को बढ़ाता है (ब्लूम के फिल्टर में उदाहरणों से लिया गया) विकि पर लेख)

13

ब्लूम फिल्टर जैव सूचना विज्ञान में काफी उपयोगी हैं। एक नियमित हैश का उपयोग करने की तुलना में वे अधिक स्थान कुशल हो सकते हैं, खासकर जब आप जिस स्ट्रिंग्स के साथ काम कर रहे हैं उसका आकार एक बहुत छोटे वर्णमाला के साथ सैकड़ों अक्षर हो सकते हैं अर्थात {ए, जी, टी, सी}। उनका उपयोग आमतौर पर यह आकलन करने के लिए किया जाता है कि एक निश्चित k-mer मौजूद है या एक जीनोम में अनुपस्थिति है। यहाँ कुछ प्रासंगिक के लिए इस्तेमाल किया गया एक उदाहरण है

संपादित करें:

झूठी सकारात्मकता को कम करने के लिए कई हैश फ़ंक्शन का उपयोग किया जाता है। आशा है कि के-हैश कार्यों के बीच प्रत्येक मूल्य में हर दूसरे संभावित मूल्य की तुलना में बिट-सरणी में एक अद्वितीय हस्ताक्षर होगा। हालाँकि, झूठी सकारात्मकता मौजूद है, लेकिन उन्हें एक प्रबंधनीय स्तर तक कम से कम किया जा सकता है। इस तकनीक का उपयोग करके आपके पास स्वतंत्र रूप से उनके आकार के तत्व हैं । जब आप उन्हें खोजते हैं, तो आप प्रत्येक हैश फ़ंक्शन का उपयोग करते हैं और यह सुनिश्चित करने के लिए जांचते हैं कि उनके बिट-मान सभी 1 हैं।

इसकी तुलना मानव जीनोम से करें, जहां तत्व के आकार में वृद्धि से हैश टेबल का आकार काफी बढ़ जाता है (टेबल का आकार 4 * 4 k ) है। यह मान रहा है कि आप 2 बिट्स / अक्षर का उपयोग करते हुए तत्वों को एनकोड करेंगे।


1
क्षमा करें, हो सकता है कि मुझे गलतफहमी हो, लेकिन एक नियमित हैश की तुलना में वे अधिक स्थान कुशल कैसे हो सकते हैं? एक स्ट्रिंग का हैश निश्चित लंबाई आउटपुट है, और आप बस उस मान को 0 या 1 पर सेट करते हैं। यह भी है कि ब्लूम फ़िल्टर क्या करेगा, लेकिन ब्लूम फ़िल्टर कई हैश फ़ंक्शन पर करेगा । मैं कहाँ गलत समझ रहा हूँ?
सिरदर्द

यह सिर्फ एक हैश को स्टोर करने के लिए ज्यादा उपयोग नहीं है। तब यह हैश टकराव से निपटने का कोई तरीका नहीं होगा। अधिकांश हैश टेबल के कार्यान्वयन में इससे निपटने का एक तरीका है जो ओवरहेड को उकसाता है। उदाहरण के लिए पायथन डिक्शनरी हैश के साथ कुंजी जमा करते हैं और टकराव पर रैखिक रूप से जांच शुरू करते हैं। ब्लूम फ़िल्टर कट आउट करता है और कई हैश का उपयोग करके होने वाले नुकसान को कम करने की कोशिश करता है।
ब्रेट फोंटचियो

1
क्यों न एक ब्लॉम फ़िल्टर बनाया जाए, लेकिन सिर्फ एक हैश फ़ंक्शन के साथ? शायद "अपेक्षाकृत बड़ा" हैश फ़ंक्शन। लेकिन कई के बजाय एक
giorgim

7

यदि ब्लूम फ़िल्टर देता है कि आइटम सेट का सदस्य है, तो झूठे सकारात्मक के लिए एक निश्चित संभावना है। यदि सेट में सदस्यता को इंगित करने के लिए केवल एक हैश फ़ंक्शन का उपयोग किया गया था, तो एक गलत पॉज़िटिव की संभावना कई हैश फ़ंक्शन का उपयोग करने से अधिक होगी।


उत्तर के मांस पर कुछ गंभीर विस्तार की आवश्यकता है: " एक झूठे सकारात्मक की संभावना कई हैश फ़ंक्शन का उपयोग करने से अधिक होगी " ...
पेसियर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.