2015-06-29 11 views
5

मैं एक साधारण खेल बना रहा हूं और इस समस्या पर ठोकर खा रहा हूं। 2 डी स्पेस में कई बिंदु मानें। मैं चाहता हूं कि एक-दूसरे के करीब बिंदुओं को किसी तरह से बातचीत करें।किसी अन्य बिंदु के कुछ त्रिज्या में सभी बिंदुओं को ढूंढना

मुझे समस्या की बेहतर समझ के लिए यहाँ एक तस्वीर फेंक दो: image of the problem

अब, समस्या दूरी कंप्यूटिंग के बारे में नहीं है। मुझे पता है कि यह कैसे करें।

पहले मेरे पास लगभग 10 अंक थे और मैं बस हर संयोजन की जांच कर सकता था, लेकिन जैसा कि आप पहले से ही मान सकते हैं, यह अंक की बढ़ती संख्या के साथ बेहद अक्षम है। क्या होगा यदि मेरे पास कुल मिलाकर दस लाख अंक थे, लेकिन उनमें से सभी एक-दूसरे से बहुत दूर होंगे?

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

यदि आप ऐसे ज्ञात एल्गोरिदम के बारे में नहीं जानते हैं, तो सभी विचारों का बहुत स्वागत है।

+1

मुझे नहीं पता कि सबसे अच्छा विचार क्या है, लेकिन यह कुछ भी नहीं है। इस संरचना में अपनी 2 डी स्पेस स्टोर करें: सरणी (सरणी (बूल)), यदि कोई बिंदु है तो सच है, अगर वहां नहीं है तो गलत। तो जब आप त्रिज्या में अंक ढूंढना चाहते हैं, तो आपको पूरे मैट्रिक्स का मूल्यांकन करने की आवश्यकता नहीं है, केवल त्रिज्या –

+0

https://en.wikipedia.org/wiki/K-d_tree – amit

+0

@pablito के अंदर स्थित स्थितियों का मूल्यांकन करना होगा। आवेन वास्तव में मेरे पहले विचारों में से एक था। अभी भी अपने आस-पास के हर पिक्सेल को जांचने का विचार पसंद नहीं है। – Saraph

उत्तर

4

तुम अब भी आप प्रदर्शन कर सकते हैं हर बिंदु के माध्यम से पुनरावृति करने के लिए जा रहे हैं, लेकिन वहाँ दो अनुकूलन कर रहे हैं:

1) आप पता चल सके कि x1 < दायरे के आधार पर और अगर स्पष्ट अंक समाप्त कर सकते हैं y1 < त्रिज्या (जैसे ब्रेंट पहले से ही किसी अन्य उत्तर में उल्लिखित)।

2) दूरी की गणना करने के बजाय, आप दूरी के वर्ग की गणना कर सकते हैं और इसकी तुलना त्रिज्या के वर्ग के साथ कर सकते हैं। यह आपको महंगे वर्ग रूट गणना करने से बचाता है।

यह शायद सबसे अच्छा प्रदर्शन है जिसे आप प्राप्त करेंगे।

+0

मुझे लगता है कि मैं 2 ढेर रखकर ऑप्टिमाइज़ेशन नंबर 1 का बहुत अच्छा उपयोग कर सकता हूं: एक 'x' द्वारा क्रमबद्ध और एक' y' समन्वय द्वारा। जब अंक बढ़ते हैं, तो हेपसोर्ट कॉल बहुत सस्ता होना चाहिए क्योंकि ये समन्वय केवल प्रत्येक पुनरावृत्ति को बहुत ही कम बदल देंगे। मैं थोड़ी देर के साथ खेलने के बाद वापस आऊंगा (कोई चलचित्र उद्धरण नहीं है)। – Saraph

2

यदि आप उन बिंदुओं को एक्स और वाई मानों द्वारा क्रमबद्ध करने के लिए प्राप्त कर सकते हैं, तो आप केंद्रीय बिंदु के एक बॉक्स के भीतर उन बिंदुओं (बाइनरी खोज?) को तुरंत निकाल सकते हैं: x + - r, y + - आर। एक बार जब आपके पास अंक का सबसेट हो, तो आप यह देखने के लिए दूरी सूत्र का उपयोग कर सकते हैं कि वे त्रिज्या के भीतर हैं या नहीं।

+0

व्यावहारिक रूप से इस दृष्टिकोण को बोलना काम कर सकता है ... लेकिन अगर उस बॉक्स में दस लाख अंक थे तो क्या होगा? आप दूरस्थ सूत्र के साथ जांचने के लिए अंकों की संख्या को कम कर रहे हैं लेकिन रनटाइम – adao7000

+0

में कोई गारंटीकृत सीमा या सुधार नहीं है, मुझे नहीं लगता कि दो आयामी बिंदुओं के संग्रह को सॉर्ट करने का कोई तरीका है जो गारंटी देता है कि प्रत्येक बिंदु होगा अपने पड़ोसियों के करीब। उदाहरण के लिए, यदि आप एक्स द्वारा सॉर्ट करते हैं और फिर टाई ब्रेकर के लिए y का उपयोग करते हैं, तो आप '[(0,0), (1, 999), (2,0)] जैसे सरणी के साथ समाप्त हो सकते हैं। (मुझे लगता है कि आप संदर्भ बिंदु से यूक्लिडियन दूरी से सॉर्ट कर सकते हैं, लेकिन फिर आप वापस आ गए हैं जहां आपने ओ (एन) रन टाइम के साथ शुरुआत की थी)। तो आप अपने खोज को पास के एक्स समन्वय, या एक वाई समन्वय के साथ बिंदुओं को सीमित कर सकते हैं, लेकिन दोनों नहीं। – Kevin

+0

@ केविन आपके पास दो इंडेक्स हो सकते हैं, एक 'x' के लिए और एक' y' के लिए, और फिर दोनों के चौराहे को ढूंढें (जैसे SQL में जॉइन क्लॉज)। यहां तक ​​कि अगर दस लाख अंक थे, तो यह केवल कुछ मेगाबाइट स्टोरेज है। –

2

यह निकटतम पड़ोसी समस्या की तरह दिखता है। अंक को संग्रहीत करने के लिए आपको केडी पेड़ का उपयोग करना चाहिए।

https://en.wikipedia.org/wiki/K-d_tree

7

यह एक range searching समस्या है। अधिक विशेष रूप से - 2-डी परिपत्र रेंज रिपोर्टिंग समस्या।

"Solving Query-Retrieval Problems by Compacting Voronoi Diagrams" [Aggarwal, Hansen, Leighton, 1990] से हवाला देते हुए:

  • इनपुट: इयूक्लिडियन विमान E² में n अंक का एक सेट पी
  • क्वेरी: पी के सभी अंकों के साथ E² में एक डिस्क में निहित का पता लगाएं त्रिज्या आर क्यू पर केंद्रित है।

सबसे अच्छा परिणाम "Optimal Halfspace Range Reporting in Three Dimensions" [Afshani, Chan, 2009] में प्राप्त किया गया। उनकी विधि के लिए ओ (एन) अंतरिक्ष डेटा संरचना की आवश्यकता होती है जो ओ (लॉग एन + के) में सबसे खराब-केस समय में प्रश्नों का समर्थन करता है। संरचना को यादृच्छिक एल्गोरिदम द्वारा प्रीप्रोसेस्ड किया जा सकता है जो ओ (एन लॉग एन) अपेक्षित समय में चलता है। (एन इनपुट बिंदुओं की संख्या है, और आउटपुट बिंदुओं की संख्या में के)।

सीजीएएल लाइब्रेरी परिपत्र रेंज खोज क्वेरी का समर्थन करता है। here देखें।

संबंधित मुद्दे