2010-04-16 11 views
5

मेरे पास ऑब्जेक्ट्स की एक आसन्न सूची है (कुंजी के साथ SQL डेटाबेस से लोड की गई पंक्तियां और इसकी मूल कुंजी) जो मुझे एक अनियंत्रित पेड़ बनाने के लिए उपयोग करने की आवश्यकता है। यह चक्र नहीं होने की गारंटी है।आसन्नता सूची से पेड़ बनाने का सबसे प्रभावी तरीका

यह बहुत लंबा रास्ता ले रहा है (लगभग 5 मिनट में 870 के नोड्स से केवल ~ 3K संसाधित)। बहुत सारे रैम के साथ मेरे वर्कस्टेशन कोर 2 डुओ पर चल रहा है।

यह कैसे तेजी से इसे बनाने के बारे में कोई विचार है?

public class StampHierarchy { 
    private StampNode _root; 
    private SortedList<int, StampNode> _keyNodeIndex; 

    // takes a list of nodes and builds a tree 
    // starting at _root 
    private void BuildHierarchy(List<StampNode> nodes) 
    { 
     Stack<StampNode> processor = new Stack<StampNode>(); 
     _keyNodeIndex = new SortedList<int, StampNode>(nodes.Count); 

     // find the root 
     _root = nodes.Find(n => n.Parent == 0); 

     // find children... 
     processor.Push(_root); 
     while (processor.Count != 0) 
     { 
      StampNode current = processor.Pop(); 

      // keep a direct link to the node via the key 
      _keyNodeIndex.Add(current.Key, current); 

      // add children 
      current.Children.AddRange(nodes.Where(n => n.Parent == current.Key)); 

      // queue the children 
      foreach (StampNode child in current.Children) 
      { 
       processor.Push(child); 
       nodes.Remove(child); // thought this might help the Where above 
      } 
     } 
    } 
} 

    public class StampNode { 
     // properties: int Key, int Parent, string Name, List<StampNode> Children 
    } 
+0

क्या आपको इसे सी # में करना है? चूंकि यह एसक्यूएल में पथ द्वारा नोड्स को ऑर्डर करने के लिए बहुत तेज़ होगा, जिसके साथ आप ओ (एन) समय में एक पेड़ बना सकते हैं। – Aaronaught

+0

मैं एसक्यूएल में पथ से कैसे आदेश दे सकता हूं? मेरा डेटा एक संगठन चार्ट की तरह है ... बहुत सारे बच्चे और बहुत सारे स्तर के स्तर। –

उत्तर

3
  1. एक क्रमबद्ध सूची या शब्दकोश में नोड्स रखो।

  2. उस सूची को स्कैन करें, प्रत्येक नोड उठाएं, उसी सूची में अपने मूल नोड को ढूंढें (बाइनरी सर्च या डिक्शनरी लुकअप), इसे पैरेंट नोड के बच्चों के संग्रह में जोड़ें।

इसे पेड़ में रखने के लिए एक स्टैक की आवश्यकता नहीं है।

+0

यह ध्यान देने योग्य है कि उन्हें क्रमबद्ध सूची में रखने से पहले कुंजी द्वारा नोड्स को सॉर्ट करना गति में एक बड़ा अंतर बनाता है। स्मृति के साथ जाना एक और विकल्प है यदि स्मृति प्राथमिक बाधा नहीं है। – Codism

1

सॉर्टेडलिस्ट इस संदर्भ में उपयोग करने के लिए एक अच्छा कंटेनर नहीं है। यह सम्मिलन संचालन के लिए ओ (एन) है (जोड़ने के लिए बार-बार कॉल()), क्योंकि इसे आंतरिक रूप से एक फ्लैट सूची के रूप में दर्शाया जाता है। सॉर्टेडलिस्ट के बजाय शब्दकोश का उपयोग करना एक बड़ा सुधार होगा, क्योंकि यह ओ (1) अमूर्त सम्मिलन समय है।

+0

आह, मैं भी वर्तमान चूक गया। बच्चे। AddRange लाइन। आप प्रत्येक माता-पिता के लिए अपनी संपूर्ण नोड सूची को फिर से स्कैन नहीं करना चाहते हैं। जैसा कि हाइटेक्राइडर ने सुझाव दिया था, नोड्स को पहले एक शब्दकोश में डालने से नाटकीय रूप से चीजों को गति मिलेगी, फिर भी, आप ओ (एन) ऑपरेशन को ओ (1) ऑपरेशन में बदल देते हैं। –