कई डेटा संरचनाएं "left-child, right-sibling" प्रतिनिधित्व नामक प्रतिनिधित्व का उपयोग करके बाइनरी पेड़ के रूप में बहु-मार्ग पेड़ों को संग्रहीत करती हैं। इसका क्या मतलब है? आप इसका इस्तेमाल क्यों करेंगे?एक पेड़ के बाएं बच्चे, दाएं-भाई का प्रतिनिधित्व क्या है? आप इसका इस्तेमाल क्यों करेंगे?
उत्तर
बाएं बच्चे, राइट-भाई प्रतिनिधित्व (LCRS) (जिसमें प्रत्येक नोड बच्चों के किसी भी संख्या हो सकती है एक वृक्ष संरचना) एक multi-way tree एन्कोडिंग का एक तरीका में एक binary tree (एक वृक्ष संरचना का उपयोग कर रहा है जो प्रत्येक नोड में अधिकतम दो बच्चे हो सकते हैं)।
प्रेरणा
कैसे इस प्रतिनिधित्व काम करता है के लिए प्रेरित करने के लिए, चलो इस एक यहाँ की तरह, एक सरल मल्टी-वे पेड़ पर विचार करके शुरू करते हैं: (! कम गुणवत्ता वाले ASCII कलाकृति के लिए क्षमा याचना)
A
//|\ \
// | \ \
B C D E F
| /|\ /\
G H I J K L
इस पेड़ की संरचना में, हम पेड़ में किसी भी नोड से अपने किसी भी बच्चे को नीचे की ओर नेविगेट कर सकते हैं। उदाहरण के लिए, हम ए से बी, ए से सी, ए से डी आदि में माइग्रेट कर सकते हैं।
अगर हम इस तरह के पेड़ में नोड का प्रतिनिधित्व करना चाहते हैं, तो हम आम तौर पर कुछ प्रकार के नोड संरचना/नोड का उपयोग करेंगे इस एक यहाँ (C++ लिखित) की तरह वर्ग:
struct Node {
DataType value;
std::vector<Node*> children;
};
LCRS प्रतिनिधित्व में, हम एक तरह से मल्टी-वे पेड़ प्रतिनिधित्व करते हैं जहां प्रत्येक नोड सबसे दो संकेत पर की आवश्यकता है। ऐसा करने के लिए, हम पेड़ को थोड़ा दोहराएंगे। अपने सभी बच्चों के लिए पेड़ की दुकान पॉइंटर्स में प्रत्येक नोड रखने के बजाय, हम प्रत्येक नोड को अपने बच्चों में से एक (एलसीआरएस, बाएं बच्चे में) के लिए एक सूचक को स्टोर करके थोड़ा अलग तरीके से पेड़ की संरचना करेंगे। इसके बाद हम प्रत्येक नोड को अपने दाहिनी भाई के लिए एक पॉइंटर स्टोर करेंगे, पेड़ में अगला नोड जो एक ही पैरेंट नोड का बच्चा होगा। ऊपर पेड़ के मामले में, हम निम्नलिखित तरीके से पेड़ का प्रतिनिधित्व कर सकते:
A
/
/
/
B -> C -> D -> E -> F
/ / /
G H->I->J K->L
सूचना है कि यह अभी भी संभव है इस नए ढांचे में एक माता पिता के नोड से अपने kth बच्चे को नेविगेट करने के लिए (शून्य अनुक्रमित) । ऐसा करने की प्रक्रिया निम्न है:
- वर्तमान नोड के बाएं बच्चे में उतरें। (यह अपने बच्चों की सूची में पहला नोड है)।
- उस बच्चे के सही भाई पॉइंटर के समय का पालन करें। (यह आपको नोड के केथ बच्चे को ले जाता है)।
- उस नोड को वापस करें।
उदाहरण के लिए, रूट नोड ए के तीसरे (शून्य-अनुक्रमित बच्चे) को खोजने के लिए, हम बाएं बच्चे (बी) में उतरेंगे, फिर तीन दाएं लिंक का पालन करें (बी, सी, डी, और जा रहे हैं) अंत में ई)। फिर हम ई के लिए नोड पर पहुंचते हैं, जिसमें नोड ए
पेड़ का प्रतिनिधित्व करने का मुख्य कारण इस तरह है कि किसी भी नोड में किसी भी बच्चे के बच्चे होने के बावजूद, प्रतिनिधित्व के लिए अधिकतम दो प्रत्येक नोड के लिए पॉइंटर्स: बाएं बच्चे को स्टोर करने के लिए एक नोड, और सही भाई को स्टोर करने के लिए एक पॉइंटर।नतीजतन, हम एक बहुत सरल नोड संरचना का उपयोग बहुमार्गीय पेड़ स्टोर कर सकते हैं:
struct Node {
DataType data;
Node* leftChild;
Node* rightSibling;
};
इस नोड संरचना एक द्विआधारी पेड़ (डेटा और दो संकेत) में एक नोड के बिल्कुल वैसा ही आकार है। नतीजतन, एलसीआरएस प्रतिनिधित्व से नोड के केवल दो पॉइंटर्स का उपयोग करके मनमानी मल्टीवे पेड़ का प्रतिनिधित्व करना संभव हो जाता है।
विश्लेषण
हमें अब बहुमार्गीय पेड़ के दो विभिन्न अभ्यावेदन और उस पर कुछ बुनियादी आपरेशन के समय और स्थान जटिलता को देखते हैं।
प्रारंभिक "बच्चों की गतिशील सरणी" प्रतिनिधित्व के लिए आवश्यक कुल स्थान उपयोग को देखकर शुरू करें। एन-नोड पेड़ के लिए कुल मेमोरी उपयोग कितना होगा? ठीक है, हम निम्नलिखित पता:
प्रत्येक नोड, बच्चों की संख्या की परवाह किए बिना, (sizeof (डेटा)) संग्रहीत कच्चे डेटा और गतिशील सरणी के अंतरिक्ष भूमि के ऊपर के लिए अंतरिक्ष योगदान देता है। गतिशील सरणी (आमतौर पर) में एक पॉइंटर संग्रहीत होता है (जो आवंटित सरणी पर इंगित करता है), गतिशील सरणी में तत्वों की कुल संख्या के लिए एक मशीन शब्द, और (वैकल्पिक रूप से) सरणी की आवंटित क्षमता के लिए एक मशीन शब्द होता है। इसका मतलब है कि प्रत्येक नोड आकार (डेटा) + आकार (नोड *) + 2 * आकार (मशीन शब्द) स्थान लेता है।
पेड़ में सभी गतिशील सरणीओं में, बच्चों के लिए एन -1 पॉइंटर्स होंगे, क्योंकि उनमें से नोड्स में एन नोड्स माता-पिता हैं। यह एक अतिरिक्त (एन -1) * आकार (नोड *) कारक में जोड़ता है।
इसलिए कुल स्थान उपयोग
n & Middot है; (आकार (डेटा) + आकार (नोड *) + 2 * आकार (मशीन शब्द)) + (एन -1) * आकार (नोड *)
= एन * आकार (डेटा) + (2 एन -1) * आकार (नोड *) + 2 एन * आकार (मशीन शब्द)
अब, एलसीआरएस पेड़ के साथ इसके विपरीत है। एक LCRS पेड़ भंडार दो संकेत (2 * sizeof (नोड *)) और एक डेटा तत्व (sizeof (डाटा)) है, इसलिए इसकी कुल स्थान
n * sizeof है (डेटा) + 2n में प्रत्येक नोड * sizeof (नोड *)
और यहाँ हम जीत देखें: लगता है कि हम कर रहे हैं नहीं 2n * sizeof (मशीन शब्द) भंडारण आवंटित सरणी आकार का ट्रैक रखने के अतिरिक्त स्मृति। इसका मतलब है कि एलसीआरएस प्रतिनिधित्व नियमित मल्टीवे पेड़ की तुलना में काफी कम स्मृति का उपयोग करता है।
हालांकि, एलसीआरएस पेड़ संरचना पर बुनियादी संचालन सामान्य बहु-मार्ग पेड़ पर उनके संबंधित संचालन से अधिक समय लेते हैं। विशेष रूप से, मानक रूप में प्रतिनिधित्व किए जाने वाले एक बहु-मार्ग पेड़ में (प्रत्येक नोड बाल पॉइंटर्स की एक सरणी संग्रहीत करता है), एक नोड से अपने केथ बच्चे में नेविगेट करने के लिए आवश्यक समय एक बिंदुओं का पालन करने के लिए आवश्यक समय तक दिया जाता है। दूसरी ओर, एलसीआरएस प्रतिनिधित्व में, ऐसा करने के लिए आवश्यक समय को के + 1 पॉइंटर्स (एक बाएं बाल सूचक, फिर के दाएं बच्चे पॉइंटर्स) का पालन करने के लिए आवश्यक समय दिया जाता है। नतीजतन, अगर पेड़ में एक बड़ा ब्रांचिंग कारक है, तो यह इसी मल्टीवे पेड़ संरचना की तुलना में एलसीआरएस वृक्ष संरचना में लुकअप करने के लिए बहुत धीमा हो सकता है।
इसलिए हम डेटा संरचना भंडारण स्थान और पहुंच के समय के बीच time-space tradeoff की पेशकश के रूप में एलसीआरएस प्रतिनिधित्व के बारे में सोच सकते हैं। एलसीआरएस के प्रतिनिधित्व में मूल मल्टीवे पेड़ की तुलना में कम मेमोरी ओवरहेड है, जबकि मल्टीवे पेड़ अपने प्रत्येक बच्चों के निरंतर समय के लुकअप देता है। या
- मेमोरी अत्यंत दुर्लभ है, :
- नोड के बच्चों की यादृच्छिक पहुंच की आवश्यकता नहीं है।
उपयोग मामले
समय अंतरिक्ष LCRS प्रतिनिधित्व में शामिल तालमेल की वजह से, LCRS प्रतिनिधित्व आम तौर पर इस्तेमाल नहीं किया है जब तक कि दो मानदंडों में से एक पकड़
केस (1) उत्पन्न हो सकता है यदि आपको मुख्य स्मृति में एक बड़े पैमाने पर विशाल मल्टीवे पेड़ को स्टोर करने की आवश्यकता होती है। उदाहरण के लिए, यदि आपको phylogenetic tree स्टोर करने की आवश्यकता होती है जिसमें कई अलग-अलग प्रजातियां होती हैं जो लगातार अपडेट के अधीन होती हैं, तो एलसीआरएस का प्रतिनिधित्व उचित हो सकता है।
केस (2) विशेष डेटा संरचनाओं में उत्पन्न होता है जिसमें वृक्ष संरचना का उपयोग बहुत विशिष्ट तरीकों से किया जा रहा है। उदाहरण के लिए, कई प्रकार के heap data structures जो मल्टीवे पेड़ का उपयोग करते हैं, एलसीआरएस प्रतिनिधित्व का उपयोग करके अंतरिक्ष अनुकूलित किया जा सकता है। इसके लिए मुख्य कारण यह है कि ढेर डाटा संरचनाओं में, सबसे आम आपरेशन होने के लिए
- एक पेड़ की जड़ निकालें जाते हैं और अपने बच्चों में से प्रत्येक की प्रक्रिया, या
- एक पेड़ बनाकर दो पेड़ों साथ जुड़ें है दूसरे का एक बच्चा
ऑपरेशन (1) एलसीआरएस प्रतिनिधित्व में बहुत कुशलता से किया जा सकता है। एक एलसीआरएस प्रतिनिधित्व में, पेड़ की जड़ में कभी भी सही बच्चा नहीं होता है (क्योंकि इसमें कोई भाई बहन नहीं है), और इसलिए रूट को हटाने का अर्थ केवल रूट नोड को छीलना और बाएं उप-भाग में उतरना है। वहां से, प्रत्येक बच्चे को बस शेष पेड़ की दाहिनी रीढ़ की हड्डी पर चलकर और प्रत्येक नोड को बदले में संसाधित करके किया जा सकता है।
ऑपरेशन (2) भी बहुत कुशलता से किया जा सकता है। ऊपर से याद रखें कि एक एलसीआरएस प्रतिनिधित्व में, एक पेड़ की जड़ में कभी सही बच्चा नहीं होता है। इसलिए, एलसीआरएस प्रतिनिधित्व में दो पेड़ों को एक साथ शामिल करना बहुत आसान है। इस तरह दो पेड़ों के साथ शुरुआत:
R1 R2
/ /
(children 1) (children 2)
हम इस तरह से एक साथ पेड़ फ्यूज कर सकते हैं:
R1
/
R2
/\
(children 2) (children 1)
यह हे में किया जा सकता (1) समय है, और काफी सरल है। तथ्य यह है कि एलसीआरएस के प्रतिनिधित्व में इस संपत्ति का अर्थ है कि binomial heap या rank-pairing heap जैसे कई प्रकार की ढेर प्राथमिकता कतारों को आम तौर पर एलसीआरएस पेड़ के रूप में दर्शाया जाता है।
आशा है कि इससे मदद मिलती है!
- 1. ग्राफविज़ बाइनरी पेड़ बाएं और दाएं बच्चे
- 2. "केवल प्रदर्शनी" का क्या अर्थ है? इसका इस्तेमाल क्यों करें?
- 3. अभिव्यक्ति पेड़ क्या हैं, आप उनका उपयोग कैसे करते हैं, और आप उनका उपयोग क्यों करेंगे?
- 4. क्लोजर में एक पेड़ का प्रतिनिधित्व
- 5. Throwable.fillInStackTrace() विधि सार्वजनिक क्यों है? कोई इसका इस्तेमाल क्यों करेगा?
- 6. विधि अधिभार। क्या आप इसका इस्तेमाल कर सकते हैं?
- 7. एमवीवीएम क्या है, और क्या इसका इस्तेमाल करना चाहिए?
- 8. कोड में रुबिक के घन का प्रतिनिधित्व कैसे करेंगे?
- 9. पेड़ का प्रतिनिधित्व करने वाले ऑब्जेक्ट्स
- 10. आप कई पतले सर्वर क्यों शुरू करेंगे?
- 11. आप बेस क्लास सदस्य क्यों मुखौटा करेंगे?
- 12. यह डिजाइन पैटर्न क्या है? इसका इस्तेमाल कैसे करें?
- 13. MySQL में लॉकिंग क्या है और आप इसका उपयोग कब करेंगे?
- 14. आप सामान्य सेवा लोकेटर का उपयोग कब करेंगे?
- 15. दावे क्या हैं? और आप उनका उपयोग क्यों करेंगे?
- 16. आप लंबित इन्टेंट का उपयोग कब करेंगे?
- 17. बी-पेड़ नोड का प्रतिनिधित्व कैसे किया जा सकता है?
- 18. आप कब और क्यों अपाचे कॉमन्स-डायजेस्टर का उपयोग करेंगे?
- 19. आप किसी शर्त में असाइनमेंट का उपयोग क्यों करेंगे?
- 20. एक्सेल में डेटा के प्रतिनिधित्व जैसे पेड़ का निर्माण करें?
- 21. जावास्क्रिप्ट विधि CollectGarbage() क्या है? कब और क्यों इसका इस्तेमाल किया जाना चाहिए?
- 22. आप सी # रनटाइम संकलन का उपयोग कहां करेंगे?
- 23. अभिव्यक्ति पेड़ का प्रतिनिधित्व करने के लिए यदि अन्य
- 24. कब और क्यों आप कक्षा को सील करेंगे?
- 25. जब आप बाईं ओर के बजाय सही बाहरी सम्मिलन का उपयोग क्यों करेंगे?
- 26. एक ग्राफ का प्रतिनिधित्व करने के
- 27. कोड अनुबंध, क्या आप उनका उपयोग करेंगे?
- 28. आप किस डिजाइन पैटर्न का चयन करेंगे?
- 29. क्या आप क्यूटी का उपयोग करते हैं और आप इसका उपयोग क्यों करते हैं?
- 30. आईफोन के साथ फोटो लें और फिर इसका इस्तेमाल करें!
यह एक अच्छा जवाब है! इससे मुझे अपने डेटा संरचना पाठ्यक्रम के लिए एलसीआरएस को समझने में मदद मिली। धन्यवाद! – stackErr
वाह! एलसीआरएस की भयानक स्पष्टीकरण! आपका बहुत बहुत धन्यवाद! – Vibhuti
क्या आप कृपया मुझे बता सकते हैं कि इस विषय पर कौन सी संदर्भ पुस्तकें चर्चा की गई हैं। इसे किसी भी में नहीं ढूंढ रहा है ... – Mahesha999