2013-02-22 68 views
5

मैं नीचे के रूप में reational डेटाबेस में माता-पिता और बच्चे मैपिंग के लिए सभी पहुंच योग्य बच्चे को सूचीबद्ध करने के,स्मृति में पैरेंट बाल मैपिंग संग्रहीत करना। प्रदर्शन के अनुकूलन के लिए एक माता पिता कुशलतापूर्वक

relationship_id | parent_id | child_id 
1    | 100009 | 600009 
2    | 100009 | 600010 
3    | 600010 | 100008 

, मैं स्मृति में इन सभी मैपिंग रखना चाहते। यहां, एक बच्चे के एक से अधिक माता-पिता होंगे और माता-पिता के 2 से अधिक बच्चे होंगे। मुझे लगता है, मुझे "ग्राफ" डेटा संरचना का उपयोग करना चाहिए।

स्मृति में पॉपुलटिंग एक बार की गतिविधि है। मेरी चिंता यह है कि, जब मैं सभी बच्चे (न केवल तत्काल बच्चे) को सूचीबद्ध करने के लिए कहता हूं, तो उन्हें जितनी जल्दी हो सके उन्हें वापस कर देना चाहिए। जोड़ और हटाना शायद ही कभी होता है। मुझे किस डेटा संरचना और एल्गोरिदम का उपयोग करना चाहिए?

MultiHashMap का प्रयास किया, O(1) खोज समय प्राप्त करने के लिए, लेकिन इसमें अधिक रिडंडेंसी है।

उत्तर

5

माता-पिता के संबंधों के लिए एक ग्राफ डेटा संरचना है। प्रत्येक ग्राफ़ नोड में केवल ArrayList बच्चों का हो सकता है।

फिर HashMap है जो ग्राफ़्नोड आईडी को मानचित्र करता है।

आपको कुछ समझने की आवश्यकता है ताकि आप एक चक्र नहीं बना सकें (यदि यह संभव है) जो अनंत लूप का कारण बनता है।

+0

यह मैंने वास्तव में क्या किया। लेकिन, मुझे माता-पिता के लिए सभी पहुंचने योग्य बच्चों को प्राप्त करने की आवश्यकता है। इस डिजाइन में, मुझे पहुंच क्षमता खोजने के लिए हर बच्चे-बच्चों के नोड से यात्रा करने की ज़रूरत है। क्या कोई रास्ता है कि मैं कम ट्रैवर्सल में सभी पहुंचने योग्य नोड्स पा सकता हूं। – krishna

+0

@ कृष्णा मुझे यकीन नहीं है कि यह उससे बेहतर हो सकता है या नहीं। आप प्रत्येक नोड पर एक झंडा लगा सकते हैं यह इंगित करने के लिए कि आपने इसका दौरा किया है ताकि आप किसी भी नोड्स को दोहराएं। इस ध्वज को एकाधिक कॉल (वंशजों को प्राप्त करने के लिए) को पूर्णांक के रूप में कार्यान्वित किया जा सकता है, 0 से शुरू होता है और प्रत्येक कॉल पर वृद्धि करता है, और उसके बाद केवल उसके नोड्स पर नोड्स का दौरा किया जाता है! = वह मान और फिर प्रत्येक विज़िट नोड को इस मान पर सेट करें। – Dukeling

1

आपको कस्टम लुकअप के लिए कस्टम Node कक्षा और एक हैशैप को नोड संदर्भों को स्टोर करने की आवश्यकता होगी।

for each row in database 
if parent node exists in map 
    get it 
else 
    create it and add it 

if child node exists in map 
    get it 
else 
    create it and add it 

set relationship between parent and child 

नोड क्लास कुछ ऐसा दिखाई देगा;

public class Node { 

    private int id; 

    private List<Node> parents = new ArrayList<Node>(); 
    private List<Node> children = new ArrayList<Node>(); 

    //getters and setters 

} 
+0

यह वही है जो मैंने किया था। लेकिन, मुझे माता-पिता के लिए सभी पहुंचने योग्य बच्चों को प्राप्त करने की आवश्यकता है। इस डिजाइन में, मुझे पहुंच क्षमता खोजने के लिए हर बच्चे-बच्चों के नोड से यात्रा करने की ज़रूरत है। क्या कोई रास्ता है कि मैं कम ट्रैवर्सल में सभी पहुंचने योग्य नोड्स पा सकता हूं। – krishna

+0

क्या आपको लगता है कि ट्रैवर्सल एक समस्या होगी? यह एक सुंदर मानक दृष्टिकोण है; बस सोचें कि पेड़ कैसे काम करते हैं। विकल्प प्रत्येक नोड पर सभी वंशजों की एक सूची होगी। – Qwerky

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

  • कोई संबंधित समस्या नहीं^_^