2013-08-01 53 views
8

मैं यह पता लगाने की कोशिश कर रहा हूं कि कौन सी संरचना बिंदुओं, एक केडी-पेड़ या एक ऑक्टेट की कई त्रिज्या खोज करने के लिए बेहतर होगी? यह पहले ही this question में उल्लेख किया गया था लेकिन इसका कोई जवाब नहीं था। ऐसा लगता है कि चूंकि ऑक्टों ने पत्तियों के लिए आकार निर्धारित किए हैं, इसलिए पहले से ही उन शाखाओं की गणना की जा सकती है जिन्हें मुझे यात्रा करने की आवश्यकता है, जबकि केडी-पेड़ के लिए आपको त्रिज्या कवर होने तक शाखाओं की यात्रा करना है।केडी-पेड़ बनाम ऑक्टेट्री

उत्तर

2

3 डी और निश्चित क्वेरी त्रिज्या के लिए, octrees एक अच्छी पसंद है। यदि आपको डिस्क पर काम करने की ज़रूरत है, तो अन्य डेटा संरचनाएं बेहतर हो सकती हैं, लेकिन के-डी-पेड़ यहां या तो चमक नहीं आता है।

आप दोनों कोशिश क्यों नहीं करते हैं और देखें कि आपके डेटा के लिए कौन सा बेहतर काम करता है?

2

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

1

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

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

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

struct OctreeNode 
{ 
    // Index of first child node. To get to the 4th node, 
    // we just access nodes[first_child+3], e.g. 
    int first_child; 
    ... 
}; 

तो वैसे भी, मैं इस मामले में ऑक्टेट के लिए वोट देता हूं यदि ये दो विकल्प हैं। इसके अलावा निकटता की खोज के लिए, आप जरूरी नहीं कि ऑक्टेट बहुत गहरा होना चाहें। यहां तक ​​कि अगर हमें एक उथले पेड़ के साथ इष्टतम से अधिक अंक देखना है, तो पेड़ को ऊपर और नीचे जाने से बेहतर हो सकता है। यदि आप पत्ते में स्टोर करते हैं तो यह मदद करता है अगर यह मदद करता है। अपने पेड़ के निर्माण के बाद आप संभावित रूप से उस प्रक्रिया के साथ प्राप्त कर सकते हैं।

दोनों समाधानों के साथ नोट करें जो आपको भाई नोड्स को देखना है। एक बिंदु के निकटतम बिंदु आवश्यक रूप से एक ही पत्ता नोड में रहने वाला नहीं है। ऐसे कुछ मामले भी हैं जहां आपके डेटा की प्रकृति के आधार पर केवल 3-आयामी ग्रिड वास्तव में इष्टतम हो सकता है, क्योंकि 3 डी ग्रिड के साथ आपको कभी भी बच्चे से माता-पिता तक जाने के लिए परेशान नहीं होना पड़ता है। 3 डी ग्रिड मेमोरी उपयोग में विस्फोटक प्रतीत हो सकते हैं, लेकिन यदि आप ग्रिड सेल के मेमोरी ओवरहेड को 32-बिट इंडेक्स तक कम करते हैं तो उन्हें जरूरी नहीं होना चाहिए। ऐसे मामले में, 100x100x100 ग्रिड 4 मेगाबाइट से कम लेता है।

+1

मेरी इच्छा है कि यह एक पेपर था इसलिए मैं आपको उद्धृत कर सकता हूं ... लोग इस सामान के बारे में कभी भी परेशान नहीं होते (मेरे क्षेत्र में) – kotoko

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