2012-05-15 45 views
6

कार्यान्वयन templatized मैं एक KDTree, जो अब के लिए केवल एक BarnesHut कार्यान्वयन के लिए Quadtree या Octree के रूप में काम करना चाहिए की एक templatized कार्यान्वयन लिखने के लिए जा रहा हूँ।QuadTree या Octree C++

यहां महत्वपूर्ण बिंदु डिजाइन है, मैं आयाम की संख्या निर्दिष्ट करना चाहता हूं जहां पेड़ टेम्पलेट पैरामीटर के रूप में परिभाषित किया गया है और फिर बस कुछ सामान्य तरीकों की घोषणा करें, जो स्वचालित रूप से सही तरीके से व्यवहार करते हैं (मुझे लगता है कि कुछ टेम्पलेट विशेषज्ञता है तब आवश्यक)।

2^2 (quadtree) या 2^3 (octree) नोड्स के लिए क्रम में टेम्पलेट विशेषज्ञ करना चाहते हैं।

है किसी को कुछ डिजाइन विचार है? मैं विरासत से बचना चाहता हूं क्योंकि यह मुझे स्थिर आवंटन के बजाय गतिशील स्मृति आवंटन करने के लिए बाध्य करता है।

यहाँ एन 2 या 3

template<int N> 
class NTree 
{ 
public: 
    NTree<N>(const std::vector<Mass *> &); 
    ~NTree<N>() 
    { 
     for (int i=0; i<pow(2,N); i++) 
      delete nodes[i]; 
    } 
private: 
    void insert<N>(Mass *m); 
    NTree *nodes[pow(2,N)]; // is it possible in a templatized way? 
}; 

हो सकता है एक और समस्या यह है कि quadtree 4 नोड्स लेकिन 2 आयाम है है, octree 8 नोड्स, लेकिन 3 आयाम है, अर्थात् नोड्स की संख्या 2^dimension है। क्या मैं इसे टेम्पलेट-मेटाप्रोग्रामिंग के माध्यम से निर्दिष्ट कर सकता हूं? मैं संख्या 4 और 8 रखना चाहता हूं ताकि लूप अनोलर तेज हो सके।

धन्यवाद!

+1

आप "पत्ता" शब्द का गलत इस्तेमाल कर रहे हैं, सही शब्द "नोड" है। एक "पत्ता" किसी भी बच्चे के बिना एक नोड है। –

+0

तुम भी kdtrees और ट्रैक्टर मिश्रण कर रहे हैं/octree गलत तरीके से, वे एक ही नहीं कर रहे हैं .. – KillianDS

+0

अधिकार (यानी एक 2d पेड़ एक quadtree के बराबर नहीं है), मैं बस एक n-ary पेड़ जो 2D में quadtree की तरह बर्ताव चाहते हैं और 3 डी में ऑक्टेट्री, मैं सवाल संपादित कर रहा हूँ। – linello

उत्तर

8

आप 1 << N बजाय pow(2, N) उपयोग कर सकते हैं। यह काम करता है क्योंकि 1 << N एक संकलन-समय स्थिर है, जबकि pow(2, N) एक संकलित समय निरंतर नहीं है (भले ही इसे संकलन-समय पर मूल्यांकन किया जाएगा)।

+0

अच्छा विचार! धन्यवाद! क्या आपको यह भी लगता है कि इस प्रकार का एक टेम्पलेटलाइज्ड कार्यान्वयन व्यवहार्य या अच्छा है? – linello

+0

नहीं। मुझे लगता है कि टेम्पलेट कोड को दो अलग-अलग कार्यान्वयन से लिखना और पढ़ना मुश्किल होगा: एक चौकोर और एक ऑक्टेट्री। यह असंभव है कि आपको एन = 2 का सामना करना पड़ेगा क्योंकि हमारे पास एक-आयामी डेटा के लिए बेहतर डेटा संरचनाएं हैं, और प्रत्येक नोड के आकार की घातीय वृद्धि के कारण एन> 3 असंभव है। –

+0

आप सही हैं, लेकिन मैं वेक्टर और मैट्रिक्स ऑपरेशंस (ईजिन) के लिए एक टेम्पलेटलाइज्ड रैखिक बीजगणित लाइब्रेरी का भी उपयोग कर रहा हूं, ऐसा लगता है कि एन == 2 या एन == 3 की जांच करने का मामला है, और फिर परिणामस्वरूप कोड लिखें । मैं रखरखाव प्रयोजनों के लिए दो कार्यान्वयन में शामिल होना चाहता था। मैं आपको सूचित करता रहूँगा – linello

2

यदि आप constexpr का समर्थन करने वाले सी ++ 11 कंपाइलर का उपयोग कर रहे हैं तो आप रनटाइम पर गणना करने के लिए -pow का संस्करण लिख सकते हैं।

+0

दुर्भाग्य से मैं इस तरह के संकलक नहीं हो सकता है, और के सी ++ 11 कुछ सुविधाएं फिर भी मेरे लिए पूरी तरह स्पष्ट नहीं: पी – linello

+1

आपको लगता है कि में सी ++ 03 के साथ-साथ कर सकते हैं। अभिन्न शक्तियों के लिए एक सरल पुनरावर्ती टेम्पलेट मेटा-फ़ंक्शन बनाना वास्तव में आसान है। बड अगर आधार हमेशा 2 होता है, तो आप बिट स्थानांतरण के साथ बहुत बेहतर हैं, क्योंकि डायट्रिच एपीपी सुझाव देता है। – Fiktik