क्या कोई एंटी-ब्लूम फ़िल्टर है?


25

एक ब्लूम फ़िल्टर कुशलता से यह सुनिश्चित करने के लिए संभव बनाता है कि प्रसंस्करण के दौरान पहले से ही विभिन्न मूल्यों का सामना किया गया है या नहीं। जब कई डेटा आइटम होते हैं तो ब्लूम फ़िल्टर के परिणामस्वरूप हैश टेबल पर एक महत्वपूर्ण मेमोरी सेविंग हो सकती है। ब्लूम फ़िल्टर की मुख्य विशेषता, जिसे वह हैश टेबल के साथ साझा करता है, यह है कि यह हमेशा "नया नहीं" कहता है यदि कोई आइटम नया नहीं है, लेकिन एक गैर-शून्य संभावना है कि एक आइटम को "नया नहीं" के रूप में चिह्नित किया जाएगा “तब भी जब यह नया है।

क्या एक "एंटी-ब्लूम फ़िल्टर" है, जिसका विपरीत व्यवहार है?

दूसरे शब्दों में: क्या एक कुशल डेटा संरचना है जो "नया" कहती है यदि कोई आइटम नया है, लेकिन जो कुछ वस्तुओं के लिए "नया" भी कह सकता है जो कि नया नहीं है?

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


जो लोग अधिक औपचारिक उपचार पसंद करते हैं, उनके लिए लिखें b(x)=1यदि ब्लूम फ़िल्टर सोचता है कि x नया है, b(x)=0 अन्यथा, और लिखिए n(x)=1यदि x वास्तव में नया है और n(x)=0 अन्यथा।

फिर Pr[b(x)=0|n(x)=0]=1 ; Pr[b(x)=0|n(x)=1]=α ; Pr[b(x)=1|n(x)=0]=0; Pr[b(x)=1|n(x)=1]=1α , कुछ 0<α<1

मैं पूछ रहा हूँ: करता है एक कुशल डेटा संरचना अस्तित्व, को लागू करने के लिए एक समारोह b के साथ कुछ 0<β<1 , ऐसी है कि Pr[b(x)=0|n(x)=0]=β ; Pr[b(x)=0|n(x)=1]=0 ; Pr[b(x)=1|n(x)=0]=1β ; Pr[b(x)=1|n(x)=1]=1 ?


संपादित करें: ऐसा लगता है कि इस सवाल को StackExchange पर पहले पूछा गया है, जैसा कि /programming/635728 और /cstheory/6596 के जवाब में "नहीं हो सकता" "के माध्यम से" किया जा सकता है, कुछ कीमत पर "से" यह करने के लिए तुच्छ है, के मूल्यों को उल्टा करके b"। यह मेरे लिए अभी तक स्पष्ट नहीं है कि "सही" उत्तर क्या है। क्या है स्पष्ट है कि किसी प्रकार की एक LRU कैशिंग योजना (Ilmari कारोनेन ने सुझाव दिया एक तरह के रूप में) के बजाय अच्छी तरह से काम करता है, आसान लागू करने के लिए है, और समय मेरे कोड को चलाने के लिए ले जाया में 50% की कमी हुई।


किसी कारण से, मुझे यह कहने के लिए लुभाया जाता है कि यह उस समस्या के समान है जिसे कैश और कैश प्लेसमेंट एल्गोरिदम हल करने का प्रयास करते हैं। कम-अक्सर-उपयोग किए जाने वाले (LFU) प्रतिस्थापन का उपयोग करके कैश पर विचार करें। एक सैद्धांतिक रूप से इष्टतम लेकिन असंभव प्रतिस्थापन एल्गोरिदम एक को बेदखल करना होगा जिसे आप फिर से सबसे लंबे समय तक नहीं देखेंगे, जैसे कि कैश के लिए। मुझे लगता है कि कैशिंग वितरण की प्रकृति के बारे में कुछ मान्यताओं पर निर्भर करता है जो आमतौर पर नहीं हो सकता है, लेकिन यह विचार करने योग्य है कि क्या यह लागू होता है।
पैट्रिक87

आप निम्न बात में रुचि हो सकती: satisfiability आधारित सेट सदस्यता फिल्टर
कावेह

@Kaveh: पॉइंटर के लिए धन्यवाद, देखेगा।
एंड्रेस सलामोन

जवाबों:


12

पैट्रिक87 के हैश विचार के साथ, यहां एक व्यावहारिक निर्माण है जो लगभग आपकी आवश्यकताओं को पूरा करता है - एक पुराने के लिए नए मूल्य को गलत तरीके से समझने की संभावना काफी शून्य नहीं है, लेकिन आसानी से लापरवाही से छोटा बनाया जा सकता है।

मापदंडों का चयन करें और k ; व्यावहारिक मूल्य, कह सकते हैं, n = 128 और k = 16 । बता दें कि H एक सुरक्षित क्रिप्टोग्राफिक हैश फंक्शन प्रोडक्शन (कम से कम) n + k बिट्स आउटपुट है।nkn=128k=16Hn+k

चलो की श्रृंखला होनी 2 कश्मीर एन -बिट bitstrings। यह सरणी फ़िल्टर की स्थिति को संग्रहीत करती है, कुल n 2 k बिट्स का उपयोग करते हुए । (यह विशेष रूप से कोई फर्क नहीं पड़ता कि इस सरणी को कैसे आरंभीकृत किया जाता है; हम इसे केवल शून्य, या यादृच्छिक बिट्स के साथ भर सकते हैं)a2k nn2k

  • xi k j n H ( x ) a i = jij=H(x)ikjnH(x)ai=j

  • यह जांचने के लिए कि क्या फ़िल्टर में कोई मान जोड़ा गया है, गणना करें , जैसा कि ऊपर दिया गया है, और जांचें कि क्या । यदि हाँ, तो सच लौटें; अन्यथा झूठे लौटते हैं।i xएक मैं ' = j 'ij=H(x)ai=j

दावा 1: झूठी सकारात्मक की संभावना (= नए मूल्य के बारे में झूठा दावा किया गया है कि देखा गया है) । यह को बढ़ाकर, भंडारण स्थान में मामूली लागत पर, मनमाने ढंग से छोटा किया जा सकता है ; विशेष रूप से, , यह संभावना अनिवार्य रूप से नगण्य है, व्यवहार में, एक हार्डवेयर खराबी के कारण झूठी सकारात्मक की संभावना से बहुत छोटा है। एन एन 1281/2n+knn128

विशेष रूप से, अलग-अलग मूल्यों की जाँच करने और फ़िल्टर में जोड़े जाने के बाद, कम से कम एक झूठी सकारात्मक होने की संभावना है । उदाहरण के लिए, और साथ, 50% प्रायिकता के साथ गलत सकारात्मक प्राप्त करने के लिए आवश्यक भिन्न मानों की संख्या लगभग ।( N 2 - N ) / 2 n + k + 1 n = 128 k = 16 2 ( n + k ) / 2 = 2 72N(N2N)/2n+k+1n=128k=162(n+k)/2=272

दावा 2: एक झूठी नकारात्मक की संभावना (= पहले जोड़ा गया मान गलत तरीके से नया होने का दावा किया गया) से अधिक नहीं है , जहां फ़िल्टर में जोड़े गए अलग-अलग मानों की संख्या है (या, विशेष रूप से, विशिष्ट मान की जांच के बाद जोड़े गए विभिन्न मानों की संख्या को हाल ही में फ़िल्टर में जोड़ा गया था)। एन1(12k)N1exp(N/2k)<N/2kN


Ps। "लापरवाही से छोटे" को परिप्रेक्ष्य में रखने के लिए, 128-बिट एन्क्रिप्शन आमतौर पर वर्तमान में ज्ञात तकनीक के साथ अटूट माना जाता है। साथ इस योजना से एक झूठी सकारात्मक प्राप्त करना संभव है, क्योंकि कोई व्यक्ति अपने पहले प्रयास में आपके गुप्त 128-बिट एन्क्रिप्शन कुंजी का सही अनुमान लगा रहा है । ( और , यह वास्तव में उससे लगभग 65,000 गुना कम संभावना है।)n = 128 k = 16n+k=128n=128k=16

लेकिन अगर वह अभी भी आपको तर्कहीन रूप से परेशान महसूस कर रहा है, तो आप हमेशा स्विच कर सकते हैं ; यह आपकी भंडारण आवश्यकताओं को दोगुना कर देगा, लेकिन मैं आपको किसी भी राशि को सुरक्षित रूप से दांव पर लगा सकता हूं जिसका आप नाम लेना चाहते हैं कि कोई भी कभी भी साथ गलत सकारात्मक नहीं देखेगा - यह मानते हुए कि हैश फ़ंक्शन टूटा नहीं है, वैसे भी।n = 256n=256n=256


1
न केवल हार्डवेयर की खराबी की संभावना को तुलनात्मक बनाया जा सकता है; पहली कोशिश में SSH लॉगिन के लिए आपकी RSA कुंजी का अनुमान लगाने वाले व्यक्ति की संभावना के साथ इसे तुलनीय भी बनाया जा सकता है । IMO आपके समाधान की व्यावहारिकता पूर्व की तुलना में अधिक बताता है।
आर ..

+1 बहुत अच्छा - मेरी समझ यह है कि यह अंतरिक्ष दक्षता की समस्या को हल करता है, जिससे कि वस्तु वास्तव में, नए "गलत नहीं" का जवाब देने की कुछ (बहुत छोटी) संभावना है। बहुत व्यावहारिक, और अच्छा विश्लेषण।
पैट्रिक87

1
दावा 1 केवल यह कह रहा है कि एक सभ्य हैश फ़ंक्शन में टकराव की कम संभावना है। यह व्यवहार में पहले से ही सच है अगर कम से कम 50 या ऐसा है। मेरे आवेदन के लिए, और एक सरल 64-बिट, गैर-क्रिप्टोग्राफिक रूप से सुरक्षित, लेकिन तेजी से काम करने वाले फ़ंक्शन के साथ शानदार काम करता है। n = 44 k = 20n+kn=44k=20
अंद्र दास सलामन

@ AndrásSalamon: यह सच है, हालांकि एक सुरक्षित क्रिप्टोग्राफिक हैश फ़ंक्शन वास्तव में थोड़ी मजबूत गारंटी प्रदान करता है: अर्थात्, यह टकराने वाले इनपुट को खोजने के लिए अव्यवहारिक है, भले ही आप जानबूझकर उनके लिए देखने की कोशिश करें। पर्याप्त रूप से बड़े (उदाहरण के लिए जैसा कि मैंने ऊपर सुझाव दिया है) के साथ, इसका मतलब है कि पूर्ण डेटा को संग्रहीत करना अनावश्यक है भले ही एक झूठी सकारात्मक की लागत अधिक हो और यहां तक ​​कि एक को खोजने के लिए सक्रिय विरोधी प्रयास भी हो सकते हैं। बेशक, अगर आपको बहुत मजबूत गारंटी की आवश्यकता नहीं है, तो कुछ हद तक अधिक टक्कर का जोखिम स्वीकार्य हो सकता है। n = 128nn=128
इल्मरी करोनन

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

8

नहीं, इन गुणों के साथ एक कुशल डेटा संरचना होना संभव नहीं है, यदि आप एक गारंटी चाहते हैं कि डेटा संरचना "नया" कहेगी यदि यह वास्तव में नया है (यह कभी नहीं होगा, तो कभी भी "नया नहीं" कहेंगे यदि यह वास्तव में नया है (कोई गलत नकारात्मक अनुमति नहीं है)। ऐसी किसी भी डेटा संरचना को "नया नहीं" का जवाब देने के लिए सभी डेटा रखने की आवश्यकता होगी। सटीक औचित्य के लिए cstheory पर pents90 का उत्तर देखें ।

इसके विपरीत, ब्लूम फिल्टर कर सकते हैं एक गारंटी नहीं है कि डेटा संरचना कहेंगे "कोई नई बात नहीं" अगर यह गैर नया है, एक कुशल तरीके से मिलता है। विशेष रूप से, ब्लूम फ़िल्टर डेटा के सभी को संग्रहीत करने की तुलना में अधिक कुशल हो सकता है: प्रत्येक व्यक्तिगत आइटम काफी लंबा हो सकता है, लेकिन ब्लूम फ़िल्टर का आकार आइटमों की संख्या के साथ होता है , उनकी कुल लंबाई नहीं। आपकी समस्या के लिए किसी भी डेटा संरचना को डेटा की कुल लंबाई के साथ स्केल करना होगा , न कि डेटा आइटम्स की संख्या।


स्वीकृत उत्तर भी देखें, क्योंकि प्रश्न में वही है
जो

-1 आपको संभवतः योग्य होना चाहिए जब आप कहते हैं कि यह संभव नहीं है। स्पष्ट रूप से इसे कुशलतापूर्वक करना संभव है, और इसे कम दर की त्रुटि के साथ करना भी संभव है, इसलिए किसी दिए गए कार्यान्वयन में कुछ संतुलन संभव होना चाहिए ... विशेष रूप से, यह वास्तव में यह समझाने के लिए उपयोगी होगा कि इसका क्या मतलब है "सभी डेटा कभी भी", क्योंकि यह प्रश्न के प्रश्न को पूरा करने के लिए कड़ाई से आवश्यक नहीं है। गलत नकारात्मक - जवाब "नया" जब जवाब "नया नहीं" होना चाहिए - यहां अनुमति दी जाती है, इसलिए सभी डेटा को रखने की आवश्यकता नहीं है।
पैट्रिक87

1
यह उत्तर पूरी तरह से उचित है, और मेरे प्रश्न के पत्र को संबोधित करता है, लेकिन शायद आत्मा नहीं।
एंड्रस सलामोन

@DW उत्तर को अपडेट करने के लिए समय निकालने के लिए धन्यवाद। मैं इसे अब एक उत्तर के रूप में छोड़ने के लिए इच्छुक हूं, हालांकि एंटी-ब्लूम फ़िल्टर की अक्षमता का वर्णन करते समय उपयोग की जाने वाली भाषा पर मुझे अभी भी आपत्ति है, यह सोचने के अलावा कि "विवरण" संदर्भित पर थोड़ा और विस्तृत करना सबसे अच्छा होगा। .. अभी के लिए -1 छोड़ रहे हैं। कुछ अप्रचलित टिप्पणियों को साफ किया।
पैट्रिक87

@DW "झूठे नकारात्मक" से, मैं "नया" जवाब देने का इरादा रखता हूं जब जवाब "नया नहीं" होना चाहिए। (कुछ हद तक जवाबी तरीके से, "नया नहीं" यहां सकारात्मक मामला है।) आपको इसे खींचने के लिए "सभी डेटा को कभी भी" सहेजने की आवश्यकता नहीं है, हालांकि मुझे विश्वास है कि आपको पूरे तत्वों को बचाने की आवश्यकता है। सभी तत्व नहीं - जब तक आप त्रुटि के काल्पनिक रूप से सार्थक अवसर को स्वीकार करने के लिए तैयार नहीं हैं, जैसा कि यहां दिए गए प्रश्न के अन्य उत्तर के अनुसार।)
पैट्रिक87

6

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

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


1
मुझे लगता है कि अंतरिक्ष दक्षता के मुद्दे की इस तरह की अनदेखी, या बल्कि, खिलने वाले फिल्टर की तुलना में काफी कम कुशल है, क्योंकि एक ब्लूम फिल्टर को वास्तव में प्रति बाल्टी थोड़ी ही जरूरत होती है, और इसके लिए प्रति बाल्टी जितनी जगह चाहिए उतनी जगह की जरूरत होती है। वस्तुओं का प्रतिनिधित्व करते हैं। ओह ठीक है ... जब तक ब्रह्मांड परिमित नहीं है (जैसा कि लॉजिक लॉजिक के उत्तर में है) मुझे लगता है कि आप शायद एक ब्लूम फिल्टर की स्पेस दक्षता के बहुत करीब नहीं पहुंच सकते।
पैट्रिक87

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

@AnderingLogic एकल बिट के बजाय एक छोटे से संतृप्त काउंटर का उपयोग करके विलोपन का समर्थन करने की अनुमति देता है (क्षमता की कीमत पर और केवल तभी जब काउंटर अधिकतम पर नहीं है, जाहिर है)।
पॉल ए। क्लेटन

4

मामले में जहां वस्तुओं का ब्रह्मांड परिमित है, तो हां: बस एक खिल फिल्टर का उपयोग करें जो रिकॉर्ड करता है कि कौन से तत्व सेट से बाहर हैं, बजाय सेट में। (यानी, एक ब्लूम फ़िल्टर का उपयोग करें जो ब्याज के सेट के पूरक का प्रतिनिधित्व करता है।)

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

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

वास्तविक ब्लूम फ़िल्टर शोधकर्ता विलोपन का प्रतिनिधित्व करने के अधिक कुशल तरीकों का उपयोग करते हैं, माइक मिटज़ेनमाकर के प्रकाशन के पृष्ठ देखें


इस प्रश्न में, हम आइटम संसाधित कर रहे हैं, और कोई विलोपन नहीं है। खिलने फिल्टर से आइटम निकालने के बिना तारीफ स्टोर करने के लिए कोई सार्थक तरीका है
जो

1
@ जो: मैं सहमत हूं कि समस्या सामान्य रूप से अघुलनशील है, इसलिए इस मामले में मेरे जवाब को प्रतिबंधित कर दिया गया है जहां पूरक परिमित और छोटा था।
भटकने वाला तर्क

1

vi

एक उदाहरण आईपी पते हो सकता है, और आप हर बार जानना चाहते हैं कि कोई ऐसा व्यक्ति दिखाई दे जो आपने पहले कभी नहीं देखा हो। लेकिन यह अभी भी एक परिमित सेट है, इसलिए आप जानते हैं कि आप क्या उम्मीद कर सकते हैं।

वास्तविक समाधान सरल है:

  1. अपनी सभी वस्तुओं को गिनती के खिलने वाले फिल्टर में जोड़ें।
  2. 1
  3. एक वास्तविक नई वस्तु देखने के बाद, उसे फ़िल्टर से घटाएं।

तो आपके पास 'गलत सकारात्मक' मूल्य हो सकते हैं जो वास्तव में पुराने थे, लेकिन नए के रूप में पहचाने गए। हालाँकि आपको नए मूल्य के लिए कभी भी 'नया नहीं' मिलेगा, क्योंकि इसका मूल्य अभी भी सभी स्लॉटों में होगा, और कोई और इसे दूर नहीं ले जा सकता था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.