क्यों std :: नक्शा कार्यान्वित किया जाता है एक के रूप में लाल-काले पेड़ ?
वहाँ कई संतुलित हैं द्विआधारी खोज के पेड़ वहाँ (BSTs)। एक लाल-काले पेड़ को चुनने में डिजाइन व्यापार गत क्या थे?
क्यों std :: नक्शा कार्यान्वित किया जाता है एक के रूप में लाल-काले पेड़ ?
वहाँ कई संतुलित हैं द्विआधारी खोज के पेड़ वहाँ (BSTs)। एक लाल-काले पेड़ को चुनने में डिजाइन व्यापार गत क्या थे?
शायद दो सबसे आम आत्म संतुलन पेड़ एल्गोरिदम हैं लाल काले पेड़ों और AVL पेड़ । एक प्रविष्टि / अद्यतन दोनों एल्गोरिदम रोटेशन जहां पेड़ के नोड्स फिर से संतुलन प्रदर्शन करने के लिए घूम जाते हैं की धारणा उपयोग करने के बाद पेड़ को संतुलित करने के लिए।
दोनों डालने एल्गोरिदम में / हटाने जबकि संचालन लाल काला पेड़ फिर से संतुलन रोटेशन के मामले में हे (लॉग एन), कर रहे हैं एक है हे (1) , जबकि AVL के साथ इस एक है आपरेशन हे (लॉग एन) आपरेशन, बनाने लाल काला पेड़ फिर से संतुलन चरण के इस पहलू और संभावित कारण यह है कि यह और अधिक सामान्यतः प्रयोग किया जाता है में से एक में और अधिक कुशल।
लाल काले पेड़ों सबसे संग्रह पुस्तकालयों में उपयोग किया जाता है, जावा और माइक्रोसॉफ्ट .NET फ्रेमवर्क से प्रसाद भी शामिल है।
यह सिर्फ आपके कार्यान्वयन का विकल्प है - वे किसी भी तरह से संतुलित पेड़ के रूप में लागू किया जा सकता। विभिन्न विकल्प सभी मामूली अंतर के साथ तुलनीय है। इसलिए किसी भी किसी भी रूप में के रूप में अच्छा है।
AVL पेड़, 1.44logn की अधिकतम ऊंचाई है, जबकि आरबी पेड़ 2logn की एक अधिकतम है। एक AVL में एक तत्व सम्मिलित करना पेड़ में एक बिंदु पर एक संतुलित मतलब हो सकता है। पुनर्संतुलन प्रविष्टि खत्म। एक नया पत्ता की प्रविष्टि के बाद, कि पत्ती के पूर्वजों को अद्यतन करने के लिए, या एक बिंदु है जहां दो subtrees बराबर गहराई के हैं अप करने के लिए रूट करने के लिए किया जा सकता है। कश्मीर नोड्स अद्यतन करने के लिए होने की संभावना 1/3 ^ कश्मीर है। पुनर्संतुलन हे है (1)। एक तत्व निकाल रहा है (पेड़ का आधा गहराई तक) एक से अधिक पुनर्संतुलन मतलब हो सकता है।
आरबी के पेड़ों आदेश 4 द्विआधारी खोज के पेड़ के रूप में प्रतिनिधित्व के बी के पेड़ हैं। बराबर BST में दो स्तरों में बी-वृक्ष परिणामों में एक 4-नोड। सबसे खराब स्थिति में, सभी पेड़ के नोड्स 2-नोड्स, 3-नोड्स का केवल एक श्रृंखला के साथ एक पत्ती के लिए नीचे कर रहे हैं। यही कारण है कि पत्ती जड़ से 2logn की दूरी पर हो जाएगा।
सम्मिलन बिंदु को जड़ से नीचे जा रहा है, एक 2-नोड्स में 4-नोड्स को बदलने के लिए, सुनिश्चित करें कि किसी भी प्रविष्टि एक पत्ता को परिपूर्ण नहीं होगा बनाने के लिए है। प्रविष्टि से वापस आ रहा है, इन सभी नोड्स यकीन है कि वे सही ढंग से 4-नोड्स का प्रतिनिधित्व करने के लिए विश्लेषण किया जाना है। यह भी पेड़ में नीचे जा रहा किया जा सकता है। वैश्विक लागत ही होगा। दुनिया में कोई भी चीज मुफ्त में नहीं मिलती! पेड़ से एक तत्व निकाला जा रहा है उसी क्रम की है।
इन सभी पेड़ों की आवश्यकता है कि नोड्स ऊँचाई, वजन, रंग, आदि के बारे में जानकारी ले जाने के केवल टेढ़ा पेड़ ऐसे अतिरिक्त जानकारी से मुक्त हैं। लेकिन ज्यादातर लोगों को उनकी संरचना का ramdomness की वजह से, टेढ़ा पेड़ से डरते हैं!
अंत में, पेड़ भी नोड्स में वजन जानकारी ले जा सकता है, वजन संतुलन की अनुमति। विभिन्न योजनाओं के लिए लागू किया जा सकता है। एक संतुलित करने चाहिए जब एक सबट्री 3 से अधिक बार अन्य सबट्री के तत्वों की संख्या में शामिल हैं। पुनर्संतुलन फिर या तो एक एकल या डबल रोटेशन throuh किया जाता है। यह 2.4logn की एक सबसे खराब स्थिति का मतलब है। एक 3 के बजाय 2 बार, एक बहुत अच्छा अनुपात के साथ भाग प्राप्त कर सकते हैं, लेकिन यह थोड़ा कम है thant छोड़ने subtrees यहां असंतुलित और वहाँ के 1% हो सकता है। मुश्किल!
पेड़ किस प्रकार का सबसे अच्छा है? यकीन के लिए AVL। वे कोड करने का सबसे सरल हैं, और logn के सबसे नजदीक उनके सबसे खराब ऊंचाई कम है। 1000000 तत्वों का एक पेड़ के लिए, एक AVL ऊंचाई 29, एक आरबी 40 से ज्यादातर में हो जाएगा, और एक वजन संतुलित 36 या 50 अनुपात के आधार पर।
अनियमितता, कहते हैं, हटाता है, खोज, आदि के अनुपात: वहाँ अन्य चर का एक बहुत हैं
यह वास्तव में उपयोग पर निर्भर करता है। AVL पेड़ आमतौर पर पुनर्संतुलन के अधिक रोटेशन है। इसलिए यदि आपके आवेदन खोज पर भारी भी कई प्रविष्टि और हटाने के बाद, लेकिन वजन नहीं है, तो AVL पेड़ शायद एक अच्छा विकल्प है।
std::map के रूप में यह नोड प्रविष्टि / हटाने और खोज की गति के बीच एक उचित व्यापार बंद हो जाता है लाल काले पेड़ का उपयोग करता है।
अद्यतन 2017/06/14: के बाद टिप्पणियां webbertiger अपने जवाब को संपादित करें। मैं कहना चाहिए कि इसका जवाब अब एक बहुत मेरी आँखों के लिए बेहतर है। लेकिन मैं तो बस में अतिरिक्त जानकारी के रूप में मेरा उत्तर रखा ...
और तीसरे एक गलत प्रतिज्ञान है: तथ्य यह है मुझे लगता है कि पहले जवाब गलत नहीं है (दोनों अब और सुधार) है के कारण। मुझे लगता है कि मैं चीजों को स्पष्ट करने के लिए किया था ...
2 सबसे लोकप्रिय पेड़ AVL और लाल काला (आरबी) कर रहे हैं। उपयोग में मुख्य अंतर यह झूठ:
मुख्य अंतर यह रंग से आते हैं। क्योंकि रंग आप कभी कभी छोड़ सकते हैं या जो एक रिश्तेदार उच्च लागत है फिर से संतुलन कार्यों छोटा करने के लिए सक्षम आप AVL से आरबी पेड़ में कम फिर से संतुलन कार्रवाई की क्या ज़रूरत है। क्योंकि रंग की, आरबी पेड़ भी नोड्स के उच्च स्तर है यह काले वाले के बीच लाल नोड्स खोज (पढ़ें) थोड़ा कम कुशल सा बना (~ 2 गुणा अधिक स्तरों की संभावनाओं वाले) को स्वीकार कर सकता है, क्योंकि ... लेकिन क्योंकि यह एक है निरंतर (2x), यह (लॉग एन) ओ में रहते हैं।
आप एक पेड़ (अभिप्रायपूण) के एक संशोधन के लिए प्रदर्शन हिट वी.एस. एक पेड़ (लगभग नगण्य) के परामर्श के प्रदर्शन हिट पर विचार करते हैं, तो यह एक सामान्य मामले के लिए AVL से अधिक आरबी पसंद करते हैं करने के लिए प्राकृतिक हो जाते हैं।
पिछले जवाब केवल पेड़ विकल्प और लाल, काले संबोधित शायद ही ऐतिहासिक कारणों के लिए बनी हुई है।
क्यों नहीं एक हैश तालिका?
एक पेड़ में एक प्रकार केवल आंशिक आदेश (<तुलना) मानचित्र में एक महत्वपूर्ण के रूप में इस्तेमाल करने की आवश्यकता है। हालांकि, हैश तालिकाओं चाहते हैं कि प्रत्येक कुंजी प्रकार एक हैश समारोह में परिभाषित किया गया है। कम से कम इन प्रकार की आवश्यकताओं को ध्यान में रखते हुए सामान्य प्रोग्रामिंग के लिए बहुत महत्वपूर्ण है।
एक अच्छा हैश तालिका डिजाइनिंग संदर्भ में यह जो इसे इस्तेमाल किया जाएगा की गहन जानकारी की आवश्यकता है। इसे खोलने के लिए को संबोधित या लिंक किए गए श्रृंखलन उपयोग करना चाहिए? लोड किस स्तर को यह आकार बदलने से पहले स्वीकार करना चाहिए? ऐसा लगता है कि किसी न किसी और तेज है एक महंगी हैश कि टकराव से बचा जाता है, या एक का उपयोग करना चाहिए?
(सी ++ 11 के साथ हैश तालिकाओं जोड़ने के लिए किया था unordered_map। आप से देख सकते हैं प्रलेखन यह इन विकल्पों में से कई कॉन्फ़िगर करने के लिए नीतियां निर्धारित करने की आवश्यकता है।)
चूंकि एसटीएल आशा नहीं कर सकते हैं जो आपके आवेदन के लिए सबसे अच्छा विकल्प है, डिफ़ॉल्ट और अधिक लचीला होने की जरूरत है। पेड़ "बस काम" और अच्छी तरह से पैमाने।
क्या अन्य पेड़ों के बारे में?
लाल काला पेड़ के प्रस्ताव को तेजी से देखने और आत्म BSTs विपरीत संतुलन कर रहे हैं। एक अन्य उपयोगकर्ता आत्म संतुलन AVL पेड़ पर अपने फायदे बताया।
Alexander Stepanov (एसटीएल के निर्माता) ने कहा कि वह एक लाल काला पेड़ के बजाय एक बी * ट्री का प्रयोग करेंगे, तो उन्होंने लिखा है std::mapफिर से। इसका कारण यह है नोड्स समीपवर्ती तत्व है जो आधुनिक स्मृति कैश के लिए और अधिक अनुकूल है की एक मनमाना संख्या स्टोर कर सकते हैं।
तब से सबसे बड़ी परिवर्तनों में से एक कैश के वृद्धि हुई है। कैश छूट जाए बहुत महंगा है, इसलिए संदर्भ के इलाके अब और अधिक महत्वपूर्ण है। नोड आधारित डाटा संरचनाओं, जो संदर्भ के कम इलाके है, बहुत कम मतलब। अगर मैं आज एसटीएल डिजाइनिंग कर रहे थे, मैं कंटेनर का एक अलग सेट करना होगा। उदाहरण के लिए, एक में स्मृति बी * पेड़ एक साहचर्य कंटेनर को लागू करने के लिए एक लाल-काले पेड़ की तुलना में कहीं बेहतर विकल्प है। - Alexander Stepanov
आप और अधिक पढ़ सकते हैं यहां
लाल, काले पेड़ या बी * हमेशा सर्वश्रेष्ठ है?
अन्य अवसरों पर एलेक्स ने कहा है कि std::vectorलगभग हमेशा इसी तरह के कारणों के लिए सबसे अच्छा सूची कंटेनर है। यह शायद ही कभी समझ में उपयोग करने के लिए बनाता है std::listया std::deque(जैसे सूची के मध्य से एक तत्व को हटाने के रूप में) भी उन स्थितियों हम स्कूल में सिखाया जाता था के लिए। std::vectorइतनी तेजी से कि यह सब कुछ है लेकिन बड़े n के लिए उन संरचनाओं धड़कता है।
कि एक ही तर्क लागू करने अगर आप तत्वों का केवल एक छोटी संख्या है (सैकड़ों?) एक का उपयोग कर std::vectorऔर रैखिक खोज के पेड़ कार्यान्वयन की तुलना में अधिक कुशल हो सकता है std::map। प्रविष्टि की आवृत्ति के आधार पर, किसी क्रमित std::vectorके साथ संयुक्त std::binary_searchसबसे तेजी से विकल्प हो सकते हैं।