कोई गलत सकारात्मक के साथ एक संभाव्य सेट?


35

इसलिए, ब्लूम फ़िल्टर करता है बहुत अच्छे हैं - वे ऐसे सेट हैं जो बिना किसी गलत नकारात्मक के सदस्यता की जाँच का समर्थन करते हैं, लेकिन झूठे सकारात्मक की एक छोटी संभावना है। हाल ही में, मैं एक "ब्लूम फ़िल्टर" चाह रहा हूं जो विपरीत की गारंटी देता है: कोई झूठी सकारात्मक नहीं, लेकिन संभावित रूप से गलत नकारात्मक।

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

फिर भी मुझे कुछ भी नहीं मिल रहा है। मैंने जो निकटतम पाया है, वह " ब्लूम के फिल्टर को पुनःप्राप्त किया गया " है, जो किसी को उच्च झूठी नकारात्मक दर के लिए चयनित सकारात्मक सकारात्मक व्यापार करने की अनुमति देता है। मुझे नहीं पता कि जब सभी हटाना चाहते हैं तो उनकी डेटा संरचना कितनी अच्छी है झूठी सकारात्मकता ।

किसी को भी इस तरह से कुछ भी देखा? :)


3
मुझे जिस सेट में दिलचस्पी है, उसका पूरक अनंत है। मैं इसे कैसे स्टोर करूंगा?
क्रिस्टोफर मोनसेंटो

11
मैं समस्या को देखता हूं (आधुनिक डिस्क अभी तक बहुत बड़ी नहीं हैं)।
डेव क्लार्क

8
यदि आपके पास इस तरह की डेटा संरचना थी, तो आप इसे संयोजन w / एक नियमित ब्लूम फ़िल्टर और सटीक सेट सदस्यता को स्टोर करके "धोखा" देने के लिए उपयोग कर सकते हैं।
मार्क रीटब्लाट

1
@MarkReitblatt ब्लूम फ़िल्टर और कैश दोनों संभाव्य हैं, और इसके साथ कोई भी संयोजन संभाव्य होगा, अर्थात सटीक सेट सदस्यता परीक्षण प्राप्त करने में सक्षम नहीं। :)
awdz9nld

जवाबों:


25

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


जवाब के लिए धन्यवाद। हाँ, यह स्पष्ट समाधान है - अगर यह भी मानक समाधान है, तो लगता है जैसे मैं भाग्य से बाहर हूं। ओह अच्छा।
क्रिस्टोफर मोनसेंटो

2
इसे डायरेक्ट-मैप्ड कैश कहा जाता है, और आमतौर पर सीपीयू में इसका उपयोग किया जाता है। (कोई भी कैश या हॅसी हैश सेट अलग-अलग डिग्री की आवश्यकताओं को पूरा करता है)। त्रुटि दर हैश फ़ंक्शन के वितरण (हिमस्खलन) का एक फ़ंक्शन है और कैश / सेट में उपलब्ध स्लॉट की संख्या - तदनुसार समायोजित करें। :)
awdz9nld

यह भी ध्यान दें कि झूठी सकारात्मकता का परिचय दिए बिना केवल शब्दशः कुंजियाँ संग्रहीत की जा सकती हैं (उदाहरण के लिए एक हैश
कीड को संचित करना

20

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

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

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

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


चेकआउट somethingsimilar.com/2012/05/21/the-opposite-of-a-bloom-filter - क्या गलत है इस कार्यान्वयन /
Yehosef

@ योसेफ यह ठीक है और आपकी आवश्यकताओं के लिए काम कर सकता है, लेकिन आप देखेंगे कि लेखक "कुछ आईडी" होने की बात करता है जो पूरी तरह से घटना की पहचान करता है। इसलिए, जो लागू किया जाता है वह प्रभावी रूप से अभी भी पूरी वस्तु को संग्रहीत करता है। तो, यह कैश का एक प्रकार है। एक वास्तविक "एक ब्लूम फ़िल्टर के विपरीत", यदि यह अस्तित्व में है, तो पूरे ऑब्जेक्ट को स्टोर करने की आवश्यकता नहीं होगी।
pents90

उन्होंने कुछ आईडी का उल्लेख किया जो इस घटना की पहचान करते हैं - संपूर्ण वस्तु नहीं। मुझे सिर्फ "कैश" को सेशन_ड पर रखने की आवश्यकता है - संपूर्ण इंटरैक्शन रिकॉर्ड नहीं। लेकिन मैंने सुना है कि यह खिलने या हाइपरलॉग के समान दृष्टिकोण नहीं है।
येहसेफ़

आपके "सबूत" में आप मानते हैं कि असीमित प्रविष्टियों की एक संभावित संख्या है। हालांकि, ऐसे मामले हैं जहां संभव प्रविष्टियों का सेट अग्रिम में जाना जाता है। उदाहरण के लिए, मेमोरी पेज के कचरा संग्रह के लिए: आप जानते हैं कि इसमें कौन सी प्रविष्टियाँ हैं। अब आप एक "ग्लोम फ़िल्टर" बनाएं जो प्रत्येक संभावित प्रविष्टि को एक इंडेक्स 0..n पर मैप करता है। अब जब एक प्रविष्टि को हटा दिया जाता है, तो बिट को एक सूचकांक निर्धारित करें। जब सभी बिट्स सेट हो जाते हैं, तो आप पृष्ठ को इकट्ठा कर सकते हैं। "ग्लोम फ़िल्टर" एक एमपीएचएफ है। झूठी नकारात्मक अनुमति देने के लिए, MPHF को ऐसे बदलें कि कुछ प्रविष्टियाँ n + 1 में मैप हो जाएं।
थॉमस म्यूलर

@ThomasMueller सही, मैं सबसे खराब स्थिति / प्रतिकूल केस मान रहा हूं, जो मानक सीएस सिद्धांत बिंदु है। यह सच है कि यदि आपके पास केवल एन संभव प्रविष्टियों का एक निश्चित सेट है, तो बहुत सारे सीधे समाधान हैं, केवल प्रत्येक आइटम के लिए एन लॉग की आवश्यक जगह है। खिल फिल्टर की हालांकि ऐसी कोई सीमा नहीं है।
pents90

13

आप बस एक कैश चाहते हैं, लेकिन इसके बारे में एक अजीब तरीके से सोच रहे हैं।


1
... विस्तृत करने के लिए परवाह? बेशक एक कैश काम करेगा, लेकिन यह आदर्श नहीं है, इसलिए संभाव्य डेटा संरचनाओं में कला की स्थिति के बारे में एक सवाल है। अधिक विशिष्ट होने के लिए: कैशिंग तकनीकों को मुझे बहुत अधिक भंडारण की आवश्यकता है। अधिक कैश स्तर, अधिक संग्रहण का उपयोग किया जाता है। कोई कैश में संग्रहीत तत्वों पर एक बाउंड प्लेस कर सकता है, उपयोग पैटर्न के साथ ट्रिक्स कर सकता है, आदि, लेकिन फिर भी स्पेस दक्षता के पास कहीं भी झूठे उत्तर अनुपात के लिए नहीं मिलता है जो ब्लूम फ़िल्टर प्रदान करता है।
क्रिस्टोफर मोनसेंटो

1
(जारी) कहा जा रहा है, मैं एक स्पष्ट कैशिंग तकनीक के बारे में भूल सकता हूं जो मेरी सभी समस्याओं को हल करता है। उस स्थिति में, आप मुझे विकिपीडिया पर एक सामान्य श्रेणी की लिंक देने के बजाय उस तकनीक को स्पष्ट कर सकते हैं?
क्रिस्टोफर मोनसेंटो

2

अस्वीकरण: मैं कैश में विशेषज्ञ नहीं हूं इसलिए यह एक भोला विचार हो सकता है, और यह एक ज्ञात विचार भी हो सकता है जो मैंने पहले कभी नहीं सुना है। इसलिए मुझे क्षमा करें यदि मैं इसके संदर्भ का हवाला देता हूं (यदि यह मौजूद है); और कृपया मुझे सूचित करें यदि पोस्ट को संपादित करने और इसे जोड़ने के लिए इसके लिए एक संदर्भ है। (मुझे संदेह है कि यह एक संदर्भ हो सकता है क्योंकि यह बहुत सहज है)।

सीसी


0

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


मैंने स्ट्रिंग डेटा के साथ प्रयास करने की कोशिश भी की है, लेकिन मेरा डेटा बाइनरी संरचनाओं को पैक करता है।
JRideout

0

मुझे लगता है कि कोई व्यक्ति निम्न बाउंड को यह साबित कर सकता है कि उपरोक्त डेटा संरचना मौजूद नहीं है। मूल रूप से, यदि डेटा संरचना m बिट्स का उपयोग करती है, तो एक निश्चित बिट-वेक्टर (एक इनपुट का प्रतिनिधित्व) एक काउंटिंग तर्क द्वारा अधिकतम (((un) + n eps) \ choose (un)) सेट कर सकता है। यह देखते हुए कि 2 ^ मीटर यह संख्या कम से कम होनी चाहिए (u \ choose n) (सभी सेटों का प्रतिनिधित्व किया जाना चाहिए), हमें एक कम बाउंड मिलता है जो मूल रूप से सेट S को स्टोर करने के बहुत करीब है।

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