एक सामान्य दृष्टिकोण (कम से कम मेरे लिए) पूर्व-चरण चरण के रूप में सटीक मिलान के लिए इन चंक्सों पर अपनी बिट स्ट्रिंग को कई टुकड़ों में विभाजित करना और क्वेरी करना है। यदि आप फ़ाइलों के साथ काम करते हैं, तो आप उतने ही फाइल बनाते हैं, जितने कि आपके पास हैं (जैसे 4 यहाँ) सामने वाले प्रत्येक चंक के साथ और फिर फ़ाइलों को क्रमबद्ध करें। आप एक बाइनरी खोज का उपयोग कर सकते हैं और आप बोनस के लिए मिलान मिलान के ऊपर और नीचे खोज का विस्तार भी कर सकते हैं।
आप फिर लौटे परिणामों पर एक बिटवाइज़ हैमिंग दूरी गणना कर सकते हैं जो आपके संपूर्ण डेटासेट का केवल एक छोटा उपसमूह होना चाहिए। यह डेटा फ़ाइलों या SQL तालिकाओं का उपयोग करके किया जा सकता है।
इसलिए पुनरावृत्ति करने के लिए: कहो कि आपके पास DB या फ़ाइलों में 32 बिट्स स्ट्रिंग्स का एक गुच्छा है और आप हर उस हैश को ढूंढना चाहते हैं जो 3 बिट्स की दूरी या आपके "क्वेरी" बिट स्ट्रिंग से कम है:
चार स्तंभों के साथ एक तालिका बनाएं: प्रत्येक में 8 बिट्स होंगे (एक स्ट्रिंग या इंट के रूप में) 32 बिट्स हैश का स्लाइस, 1 से 4 तक। या यदि आप फ़ाइलों का उपयोग करते हैं, तो चार फाइलें बनाएं, प्रत्येक में स्लाइस का क्रमिक होना प्रत्येक "पंक्ति" के सामने एक "इस्लाम"
qslice 1 से 4 में उसी तरह से अपनी क्वेरी बिट स्ट्रिंग को स्लाइस करें।
इस तालिका को किसी भी तरह से क्वेरी करें qslice1=islice1 or qslice2=islice2 or qslice3=islice3 or qslice4=islice4
। यह आपको प्रत्येक स्ट्रिंग देता 8 - 1
है जो क्वेरी स्ट्रिंग के 7 बिट्स ( ) के भीतर है । यदि फ़ाइल का उपयोग कर रहे हैं, तो एक ही परिणाम के लिए चार अनुमत फ़ाइलों में से प्रत्येक में एक द्विआधारी खोज करें।
प्रत्येक लौटी हुई बिट स्ट्रिंग के लिए, सटीक हैमिंग डिस्टेंस पेयर-वाइज को अपने साथ क्वेरी बिट स्ट्रिंग (चार-स्लाइस में से इंडेक्स-साइड बिट स्ट्रिंग्स का पुनर्निर्माण या तो डीबी से या एक अनुमति प्राप्त फ़ाइल से गणना करें)
चरण 4 में परिचालनों की संख्या आपकी पूरी तालिका की एक पूर्ण जोड़ी-वार हैमिंग गणना से बहुत कम होनी चाहिए और व्यवहार में बहुत कुशल है। इसके अलावा, समानांतरता का उपयोग करके अधिक गति की आवश्यकता के रूप में छोटी फ़ाइलों में फ़ाइलों को शार्प करना आसान है।
अब निश्चित रूप से आपके मामले में, आप एक प्रकार के स्व-जुड़ाव की तलाश में हैं, यह सभी मूल्य हैं जो एक-दूसरे से कुछ दूरी पर हैं। एक ही दृष्टिकोण अभी भी IMHO काम करता है, हालांकि आपको क्रमपरिवर्तन (फ़ाइलों या सूचियों का उपयोग करके) के लिए एक प्रारंभिक बिंदु से ऊपर और नीचे का विस्तार करना होगा जो शुरुआती हिस्सा साझा करते हैं और परिणामस्वरूप क्लस्टर के लिए हैमिंग दूरी की गणना करते हैं।
यदि फ़ाइलों के बजाय मेमोरी में चल रहा है, तो आपके 100M 32 बिट्स स्ट्रिंग्स डेटा सेट 4 जीबी की सीमा में होंगे। इसलिए चार अनुमत सूचियों में लगभग 16GB + RAM की आवश्यकता हो सकती है। हालाँकि मुझे इसके बजाय मेमोरी मैप्ड फ़ाइलों के साथ उत्कृष्ट परिणाम मिलते हैं और समान आकार के डेटासेट के लिए कम RAM होना चाहिए।
खुला स्रोत कार्यान्वयन उपलब्ध हैं। अंतरिक्ष में सबसे अच्छा IMHO है जो मोज़ाह , सी ++ द्वारा सिम्हाश के लिए किया गया था , लेकिन 64 बिट्स स्ट्रिंग्स और 32 बिट्स के लिए डिज़ाइन नहीं किया गया था।
इस खुशहाल दूरी के दृष्टिकोण को सबसे पहले AFAIK ने मूसा चारीकर द्वारा "सिम्हाश" सेमिनल पेपर और संबंधित Google पेटेंट में वर्णित किया था :
- अपीयरिंग न्यूमैरेस्ट नाइटबार्च हार्मिंग स्पेस में
[...]
प्रत्येक बिट्स में d बिट्स से युक्त वैक्टर होते हैं, हम N = O (n 1 / (1+)) बिट्स का यादृच्छिक क्रमांकन चुनते हैं। प्रत्येक यादृच्छिक क्रमांकन ed के लिए, हम बिट वैक्टर के क्रमबद्ध क्रम O a को बनाए रखते हैं, बिट्स के लेक्सिकोग्राफ़िक क्रम में order द्वारा अनुमत। एक क्वेरी बिट वेक्टर q को देखते हुए, हम निम्नलिखित करके निकटतम निकटतम पड़ोसी का पता लगाते हैं:
प्रत्येक क्रमचय σ के लिए, हम O (perm द्वारा अनुमत बिट्स द्वारा प्राप्त लेक्सिकोग्राफ़िक क्रम में) निकटतम दो बिट वैक्टर का पता लगाने के लिए O locate पर एक द्विआधारी खोज करते हैं। अब हम प्रत्येक क्रमबद्ध क्रम में खोज करते हैं O ining ऊपर और नीचे की स्थिति के तत्वों की जाँच बाइनरी खोज द्वारा की गई सबसे लंबी उपसर्ग की लंबाई के क्रम में होती है जो q से मेल खाती है।
मोनिका हेन्जिगर ने अपने पेपर में "निकट-डुप्लिकेट वेब पृष्ठों को खोजना: एल्गोरिदम का एक बड़े पैमाने पर मूल्यांकन" का विस्तार किया :
3.3 एल्गोरिथ्म सी के लिए परिणाम
हमने प्रत्येक पृष्ठ की बिट स्ट्रिंग को 12 गैर-अतिव्यापी 4-बाइट टुकड़ों में विभाजित किया, जिससे 20B टुकड़े बने और सभी पृष्ठों की सी-समानता की गणना की, जिसमें कम से कम एक टुकड़ा था। इस दृष्टिकोण की गारंटी दी गई है कि 11 तक के अंतर वाले सभी जोड़ों को खोजने के लिए, यानी, सी-समानता 373, लेकिन बड़े अंतर के लिए कुछ छूट सकती है।
गुरमीत सिंह मनकू, अरविंद जैन, और अनीश दास सरमा द्वारा वेब क्रॉलिंग के पास-डुप्लिकेट का पता लगाने वाले पेपर में भी यह बताया गया है :
- स्मरण शक्ति समस्या
परिभाषा: f -bit उंगलियों के निशान और एक क्वेरी फिंगरप्रिंट F के संग्रह को देखते हुए, पहचानें कि क्या मौजूदा फिंगरप्रिंट F से सबसे k बिट में भिन्न है। (उपरोक्त समस्या के बैच-मोड संस्करण में, हमारे पास एक एकल क्वेरी फ़िंगरप्रिंट के बजाय क्वेरी फ़िंगरप्रिंट का एक सेट है)
[...]
अंतर्ज्ञान: 2 df की सॉर्ट की गई तालिका पर विचार करें-सही मायने में यादृच्छिक उंगलियों के निशान। तालिका में केवल सबसे महत्वपूर्ण डी बिट्स पर ध्यान दें। इन डी-बिट संख्याओं की एक सूची इस अर्थ में "लगभग एक काउंटर" है कि (ए) काफी कुछ 2 डी-बिट संयोजन मौजूद हैं, और (बी) बहुत कम डी-बिट संयोजन डुप्लिकेट हैं। दूसरी ओर, कम से कम महत्वपूर्ण f - d बिट "लगभग यादृच्छिक" हैं।
अब d ऐसा चुनें | d - d | एक छोटा पूर्णांक है। चूंकि तालिका छांटी गई है, इसलिए एक एकल जांच उन सभी उंगलियों के निशान की पहचान करती है जो घ में सबसे महत्वपूर्ण बिट-पदों से मेल खाते हैं। चूंकि | d - d | छोटा है, ऐसे मैचों की संख्या भी छोटी होने की उम्मीद है। प्रत्येक मिलान फिंगरप्रिंट के लिए, हम आसानी से यह पता लगा सकते हैं कि यह F से सबसे k बिट-पोज़िशन में भिन्न है या नहीं (ये अंतर स्वाभाविक रूप से f - d-महत्वपूर्ण बिट-पोज़िशन तक सीमित होगा)।
ऊपर वर्णित प्रक्रिया हमें एक मौजूदा फ़िंगरप्रिंट का पता लगाने में मदद करती है जो कि के-पोज़िशन्स में एफ से अलग है, जिनमें से सभी एफ-डी बिट्स के कम से कम महत्वपूर्ण एफ के बीच सीमित हैं। यह उचित संख्या में मामलों की देखभाल करता है। सभी मामलों को कवर करने के लिए, यह अगले खंड में औपचारिक रूप से उल्लिखित अतिरिक्त सॉर्ट किए गए तालिकाओं की एक छोटी संख्या का निर्माण करने के लिए पर्याप्त है।
नोट: मैंने संबंधित डीबी-केवल प्रश्न के समान उत्तर पोस्ट किया है