वेट बैलेंस्ड ट्री: Difference between revisions
No edit summary |
No edit summary |
||
Line 38: | Line 38: | ||
== संचालन और | == संचालन और बल्क ऑपरेशन == | ||
भार-संतुलित पेड़ों पर कई सेट ऑपरेशन परिभाषित किए गए हैं: संघ, प्रतिच्छेदन और सेट अंतर। फिर इन सेट फ़ंक्शंस के आधार पर सम्मिलन या विलोपन पर तेज़ बल्क ऑपरेशन लागू किया जा सकता है। ये सेट ऑपरेशन दो सहायक ऑपरेशन, स्प्लिट और जॉइन पर निर्भर करते हैं। नए संचालन के साथ, वजन-संतुलित पेड़ों का कार्यान्वयन अधिक कुशल और अत्यधिक-समानांतर हो सकता है।<ref name="join-based">{{citation | |||
| last1 = Blelloch | first1 = Guy E. | | last1 = Blelloch | first1 = Guy E. | ||
| last2 = Ferizovic | first2 = Daniel | | last2 = Ferizovic | first2 = Daniel | ||
Line 56: | Line 56: | ||
| url = https://groups.csail.mit.edu/mac/users/adams/BB/92-10.ps.gz | | url = https://groups.csail.mit.edu/mac/users/adams/BB/92-10.ps.gz | ||
}}.</ref> | }}.</ref> | ||
*जुड़ें: फ़ंक्शन जॉइन दो वजन-संतुलित पेड़ों | *जुड़ें: फ़ंक्शन जॉइन दो वजन-संतुलित पेड़ों {{math|''t''<sub>1</sub>}} और {{math|''t''<sub>2</sub>}} और एक कुंजी {{mvar|k}} पर है और एक पेड़ लौटाएगा जिसमें {{math|''t''<sub>1</sub>}}, {{math|''t''<sub>2</sub>}} और साथ ही {{mvar|k}} सभी तत्व शामिल होंगे। इसके लिए आवश्यक है कि {{mvar|k}}, {{math|''t''<sub>1</sub>}} की सभी कुंजियों से बड़ा हो और {{math|''t''<sub>2</sub>}} की सभी कुंजियों से छोटा हो। यदि दो पेड़ों का वजन संतुलित है, तो बाएं सबट्री {{math|''t''<sub>1</sub>}}, रूट के और दाएं सबट्री {{math|''t''<sub>2</sub>}} के साथ एक नया नोड बनाएं। मान लीजिए कि {{math|''t''<sub>1</sub>}} का वजन {{math|''t''<sub>2</sub>}} से अधिक है। जॉइन {{math|''t''<sub>1</sub>}} की दाहिनी रीढ़ का अनुसरण करता है जब तक कि एक नोड {{mvar|c}} जो {{math|''t''<sub>2</sub>}} के साथ संतुलित न हो जाए। इस बिंदु पर {{mvar|c}} को बदलने के लिए बाएँ चाइल्ड {{mvar|c}}, रूट{{mvar| k}} और दाएँ चाइल्ड {{math|''t''<sub>2</sub>}} के साथ एक नया नोड बनाया जाता है। नया नोड हो सकता है वज़न-संतुलित अपरिवर्तनीय को अमान्य करें इसे एक या दो बार घुमाकर ठीक किया जा सकता है। <math>\alpha < 1 - \frac{1}{\sqrt{2}}</math> | ||
*विभाजन: वजन-संतुलित पेड़ को दो छोटे पेड़ों में विभाजित करने के लिए, जो कुंजी x से छोटे हैं, और जो कुंजी x से बड़े हैं, पहले पेड़ में x डालकर जड़ से एक पथ बनाएं। इस प्रविष्टि के बाद, x से कम के सभी मान पथ के बाईं ओर मिलेंगे, और x से बड़े सभी मान दाईं ओर मिलेंगे। जॉइन लागू करने से, बायीं ओर के सभी उपवृक्षों को नीचे से ऊपर तक मध्यवर्ती नोड्स के रूप में पथ पर कुंजियों का उपयोग करके बाएँ वृक्ष बनाने के लिए नीचे से ऊपर की ओर मर्ज किया जाता है, और दायाँ भाग सममित होता है। कुछ अनुप्रयोगों के लिए, स्प्लिट एक बूलियन मान भी लौटाता है जो दर्शाता है कि पेड़ में x दिखाई देता है या नहीं। स्प्लिट की लागत है <math>O(\log n)</math>, पेड़ की ऊंचाई का क्रम. इस एल्गोरिदम का वास्तव में वजन-संतुलित पेड़ के किसी विशेष गुण से कोई लेना-देना नहीं है, और इस प्रकार यह एवीएल पेड़ जैसी अन्य संतुलन योजनाओं के लिए सामान्य है। | *विभाजन: वजन-संतुलित पेड़ को दो छोटे पेड़ों में विभाजित करने के लिए, जो कुंजी x से छोटे हैं, और जो कुंजी x से बड़े हैं, पहले पेड़ में x डालकर जड़ से एक पथ बनाएं। इस प्रविष्टि के बाद, x से कम के सभी मान पथ के बाईं ओर मिलेंगे, और x से बड़े सभी मान दाईं ओर मिलेंगे। जॉइन लागू करने से, बायीं ओर के सभी उपवृक्षों को नीचे से ऊपर तक मध्यवर्ती नोड्स के रूप में पथ पर कुंजियों का उपयोग करके बाएँ वृक्ष बनाने के लिए नीचे से ऊपर की ओर मर्ज किया जाता है, और दायाँ भाग सममित होता है। कुछ अनुप्रयोगों के लिए, स्प्लिट एक बूलियन मान भी लौटाता है जो दर्शाता है कि पेड़ में x दिखाई देता है या नहीं। स्प्लिट की लागत है <math>O(\log n)</math>, पेड़ की ऊंचाई का क्रम. इस एल्गोरिदम का वास्तव में वजन-संतुलित पेड़ के किसी विशेष गुण से कोई लेना-देना नहीं है, और इस प्रकार यह एवीएल पेड़ जैसी अन्य संतुलन योजनाओं के लिए सामान्य है। | ||
जॉइन एल्गोरिदम इस प्रकार है: | जॉइन एल्गोरिदम इस प्रकार है: | ||
'''function''' joinRightWB(T<sub>L</sub>, k, T<sub>R</sub>) | |||
( | (l, k', c) = expose(T<sub>L</sub>) | ||
'''if''' balance(|T<sub>L</sub>|, |T<sub>R</sub>|) '''return''' Node(T<sub>L</sub>, k, T<sub>R</sub>) | |||
'''else''' | |||
T' = joinRightWB(c, k, T<sub>R</sub>) | |||
( | (l', k', r') = expose(T') | ||
'''if''' (balance(|l|,|T'|)) '''return''' Node(l, k', T') | |||
'''else if''' (balance(|l|,|l'|) and balance(|l|+|l'|,|r'|)) | |||
'''return''' rotateLeft(Node(l, k', T')) | |||
'''else''' return rotateLeft(Node(l, k', rotateRight(T')) | |||
'''function''' joinLeftWB(T<sub>L</sub>, k, T<sub>R</sub>) | |||
/* symmetric to joinRightWB */ | |||
'''function''' join(T<sub>L</sub>, k, T<sub>R</sub>) | |||
'''if''' (heavy(T<sub>L</sub>, T<sub>R</sub>)) return joinRightWB(T<sub>L</sub>, k, T<sub>R</sub>) | |||
'''if''' (heavy(T<sub>R</sub>, T<sub>L</sub>)) return joinLeftWB(T<sub>L</sub>, k, T<sub>R</sub>) | |||
Node(T<sub>L</sub>, k, T<sub>R</sub>) | |||
यहाँ संतुलन<math>(x, y)</math> | यहाँ संतुलन<math>(x, y)</math> का अर्थ है दो भार <math>x</math> और <math>y</math> संतुलित हैं. एक्सपोज़(v)=(l, k, r) का अर्थ है एक ट्री नोड निकालना <math>v</math> का लेफ्ट चाइल्ड <math>l</math>, नोड की कुंजी <math>k</math> और राइट चाइल्ड <math>r</math>. नोड का अर्थ है लेफ्ट चाइल्ड का नोड बनाना <math>l</math>, कुंजी <math>k</math> और राइट चाइल्ड <math>r</math> का नोड बनाता है। | ||
विभाजन एल्गोरिथ्म इस प्रकार है: | विभाजन एल्गोरिथ्म इस प्रकार है: |
Revision as of 21:08, 10 August 2023
कंप्यूटर विज्ञान में, वज़न-संतुलित बाइनरी ट्री (डब्ल्यूबीटी) एक प्रकार के स्व-संतुलित बाइनरी सर्च ट्री हैं जिनका उपयोग गतिशील सेट, शब्दकोश और अनुक्रमों को लागू करने के लिए किया जा सकता है।[1] इन पेड़ों को 1970 के दशक में नीवरगेल्ट और रींगोल्ड द्वारा परिबद्ध संतुलन के पेड़, या BB [α] पेड़ों के रूप में पेश किया गया था।[2][3] उनका अधिक प्रचलित नाम डोनाल्ड नुथ के कारण है।[4]
एक प्रसिद्ध उदाहरण एक कॉर्पस की हफ़मैन कोडिंग है।
अन्य स्व-संतुलन पेड़ों की तरह, डब्ल्यूबीटी अपने नोड्स में संतुलन से संबंधित बहीखाता जानकारी संग्रहीत करते हैं और सम्मिलन या विलोपन संचालन से परेशान होने पर संतुलन को बहाल करने के लिए घूर्णन करते हैं। विशेष रूप से, प्रत्येक नोड नोड पर निहित उपवृक्ष के आकार को संग्रहीत करता है, और बाएँ और दाएँ उपवृक्ष के आकार को एक दूसरे के कुछ कारक के भीतर रखा जाता है। AVL ट्री और लाल-काले पेड़ों में संतुलन जानकारी के विपरीत, डब्ल्यूबीटी में बहीखाता जानकारी वास्तव में अनुप्रयोगों के लिए एक उपयोगी संपत्ति है: तत्वों की संख्या एक पेड़ में इसकी जड़ के आकार के बराबर होता है, और आकार की जानकारी बिल्कुल एक ऑर्डर स्टेटिस्टिक ट्री के संचालन को लागू करने के लिए आवश्यक जानकारी होती है, जैसे, किसी सेट में n' का सबसे बड़ा तत्व प्राप्त करना या किसी तत्व के सूचकांक का निर्धारण करना होता है।[5]
वज़न-संतुलित पेड़ कार्यात्मक प्रोग्रामिंग समुदाय में लोकप्रिय हैं और एमआईटी योजना, एसएलआईबी और हास्केल के कार्यान्वयन में सेट और मानचित्रों को लागू करने के लिए उपयोग किए जाते हैं।[6][4]
विवरण
भार-संतुलित वृक्ष एक द्विआधारी खोज वृक्ष है जो नोड्स में उपवृक्षों के आकार को संग्रहीत करता है। यानी एक नोड में फ़ील्ड होते हैं
- की (कुंजी), किसी भी आदेशित प्रकार को परिभाषित करती है।
- वैल्यू (वैकल्पिक, केवल मैपिंग के लिए) होता है।
- लेफ्ट, राइट, पॉइंटर से नोड तक फ़ील्ड होते हैं।
- साइज, पूर्णांक प्रकार का आकार होता है।
परिभाषा के अनुसार, एक पत्ती का आकार (आमतौर पर a द्वारा दर्शाया जाता है nil सूचक) शून्य है. एक आंतरिक नोड का आकार उसके दो बच्चों के आकार का योग है, प्लस एक: (size[n] = size[n.left] + size[n.right] + 1) आकार के आधार पर, वजन को वजन के रूप में परिभाषित किया जाता है। weight[n] = size[n] + 1[lower-alpha 1]
पेड़ को संशोधित करने वाले संचालन को यह सुनिश्चित करना चाहिए कि एवीएल पेड़ों में उपयोग किए जाने वाले समान पुनर्संतुलन संचालन का उपयोग करके प्रत्येक नोड के बाएं और दाएं उप-वृक्षों का वजन एक-दूसरे के कुछ कारक α के भीतर रहे: रोटेशन और डबल रोटेशन औपचारिक रूप से, नोड संतुलन को इस प्रकार परिभाषित किया गया है:
- एक नोड α-भार-संतुलित है यदि weight[n.left] ≥ α·weight[n] और weight[n.right] ≥ α·weight[n].[7]
यहाँ, α वजन संतुलित पेड़ों को लागू करते समय निर्धारित किया जाने वाला एक संख्यात्मक पैरामीटर है। α के बड़े मान "अधिक संतुलित" पेड़ उत्पन्न करते हैं, लेकिन α के सभी मान उपयुक्त नहीं होते हैं; नीवरगेल्ट और रींगोल्ड ने यह साबित किया है।
संतुलन एल्गोरिदम के काम करने के लिए एक आवश्यक शर्त है। बाद के काम में α के लिए 2⁄11 की निचली सीमा दिखाई गई, हालाँकि यदि एक कस्टम (और अधिक जटिल) पुनर्संतुलन एल्गोरिथ्म का उपयोग किया जाता है तो इसे मनमाने ढंग से छोटा किया जा सकता है।[7]
संतुलन को सही ढंग से लागू करने से यह गारंटी मिलती है कि n तत्वों की ऊंचाई होगी।[7]
n सम्मिलन और विलोपन के अनुक्रम में आवश्यक संतुलन संचालन की संख्या n में रैखिक है, यानी, संतुलन एक अमूर्त अर्थ में ओवरहेड की निरंतर मात्रा लेता है।[8]
जबकि न्यूनतम खोज लागत के साथ एक पेड़ को बनाए रखने के लिए सम्मिलित/हटाने के संचालन में चार प्रकार के दोहरे घुमाव (एवीएल पेड़ में एलएल, एलआर, आरएल, आरआर) की आवश्यकता होती है, अगर हम केवल लॉगरिदमिक प्रदर्शन की इच्छा रखते हैं, तो एलआर और आरएल ही एकमात्र घुमाव हैं। एकल टॉप-डाउन पास में होता है।[9]
संचालन और बल्क ऑपरेशन
भार-संतुलित पेड़ों पर कई सेट ऑपरेशन परिभाषित किए गए हैं: संघ, प्रतिच्छेदन और सेट अंतर। फिर इन सेट फ़ंक्शंस के आधार पर सम्मिलन या विलोपन पर तेज़ बल्क ऑपरेशन लागू किया जा सकता है। ये सेट ऑपरेशन दो सहायक ऑपरेशन, स्प्लिट और जॉइन पर निर्भर करते हैं। नए संचालन के साथ, वजन-संतुलित पेड़ों का कार्यान्वयन अधिक कुशल और अत्यधिक-समानांतर हो सकता है।[10][11]
- जुड़ें: फ़ंक्शन जॉइन दो वजन-संतुलित पेड़ों t1 और t2 और एक कुंजी k पर है और एक पेड़ लौटाएगा जिसमें t1, t2 और साथ ही k सभी तत्व शामिल होंगे। इसके लिए आवश्यक है कि k, t1 की सभी कुंजियों से बड़ा हो और t2 की सभी कुंजियों से छोटा हो। यदि दो पेड़ों का वजन संतुलित है, तो बाएं सबट्री t1, रूट के और दाएं सबट्री t2 के साथ एक नया नोड बनाएं। मान लीजिए कि t1 का वजन t2 से अधिक है। जॉइन t1 की दाहिनी रीढ़ का अनुसरण करता है जब तक कि एक नोड c जो t2 के साथ संतुलित न हो जाए। इस बिंदु पर c को बदलने के लिए बाएँ चाइल्ड c, रूट k और दाएँ चाइल्ड t2 के साथ एक नया नोड बनाया जाता है। नया नोड हो सकता है वज़न-संतुलित अपरिवर्तनीय को अमान्य करें इसे एक या दो बार घुमाकर ठीक किया जा सकता है।
- विभाजन: वजन-संतुलित पेड़ को दो छोटे पेड़ों में विभाजित करने के लिए, जो कुंजी x से छोटे हैं, और जो कुंजी x से बड़े हैं, पहले पेड़ में x डालकर जड़ से एक पथ बनाएं। इस प्रविष्टि के बाद, x से कम के सभी मान पथ के बाईं ओर मिलेंगे, और x से बड़े सभी मान दाईं ओर मिलेंगे। जॉइन लागू करने से, बायीं ओर के सभी उपवृक्षों को नीचे से ऊपर तक मध्यवर्ती नोड्स के रूप में पथ पर कुंजियों का उपयोग करके बाएँ वृक्ष बनाने के लिए नीचे से ऊपर की ओर मर्ज किया जाता है, और दायाँ भाग सममित होता है। कुछ अनुप्रयोगों के लिए, स्प्लिट एक बूलियन मान भी लौटाता है जो दर्शाता है कि पेड़ में x दिखाई देता है या नहीं। स्प्लिट की लागत है , पेड़ की ऊंचाई का क्रम. इस एल्गोरिदम का वास्तव में वजन-संतुलित पेड़ के किसी विशेष गुण से कोई लेना-देना नहीं है, और इस प्रकार यह एवीएल पेड़ जैसी अन्य संतुलन योजनाओं के लिए सामान्य है।
जॉइन एल्गोरिदम इस प्रकार है:
function joinRightWB(TL, k, TR) (l, k', c) = expose(TL) if balance(|TL|, |TR|) return Node(TL, k, TR) else T' = joinRightWB(c, k, TR) (l', k', r') = expose(T') if (balance(|l|,|T'|)) return Node(l, k', T') else if (balance(|l|,|l'|) and balance(|l|+|l'|,|r'|)) return rotateLeft(Node(l, k', T')) else return rotateLeft(Node(l, k', rotateRight(T')) function joinLeftWB(TL, k, TR) /* symmetric to joinRightWB */ function join(TL, k, TR) if (heavy(TL, TR)) return joinRightWB(TL, k, TR) if (heavy(TR, TL)) return joinLeftWB(TL, k, TR) Node(TL, k, TR)
यहाँ संतुलन का अर्थ है दो भार और संतुलित हैं. एक्सपोज़(v)=(l, k, r) का अर्थ है एक ट्री नोड निकालना का लेफ्ट चाइल्ड , नोड की कुंजी और राइट चाइल्ड . नोड का अर्थ है लेफ्ट चाइल्ड का नोड बनाना , कुंजी और राइट चाइल्ड का नोड बनाता है।
विभाजन एल्गोरिथ्म इस प्रकार है:
फ़ंक्शन स्प्लिट (टी, के) यदि (T = शून्य) वापसी (शून्य, गलत, शून्य) (एल, (एम, सी), आर) = एक्सपोज़ (टी) यदि (k = m) वापसी (L, सत्य, R) यदि (k <m) (एल', बी, आर') = विभाजित(एल, के) वापसी (एल', बी, जुड़ें (आर', एम, आर)) यदि (k > m) (एल', बी, आर') = विभाजित(आर, के) वापसी (जुड़ें (एल, एम, एल'), बी, आर))
दो भार-संतुलित पेड़ों का मिलन t1 और t2 सेट का प्रतिनिधित्व करना A और B, एक वजन-संतुलित पेड़ है t जो प्रतिनिधित्व करता है A ∪ B. निम्नलिखित पुनरावर्ती फ़ंक्शन इस संघ की गणना करता है:
फ़ंक्शन यूनियन(t1, टी2): यदि टी1 = शून्य: वापसी टी2
यदि टी2 = शून्य:
वापसी टी1
टी<, टी> ← विभाजित टी2 टी पर1।जड़
रिटर्न जॉइन(यूनियन(बाएं(टी)1), टी<), टी1.रूट, यूनियन(दाएं(t1), टी>))
यहां, स्प्लिट को दो पेड़ों को वापस करने के लिए माना जाता है: एक कुंजी को अपनी इनपुट कुंजी से कम रखता है, एक बड़ी कुंजी को रखता है। (एल्गोरिदम लगातार डेटा संरचना है | गैर-विनाशकारी, लेकिन एक इन-प्लेस विनाशकारी संस्करण भी मौजूद है।)
प्रतिच्छेदन या अंतर के लिए एल्गोरिथ्म समान है, लेकिन इसके लिए Join2 हेल्पर रूटीन की आवश्यकता होती है जो कि Join के समान है लेकिन मध्य कुंजी के बिना। संघ, प्रतिच्छेदन या अंतर के नए कार्यों के आधार पर, वजन-संतुलित पेड़ में या तो एक कुंजी या एकाधिक कुंजी डाली जा सकती है या हटाई जा सकती है। चूंकि स्प्लिट और यूनियन जॉइन को कॉल करते हैं लेकिन वजन-संतुलित पेड़ों के संतुलन मानदंडों से सीधे निपटते नहीं हैं, ऐसे कार्यान्वयन को आमतौर पर जॉइन-आधारित ट्री एल्गोरिदम | जॉइन-आधारित एल्गोरिदम कहा जाता है।
मिलन, प्रतिच्छेद और भेद प्रत्येक की जटिलता है आकार के दो वजन-संतुलित पेड़ों के लिए और . तुलनाओं की संख्या की दृष्टि से यह जटिलता इष्टतम है। अधिक महत्वपूर्ण बात यह है कि चूंकि संघ, प्रतिच्छेदन या अंतर के लिए पुनरावर्ती कॉल एक-दूसरे से स्वतंत्र हैं, इसलिए उन्हें समानांतर एल्गोरिदम के विश्लेषण के साथ समानांतर प्रोग्रामिंग निष्पादित की जा सकती है। .[10]कब यदि बड़े पेड़ की जड़ का उपयोग छोटे पेड़ को विभाजित करने के लिए किया जाता है, तो जॉइन-आधारित कार्यान्वयन में एकल-तत्व सम्मिलन और विलोपन के समान कम्प्यूटेशनल निर्देशित अचक्रीय ग्राफ (डीएजी) होता है।
टिप्पणियाँ
संदर्भ
- ↑ Tsakalidis, A. K. (1984). "सामान्यीकृत लिंक्ड सूची में क्रम बनाए रखना". Acta Informatica. 21: 101–112. doi:10.1007/BF00289142.
- ↑ Nievergelt, J.; Reingold, E. M. (1973). "बाउंडेड बैलेंस के बाइनरी सर्च ट्री". SIAM Journal on Computing. 2: 33–43. doi:10.1137/0202005.
- ↑ This article incorporates public domain material from Black, Paul E. "BB(α) tree". Dictionary of Algorithms and Data Structures.
- ↑ 4.0 4.1 4.2 Hirai, Y.; Yamamoto, K. (2011). "वजन-संतुलित पेड़ों को संतुलित करना" (PDF). Journal of Functional Programming. 21 (3): 287. doi:10.1017/S0956796811000104.
- ↑ Roura, Salvador (2001). बाइनरी सर्च ट्री को संतुलित करने की एक नई विधि. ICALP. Lecture Notes in Computer Science. Vol. 2076. pp. 469–480. doi:10.1007/3-540-48224-5_39. ISBN 978-3-540-42287-7.
- ↑ 6.0 6.1 Adams, Stephen (1993). "Functional Pearls: Efficient sets—a balancing act". Journal of Functional Programming. 3 (4): 553–561. doi:10.1017/S0956796800000885.
- ↑ 7.0 7.1 7.2 Brass, Peter (2008). उन्नत डेटा संरचनाएँ. Cambridge University Press. pp. 61–71.
- ↑ Blum, Norbert; Mehlhorn, Kurt (1980). "वजन-संतुलित पेड़ों में पुनर्संतुलन कार्यों की औसत संख्या पर" (PDF). Theoretical Computer Science. 11 (3): 303–320. doi:10.1016/0304-3975(80)90018-3.
- ↑ Cho, Seonghun; Sahni, Sartaj (2000). "एक नया वजन संतुलित बाइनरी सर्च ट्री". International Journal of Foundations of Computer Science. 11 (3): 485–513. doi:10.1142/S0129054100000296.
- ↑ 10.0 10.1 Blelloch, Guy E.; Ferizovic, Daniel; Sun, Yihan (2016), "Just Join for Parallel Ordered Sets", Symposium on Parallel Algorithms and Architectures, Proc. of 28th ACM Symp. Parallel Algorithms and Architectures (SPAA 2016), ACM, pp. 253–264, arXiv:1602.02120, doi:10.1145/2935764.2935768, ISBN 978-1-4503-4210-0.
- ↑ Adams, Stephen (1992), Implementing sets efficiently in a functional language, CiteSeerX 10.1.1.501.8427.