अपडेट: इस जॉइन ऑपरेशन के गलत होने के अपडेट के लिए नीचे देखें
यहाँ एक संभव समाधान का एक बहुत ही मोटा स्केच है:
मुझे लगता है कि मेरे पास एक प्रकार का बेतरतीब ढंग से संतुलित बी + -ट्री का उपयोग करके इस समस्या का समाधान हो सकता है। ट्रेप्स की तरह, इन पेड़ों का एक अनूठा प्रतिनिधित्व है। Treaps के विपरीत, वे कई बार कुछ चाबियाँ संग्रहीत करते हैं। यह ठीक करना संभव हो सकता है कि बेंट एट अल के "बायस्ड सर्च ट्रीज़" से एक चाल का उपयोग करके प्रत्येक कुंजी को केवल उच्चतम (यानी, निकटतम-से-रूट) स्तर पर संग्रहीत किया जाए, जिसमें वह दिखाई दे)
अनूठे मूल्यों के एक निर्धारित सेट के लिए एक पेड़ को पहले प्रत्येक मूल्य को बिट्स की एक धारा के साथ जोड़कर बनाया जाता है, उसी तरह एक ट्रीप में प्रत्येक मूल्य एक प्राथमिकता के साथ जुड़ा हुआ है। पेड़ में प्रत्येक नोड में एक कुंजी और एक बिट स्ट्रीम दोनों होते हैं। गैर-पत्ती के नोड्स होते हैं, इसके अलावा, एक प्राकृतिक संख्या उस नोड पर निहित पेड़ की ऊंचाई को दर्शाती है। आंतरिक नोड्स में बच्चों की कोई गैर-शून्य संख्या हो सकती है। बी + -ट्रीज की तरह, जड़ से पत्ती तक प्रत्येक गैर-आत्म-प्रतिच्छेद पथ समान लंबाई है।
प्रत्येक आंतरिक नोड में होता है (जैसे B + -Trees में) इसके वंशजों की सबसे बड़ी कुंजी k । हर एक को भी एक प्राकृतिक संख्या में शामिल हैं मैं पेड़ पर निहित की ऊंचाई का संकेत वी , और के साथ जुड़े बिट्स की धारा कश्मीर से मैं + 1 वें आगे सा। पेड़ पर निहित में हर कुंजी तो वी अपने बिट स्ट्रीम में एक ही पहली बिट है, के हर बच्चे को वी एक पत्ता है और मैं है 1 । अन्यथा, v के बच्चे आंतरिक नोड्स होते हैं, जिनमें से सभी में एक ही i बिट होता है जो उनकी कुंजी से जुड़ा होता है।vkivki+1vvi1vमैं
संबद्ध बिट धाराओं के साथ कुंजियों की क्रमबद्ध सूची से एक पेड़ बनाने के लिए, पहले कुंजियों को उनकी धाराओं में पहले बिट के आधार पर समूह में एकत्रित करें। इन समूहों में से प्रत्येक के लिए, समूह में सबसे बड़ी कुंजी की कुंजी और बिट स्ट्रीम के साथ एक माता-पिता बनाएं, लेकिन स्ट्रीम के पहले बिट को एलाइड करना। अब दादा-दादी बनाने के लिए नए माता-पिता पर समान समूहन प्रक्रिया करें। तब तक जारी रखें जब तक केवल एक नोड शेष न हो; यह पेड़ की जड़ है।
कुंजियों की निम्न सूची और (बिट्स की शुरुआत) इसके नीचे के पेड़ द्वारा दर्शाई गई है। बिट स्ट्रीम उपसर्गों में, एक '।' किसी भी बिट का मतलब है। यही है, कुंजी ए के लिए किसी भी बिट स्ट्रीम को 0 के साथ पहली जगह में किसी भी अन्य के समान पेड़ के उत्पादन के साथ, किसी अन्य कुंजी की बिट स्ट्रीम को अलग-अलग माना जाता है।
A 0...
B 00..
C 10..
D 0...
E 0011
F 1...
G 110.
H 0001
____H____
/ \
E H
| / \
__E__ G H
/ | \ | |
B C E G H
/ \ | / \ / \ |
A B C D E F G H
किसी विशेष आंतरिक नोड के प्रत्येक बच्चे की बिट स्ट्रीम के पहले स्थान पर एक ही बिट है। इसे जनक का "रंग" कहा जाता है - 0 लाल है, 1 हरा है। बच्चे को एक "स्वाद" होता है जो उसकी बिट स्ट्रीम की पहली बिट पर निर्भर करता है - 0 चेरी है, 1 मिंट है। पत्तों में स्वाद होता है, लेकिन कोई रंग नहीं। परिभाषा के अनुसार, एक चेरी नोड में एक हरे माता-पिता नहीं हो सकते हैं, और एक टकसाल नोड में लाल माता-पिता नहीं हो सकते हैं।
बिट धाराओं में बिट्स को मानते हुए समान वितरण से IID होते हैं, नोड
के अभिभावकों की संख्या का PMF 2 1 - n ( n - 1 है)n21 - एन
और अपेक्षित मान(n+1)/2 है। सभी के लिएn≥2, यह है≤3( एन - 1i−1)(n+1)/2n≥2, इसलिए अपेक्षित पेड़ की ऊंचाईहे(lgn)।≤34nO(lgn)
समान ऊंचाई के दो पेड़ों में शामिल होने के लिए, पहले यह देखने के लिए जांचें कि क्या उनकी जड़ें समान रंग हैं। यदि ऐसा है, तो बाएं रूट से उसके दाईं ओर का बच्चा और दाईं ओर के बाएं बच्चे से गंभीर रूप से अलग है, फिर इन दो पेड़ों को पुन: सम्मिलित करें। परिणाम एक ही ऊंचाई का पेड़ होगा या एक लंबा होगा क्योंकि पेड़ों का स्वाद एक जैसा होता है (नीचे देखें)। यदि दो पेड़ों के पुनरावर्ती रूप से जुड़ने के परिणाम में दो अलग-अलग बच्चों के समान ऊँचाई है, तो इसे जड़ के मध्य के बच्चे को बायीं जड़ के शेष बच्चों से पहले और उसके बाद दाएं मूल के शेष बच्चों के साथ बनाएं। यदि यह 1 से अधिक लंबा है, तो इसके बच्चों को एक रूट के मध्य के बच्चों को बायीं जड़ के शेष बच्चों से पहले और उसके बाद दाएं मूल के शेष बच्चों के साथ बनाएं। यदि जड़ों में अलग-अलग रंग हैं, तो यह देखने के लिए जांचें कि क्या उनका स्वाद समान है। यदि वे करते हैं, उन्हें सही मूल की कुंजी और बिट स्ट्रीम के साथ एक नया माता-पिता दें, जो पहले बिट को उजागर करता है। यदि वे नहीं करते हैं, तो प्रत्येक रूट को पुराने रूट की कुंजी और बिट स्ट्रीम (प्रत्येक पहले बिट को खत्म करना) के साथ एक नया माता-पिता दें, फिर पुन: उन पेड़ों में शामिल हों।
1/21/2O(1)1/4, और बाद के पुनरावर्ती कॉल हमेशा विभिन्न रंगों वाले पेड़ों पर होते हैं, इसलिए एक ही विश्लेषण लागू होता है।
1/2O(1)
O(1)
a 01110
b 110..
c 10...
d 00000
जिस पेड़ [a,b]
को ऊंचाई 2 से बनाया गया है, उस पेड़ [c,d]
को ऊंचाई 2 से बनाया गया है, और जिस पेड़ को बनाया गया है joinEqual (tree [a,b]) (tree [c,d])
उसकी ऊंचाई 3 है। हालांकि, जिस पेड़ को बनाया गया है [a,b,c,d]
उसकी ऊंचाई 5 है।
यह कोड मैंने इस त्रुटि को खोजने के लिए उपयोग किया है ।