2015-01-02 8 views
5

मैं आकार N के अनियमित तत्वों की किसी दिए गए सूची से बी + पेड़ बनाना चाहता हूं।किसी दिए गए सूची से बी + पेड़ को कुशलतापूर्वक कैसे बनाया जाए?

मुझे पता है कि यह करने के लिए इष्टतम बाध्य है Θ(N/B * logM/B(N/B)) ब्लॉक ट्रांसफर, जो सॉर्टिंग के लिए भी इष्टतम है; तो मैं बस एक आइटम नहीं चुन सकता और व्यक्तिगत रूप से पेड़ में एक सम्मिलित कर सकता हूं, क्योंकि यह मुझे O(N logB(N)) ब्लॉक स्थानान्तरण देगा।

तो मुझे लगा कि पेड़ बनाने का सबसे अच्छा तरीका तत्वों को पहले क्रमबद्ध करना है, क्योंकि पत्तियों को वैसे भी आदेश दिया जाता है। उस से, मैं एक नुकसान में हूँ।

मैं कुछ इस तरह के बारे में सोचा:

  1. सूची
  2. उन्हें लिखें वे कहीं हैं के रूप में से ले बी तत्वों
  3. ब्लॉक के अंतिम तत्व ले लो (यह तीन में से एक पत्ता है) (सबसे बड़ा); यह
  4. अगले तत्वों के लिए दोहराएँ चरण 1, जब तक वहाँ माता-पिता में बी -1 रूटिंग कुंजियों हैं
  5. माता-पिता में B-1 रूटिंग कुंजियों देखते हैं जब, इसका मतलब यह है पत्ती की मूल के लिए एक मार्ग कुंजी हो जाएगा पूर्ण। इसलिए नए रूटिंग कुंजी "दादा" के बजाय (ताकि पेड़ एक स्तर बढ़ता है) जाना होगा, और सभी नए पत्ते एक नए अभिभावक
  6. इस तरह जारी रखें जब तक N/B ब्लॉक

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

मैंने हर जगह देखा लेकिन मुझे एल्गोरिदम नहीं मिला कि वास्तव में बताता है कि Θ(N/B * logM/B(N/B)) में पेड़ कैसे बनाया जाए। मुझे लगता है कि बी कारक का शोषण किए बिना सूची में प्रत्येक आइटम के लिए पेड़ में सरल सम्मिलन वाले एल्गोरिदम हैं।

क्या आप मेरी मदद कर सकते हैं, शायद मुझे सही दिशा में इंगित करें?

+0

चरण 5 के संबंध में, "नई रूटिंग कुंजी दादाजी के बजाय जाएगी", यह दादाजी में नहीं बल्कि पुरानी पिता की मध्य कुंजी में नई कुंजी नहीं है। नई कुंजी नए पिता – mangusta

+0

में जाती है आप सही हैं, मेरी गलती! यदि मैं बी-1 तत्वों तक पहुंचने पर आंतरिक नोड्स को विभाजित करता हूं तो मैं गारंटी दे सकता हूं कि पेड़ प्रति नोड की न्यूनतम संख्या के बच्चों का सम्मान करता है। धन्यवाद! – Beriol

उत्तर

0

एक ही समय में सभी स्तरों को बनाने के बजाय, जो रैम की निरंतर संख्या से अधिक उपयोग कर सकते हैं, मुझे लगता है कि मैं रूटस्टेम के स्तर को मूल रूप से बनाऊंगा (यानी, गहराई के बजाय चौड़ाई- प्रथम)। सूची को देखते हुए, इसे आकार बी के ब्लॉक में लालच से काट दें। यदि केवल एक ब्लॉक है, तो वह जड़ है। अन्यथा, यदि अंतिम ब्लॉक में बहुत कम तत्व हैं, तो अपने तत्वों को दूसरे अंतिम ब्लॉक के साथ जितना संभव हो उतना समानता दें; दोनों में अब पर्याप्त तत्व होंगे। अगली सूची इस स्तर के प्रत्येक ब्लॉक में अंतिम तत्व शामिल है।

+0

पहले और अगले ब्लॉक सेट के बीच संबंध बनाने के बारे में क्या? मुझे लगता है कि – mangusta

+0

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

+0

@ बेरियोल आपके रास्ते में बहुत से I/O संचालन की आवश्यकता है, इसलिए हम यहाँ व्यापार करने के लिए आ रहे हैं – mangusta

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