2010-01-04 7 views
9

हम सभी जानते हैं कि बहुत से स्व-संतुलन बाइनरी सर्च पेड़ (बीएसटी) हैं, जो रेड-ब्लैक और एवीएल के सबसे मशहूर हैं। एए-पेड़ और ब्लेपगोएट पेड़ों को भी देखना उपयोगी हो सकता है।विशिष्ट इरादे के लिए बाइनरी सर्च ट्री

मैं किसी भी अन्य बीएसटी की तरह प्रविष्टियों और खोजों को हटाना चाहता हूं। हालांकि, किसी दिए गए सीमा में सभी मानों को हटाना, या पूरे उप-वितरण को हटाना आम बात होगी। तो:

  1. मैं ओ (लॉग एन) (संतुलित पेड़) में मूल्यों को सम्मिलित करना, खोजना, हटाना चाहता हूं।
  2. मैं एक सबट्री मिटा देना चाहते हैं पूरे वृक्ष संतुलित (लॉग एन) पेड़
  3. संतुलन से पहले (बुरी से बुरी हालत या परिशोधित)
  4. यह एक पंक्ति में कई मूल्यों को नष्ट करने के लिए उपयोगी हो सकता है, ध्यान में रखते हुए, हे में
  5. मैं सबसे अधिक बार एक बार में 2 मूल्यों डालने देंगे, हालांकि यह एक नियम (बस एक टिप मामले में एक पेड़ डेटा संरचना है कि खाते में लेता है)

नहीं है वहाँ AVL या आरबी का एक प्रकार है जो इस पर मेरी मदद करता है? स्केपगोएट-पेड़ इस तरह दिखते हैं, लेकिन कुछ बदलावों की भी आवश्यकता होगी, किसी को भी जिसने अनुभव किया है, कुछ लोगों को साझा कर सकता है?

अधिक सटीक, कौन सा संतुलन प्रक्रिया और/या हटाने की प्रक्रिया मुझे इस क्रिया को समय-कुशल रखने में मदद करेगी?

+0

ऑफ-विषय: मुझे इन प्रकार के एल्गोरिदम में रूचि है, लेकिन यह नहीं पता कि उनके बारे में कहां से शुरू करना है। कोई भी अच्छा शुरुआती संसाधन जो आप मुझे इंगित कर सकते हैं? दृश्य उदाहरणों के साथ कुछ अच्छा होगा। –

+3

कॉलिनोडेल, मुझे पूरा यकीन है कि यदि आप अपना खुद का प्रश्न पोस्ट करते हैं, तो आपको बहुत उपयोगी उत्तर मिलेंगे। –

+0

आप एक उपट्री को हटाने की क्षमता क्यों चाहते हैं? किसी भी विशेष उपखंड की सामग्री एक स्व-संतुलन वृक्ष में नाटकीय रूप से बदल सकती है। – ephemient

उत्तर

5

ओ में एक बीएसटी मूल्यों को लॉग करना संभव है (लॉग + ऑब्जेक्ट num)।

मुझे पता है कि सबसे आसान तरीका Deterministic Skip List डेटा संरचना के साथ काम करना है (आप आगे बढ़ने से पहले इस डेटा संरचना के बारे में कुछ पढ़ना चाहेंगे)। निर्धारिती छोड़ने की सूची में सभी वास्तविक मान नीचे के स्तर पर संग्रहीत होते हैं, और ऊपरी स्तर पर पॉइंटर्स होते हैं। ओ (लॉग इन) में डालें, खोजें और हटाएं।

रेंज विलोपन आपरेशन निम्नलिखित कलन विधि के अनुसार किया जा सकता है:

  • श्रेणी में पहले तत्व खोजें - ओ (logn)
  • लिंक्ड सूची में आगे जाओ, और सभी तत्वों को दूर कि अभी भी सीमा में हैं। यदि ऊपरी स्तर तक पॉइंटर्स के साथ तत्व हैं - शीर्ष स्तर तक पहुंचने तक (उन्हें हटाए गए ऑब्जेक्ट्स से हटाएं) तक पहुंचें - ओ (हटाए गए ऑब्जेक्ट्स की संख्या)
  • निर्धारक छोड़ने की सूची में फिट करने के लिए पॉइंटर्स को ठीक करें (2-3 प्रत्येक पॉइंटर ऊपर के बीच तत्व)

श्रेणी हटाने की कुल जटिलता ओ (लॉग इन + श्रेणी में वस्तुओं की संख्या) है। ध्यान दें कि यदि आप यादृच्छिक स्किप सूची के साथ काम करना चुनते हैं, तो आपको समान जटिलता मिलती है, लेकिन औसतन, और सबसे खराब स्थिति नहीं होती है। प्लस यह है कि आपको 2-3 मांगों को पूरा करने के लिए ऊपरी स्तर के पॉइंटर्स को ठीक करने की आवश्यकता नहीं है।

एक निर्धारिती छोड़ने की सूची में 2-3 पेड़ के लिए 1-1 मैपिंग है, इसलिए कुछ और काम के साथ, ऊपर वर्णित प्रक्रिया 2-3 पेड़ के लिए भी काम कर सकती है।

+2

सी ++ एसटीएल कंटेनर 'std :: set' और' std :: map' श्रेणियों को हटाने के लिए एक विधि '.asease (प्रारंभ, अंत)' प्रदान करते हैं। प्रति मानक, इसकी जटिलता ओ है (लॉग (आकार()) + श्रेणी में वस्तुओं की संख्या)। –

+2

@ जेसन, यह बहुत अच्छा है। सबसे पहले, यह अच्छा है क्योंकि इसे स्वयं लागू करने की कोई आवश्यकता नहीं है :), और दूसरा, इसका मतलब है कि मैं कुछ नया सीख सकता हूं। एवीएल पेड़ में, ऐसी प्रक्रिया लागू करने के लिए आसान नहीं है। यह देखने के लिए उपयुक्त है कि कैसे लाल-काले पेड़ लागू किए जाते हैं, और यह कैसे किया जा सकता है। – Anna

+0

धन्यवाद @ जेसन और @ एना, एक उल्लेखनीय टिप्पणी के साथ एक महान जवाब! –

2

हम्म, बी-पेड़ के बारे में क्या? वे भी संतुलित होते हैं, और यदि आप एक बड़ा आदेश चुनते हैं --- यह इस बात पर निर्भर करता है कि आपके पास कितनी वस्तुएं हैं ---, आप वस्तु निर्माण/विनाश के समय का एक समूह बचाएंगे।

से 2. यदि आपके पास ऑर्डर 100 का बी-पेड़ है, तो आप एक फ़ंक्शन कॉल द्वारा 100 आइटम निकाल सकते हैं।

से 3. यह सुविधा लगभग किसी भी पेड़ पर लागू की जा सकती है, केवल निकालेंसम() फ़ंक्शन को लागू करें जो एन आइटम को हटा देता है और पुनर्विक्रय करता है। बी-पेड़ों के लिए, यह थोड़ा सा ट्रिकियर है, लेकिन किया जा सकता है।

नोट: मुझे लगता है कि आप एक प्रोग्रामर हैं। यदि आपको एक पूर्ण, परीक्षण, ऑफ-द-शेल्फ समाधान की आवश्यकता है, तो आपको एक और जवाब चाहिए।

+0

हां, मैं एक प्रोग्रामर हूं। बी-पेड़ एक ओवरकिल होगा, लेकिन यह एक अच्छा विचार है, वैसे भी। –

3

बहुत पहले प्री-एसटीएल दिनों में मैंने अपना स्वयं का बी-ट्री (बीएसटी) एल्गोरिदम लिखा था क्योंकि उस समय मेरे पास एक बड़ा डेटा सेट था (लगभग 2 पेड़ों में लगभग 700 के आइटम जो परस्पर निर्भर थे)। मैंने पाया कि हर 100-200 प्रविष्टियों/हटाने के बाद पुनर्वितरण 486 और एसजीआई हार्डवेयर पर प्रयोग के आधार पर उस समय के चरम प्रदर्शन था। यह संख्या अब अलग हो सकती है, या हो सकता है क्योंकि यह एक एल्गोरिदमिक ऑप्टिमाइज़ेशन सीमा प्रतीत नहीं होता है जब तक कि आप समांतर मॉडल में कनवर्ट न करें।

संक्षेप में, आप पुनर्वितरण के लिए एक संशोधन ट्रिगर लागू कर सकते हैं, और जब आप अपने सभी संशोधनों को पूरा कर लेते हैं तो मजबूर पुनर्वितरण की अनुमति देते हैं।

सुधार उल्लेखनीय था। शुरुआती सीधा भार 25 मीटर (प्रक्रिया को मारने के बाद) पूरा नहीं हुआ था। जैसा कि हम गए थे पुनर्वित्त भी 15 मीटर के बाद मारा गया था। सीमित संशोधन प्रत्येक 100 मोड लोड किए गए विद्रोह के साथ लोड होता है और 3 मीटर से भी कम समय में चलाया जाता है। ध्यान दें कि "रन" भाग के दौरान, प्रारंभिक प्रविष्टि के पेड़ में 0-8 संशोधन थे। आपको वास्तव में इस बात पर विचार करने की आवश्यकता है कि क्या आपको हमेशा शेष राशि में रहने की आवश्यकता है जब पेड़ को निकट अवधि में फिर से संशोधित किया जाएगा।

+1

कोई अच्छा जवाब नहीं है, लेकिन एक अच्छी साइड-टिप्पणी। –

2

यदि प्रत्येक नोड संतुलन कारक की बजाय इसकी ऊंचाई को संग्रहीत करता है तो उसे एवीएल पेड़ में नोड और उसके उप नोड्स को हटाने के लिए आसान होना चाहिए। एक नोड को हटाने के बाद घूर्णन रखें जब तक कि दो बच्चे नोड्स एक से अधिक न हों। फिर पेड़ को ऊपर ले जाएं और दोहराएं। एक सामान्य विलोपन से एकमात्र वास्तविक अंतर ऊंचाई के परीक्षण के लिए if के बजाय while होगा।

+0

यह कुछ हद तक विचार है जो ब्लेपगोएट पेड़ों को रेखांकित करता है। हालांकि, यह भी अधिक लचीला है। –

1

ओसीएमएल मानक पुस्तकालय में Set कार्यान्वयन एक पूरी तरह से कार्यात्मक एवीएल पेड़ है जो आपकी सभी आवश्यकताओं को पूरा करता है और विशेष रूप से, सेट सैद्धांतिक परिचालन (संघ, चौराहे, अंतर) के बहुत प्रभावी कार्यान्वयन करता है। सम्मिलन और हटाना ओ (लॉग एन) हैं। आप एक सेट के रूप में और सेट अंतर का उपयोग करके उन्हें subtrees और तत्वों के रनों को हटा सकते हैं। आप एक 2-तत्व सेट और सेट यूनियन लागू करके एक साथ दो तत्वों को सम्मिलित कर सकते हैं।

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

  • कोई संबंधित समस्या नहीं^_^