मेरे पास एक समाधान है जो थोड़ा जटिल लग सकता है, लेकिन भोले-भाले तुलना में अधिक कुशल होना चाहिए :O(n2)
- चलो के द्रव्यमान का केंद्र के बीच धुरी होना और ।vAB
- क्रमशः और इस अक्ष के साथ अंक को अवरोही और आरोही क्रम में क्रमबद्ध करें , जिसके परिणामस्वरूप अनुक्रम , , ..., और , , ..., ।ABa0a1anb0b1bn
बाकी इसे स्पष्ट करने के लिए छद्म कोड में है:
d = infinity.
for j from 1 to n
if (b_1 - a_j) along v > d then break endif
for k from 1 to n
if (b_k - a_j) along v > d then
break
else
d = min( d , ||b_k - a_j|| )
endif
enddo
enddo
अर्थात्, साथ बिंदुओं को पूर्व-सॉर्ट करके , आप उन जोड़ों को फ़िल्टर कर सकते हैं जो कभी भी साथ एक दूसरे के के भीतर नहीं होंगे क्योंकि हमेशा।vdbk−ajv≤∥bk−aj∥
बदतर स्थिति में यह अभी भी , लेकिन अगर और अच्छी तरह से अलग हो जाते हैं, तो यह उससे बहुत तेज़ होना चाहिए, लेकिन से बेहतर नहीं है , जिसकी आवश्यकता है छँटाई के लिए।O(n2)ABO(nlogn)
अपडेट करें
यह समाधान किसी भी तरह से एक टोपी से बाहर निकाला जाता है। यह एक विशेष मामला है कि मैं कणों के उपयोग में क्या स्थानिक द्वंद्व के साथ कणों के सभी परस्पर क्रिया जोड़े को खोजने के लिए करता हूं। अधिक सामान्य समस्या की व्याख्या करने वाला मेरा अपना काम यहाँ है ।
सुझाव के रूप में एक संशोधित लाइन-स्वीप एल्गोरिथ्म का उपयोग करने के लिए, हालांकि सहज रूप से सरल है, मुझे यकीन नहीं है कि यह जब असहमति सेट पर विचार किया जाता है। वही राबिन के यादृच्छिक एल्गोरिदम के लिए जाता है।O(nlogn)
और भी बहुत कुछ संबंध तोड़ना सेट में निकटतम जोड़ी समस्या से निपटने साहित्य होना प्रतीत नहीं होता है, लेकिन मैं मिल गया है इस , जिसके तहत किया जा रहा करने के लिए कोई दावा करता है , और यह है, जो दिखाई नहीं देता किसी भी चीज के बारे में कोई भी दावा करना।O(n2)
ऊपर दिए गए एल्गोरिथ्म को पहले पेपर (शान, झांग और साल्ज़बर्ग) में सुझाए गए प्लेन स्वीप के एक प्रकार के रूप में देखा जा सकता है, फिर भी -axis और कोई छँटाई का उपयोग करने के बजाय , सेट के बीच अक्ष का उपयोग किया जाता है और सेट का पता लगाया जाता है अवरोही / आरोही क्रम में।x