उन सभी युग्म मानों का पता लगाएं, जो हैमिंग दूरी के अंतर्गत हैं


11

मेरे पास कुछ मिलियन 32-बिट मान हैं। प्रत्येक मूल्य के लिए, मैं 5. के एक हैमिंग दूरी के भीतर अन्य सभी मूल्यों को खोजना चाहता हूं भोले दृष्टिकोण में, इसके लिए O(N2) तुलना की आवश्यकता होती है , जिससे मैं बचना चाहता हूं।

मुझे एहसास हुआ कि अगर मैंने इन 32-बिट मानों को पूर्णांक के रूप में माना और एक बार सूची को सॉर्ट किया, तो कम से कम महत्वपूर्ण बिट्स में भिन्न होने वाले मान एक साथ बहुत करीब समाप्त हो गए। यह मुझे एक छोटी "विंडो" या संख्याओं की सीमा प्रदान करने की अनुमति देता है जिसके भीतर मैं सटीक हैमिंग दूरी के लिए वास्तविक जोड़ी-वार तुलना कर सकता हूं। हालांकि, जब 2 मान केवल उच्च क्रम बिट्स में भिन्न होते हैं, तो वे इस "विंडो" के बाहर समाप्त होते हैं और क्रमबद्ध सूची के विपरीत छोरों में दिखाई देते हैं। उदाहरण के लिए

11010010101001110001111001010110

01010010101001110001111001010110

बहुत दूर होगा, भले ही उनकी बाधा दूरी 1 है। चूंकि, 2 मानों के बीच की बाधा दूरी तब संरक्षित की जाती है, जब दोनों को घुमाया जाता है, मुझे लगा कि हर बार 32 बाएं घूमते हैं और फिर हर बार सूची को छांटते हैं, यह संभावना है कि 2 मान कम से कम उनमें से एक में सॉर्ट की गई सूची में पर्याप्त रूप से समाप्त हो जाएगा।

  1. हालांकि यह दृष्टिकोण मुझे अच्छे परिणाम दे रहा है, मैं इस दृष्टिकोण की शुद्धता को औपचारिक रूप से स्थापित करने के लिए संघर्ष कर रहा हूं।

  2. यह देखते हुए कि मैं मेल खाने वाले मानों की तलाश कर रहा हूँ जिनकी दूरी k या उससे कम है, क्या मुझे वास्तव में सभी 32 बिट रोटेशन करने की आवश्यकता है? उदाहरण के लिए यदि k=1 और मेरे विंडो का आकार 1000 है, तो मुझे अधिकतम 24 बिट रोटेशन करने की आवश्यकता है क्योंकि यहां तक ​​कि अगर आवारा बिट 8 निम्न क्रम बिट्स में से किसी में भी दिखाई देता है, तो परिणामी संख्या 1000 से अधिक नहीं होगी।


20 सेकंड के विचार से बस विचार: ग्रे-कोड द्वारा एक प्रकार के बारे में क्या? 32-बिट बिटमैप की सूची को 8-बिट बिटमैप की चार सूचियों में विभाजित करने और फिर अपनी तकनीक का उपयोग करने के बारे में क्या?
कार्ल डमगार्ड अस्मुसेन

1
220230

@ मिनार: मेरे पास ऐसे 32-बिट बिटमैप्स के 3-4 मिलियन हैं।
किक्रेट

A[i]4×109A[i].closei

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

जवाबों:


9

जैसा कि कहा गया है, आपका दृष्टिकोण समस्याग्रस्त है, क्योंकि यदि 2 बिटमैप में समान रूप से अंतर है तो किसी भी रोटेशन में, कुछ उच्च क्रम बिट्स पर मतभेद होंगे।

51/5064NN222

45529N4960N


अतिरिक्त जानकारी:

  1. 51632
    (165)(325)0.0217
  2. मूल सूची में प्रत्येक तत्व के लिए सूचियों का निर्माण, संवर्धित सूची में रखा गया है: तत्व स्वयं, सभी तत्व एक स्थिति में भिन्न होते हैं और सभी तत्व दो पदों में भिन्न होते हैं (मूल तत्व के बारे में जानकारी रखते हुए)। प्रत्येक तत्व के लिए प्रतियों की संख्याइस सूची के भीतर कोई भी टकराव (सॉर्ट के बाद पता चला) अधिकतम पर दो मूल तत्व से मेल खाता है । ध्यान दें कि प्रत्येक जोड़ी को कई बार पता लगाया जा सकता है, इसलिए आपको डुप्लिकेट को हटाने की आवश्यकता होगी (लेकिन यह आपके प्रारंभिक एल्गोरिथ्म के साथ पहले से ही मामला था)।1+32+(322)=529.4
  3. अंतिम पास के लिए, तत्वों की संवर्धित सूची को अपने मूल तत्व से सटीक दूरी पर रखने के लिए बेहतर है । फिर, प्रत्येक मूल तत्व के लिए, दूरी पर तत्व बनाएं और उन्हें संवर्धित सूची में खोजें। एक बार फिर, आपको डुप्लिकेट को निकालने की आवश्यकता है क्योंकि प्रत्येक जोड़ी का पता लगाया जा रहा है बार। [अतिरिक्त देखभाल के साथ, आप शायद सबसे अधिक डुप्लिकेट से बचने / बचने का अनुमान लगा सकते हैं लेकिन मुझे यकीन नहीं है कि यह प्रयास के लायक है या नहीं।]2(323)=49603(53)=10

पहले दृष्टिकोण के लिए, क्या आप कह रहे हैं कि मैं बिटमैप को करने के बजाय कुछ पूर्व-निर्धारित आदेशों में बिटमैप की अनुमति देता हूं? क्या आप बता सकते हैं कि आपको 1/50 संभावना कैसे मिली? इसके अलावा, दूसरे दृष्टिकोण के लिए, क्या मुझे पहले और फिर हर तत्व के लिए अपनी सूची का एक सूचकांक बनाने की आवश्यकता है - उत्पन्न (32C1 + 32C2) संयोजनों और 2 की दूरी से भिन्न सभी बिटमैप की पहचान करने के लिए इस सूचकांक के खिलाफ उन्हें जांचें? यह बहुत अच्छा होगा यदि आप इसे आगे बता सकते हैं। धन्यवाद।
karterk

5

मीनार का जवाब उत्कृष्ट है और शायद इस विशेष समस्या के लिए सही दृष्टिकोण है। हालाँकि, मैं एक और संभावित दृष्टिकोण का उल्लेख करूँगा:

आप एक स्थानीय-संवेदनशील हैश फ़ंक्शन (LSH) का उपयोग कर सकते हैं । एक स्थानीय-संवेदनशील हैश फ़ंक्शन को डिज़ाइन किया गया है ताकि यदि हैमिंग दूरी में बंद हो, तो । यदि आपके पास ऐसा हैश , तो आप अपने सभी मानों को हैश टेबल (हैश फंक्शन और ओपन हैशिंग का उपयोग करके ) में स्टोर कर सकते हैं , और फिर आप बहुत जल्दी उन सभी मानों का पता लगा पाएंगे जो हैमिंग दूरी में बंद हैं। । एलएसएच के निर्माण के लिए विभिन्न तकनीकें हैं; आप कई उम्मीदवारों को खोजने के लिए इस विषय पर संदर्भ देख सकते हैं।Hx,yH(x)=H(y)HH

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

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