पिछले उत्तर केवल पेड़ के विकल्प और लाल काले को संबोधित करते हैं जो शायद केवल ऐतिहासिक कारणों से बने हुए हैं।
हैश टेबल क्यों नहीं?
एक प्रकार के लिए केवल <
ऑपरेटर (तुलना) की आवश्यकता होती है जिसका उपयोग एक पेड़ की कुंजी के रूप में किया जाता है। हालाँकि, हैश टेबल के लिए आवश्यक है कि प्रत्येक कुंजी प्रकार में एक hash
फ़ंक्शन परिभाषित हो। सामान्य प्रोग्रामिंग के लिए एक न्यूनतम प्रकार की आवश्यकताओं को रखना बहुत महत्वपूर्ण है ताकि आप इसे विभिन्न प्रकार के प्रकार और एल्गोरिदम के साथ उपयोग कर सकें।
एक अच्छी हैश तालिका को डिजाइन करने के लिए उस संदर्भ का अंतरंग ज्ञान आवश्यक है जिसका उपयोग किया जाएगा। क्या इसे खुले संबोधन, या लिंक्ड चैनिंग का उपयोग करना चाहिए? आकार बदलने से पहले इसे किन स्तरों पर स्वीकार करना चाहिए? क्या यह एक महंगी हैश का उपयोग करना चाहिए जो टकराव से बचता है, या एक जो मोटा और तेज है?
चूंकि एसटीएल यह अनुमान नहीं लगा सकता है कि आपके आवेदन के लिए सबसे अच्छा विकल्प कौन सा है, इसलिए डिफ़ॉल्ट को अधिक लचीला होना चाहिए। पेड़ "बस काम" और पैमाने पर अच्छी तरह से।
(C ++ 11 में हैश टेबल्स को नहीं जोड़ा गया था unordered_map
। आप प्रलेखन से देख सकते हैं कि इसके लिए इनमें से कई विकल्पों को कॉन्फ़िगर करने के लिए नीतियां निर्धारित करने की आवश्यकता होती है।)
अन्य पेड़ों के बारे में क्या?
लाल काले पेड़ तेजी से देखने की पेशकश करते हैं और BSTs के विपरीत स्वयं संतुलन हैं। एक अन्य उपयोगकर्ता ने आत्म-संतुलन वाले एवीएल पेड़ पर इसके फायदे बताए।
अलेक्जेंडर स्टेपानोव (एसटीएल के निर्माता) ने कहा कि यदि वह std::map
फिर से लिखता है , तो वह लाल-काले पेड़ के बजाय बी * ट्री का उपयोग करेगा , क्योंकि यह आधुनिक मेमोरी कैश के लिए अधिक अनुकूल है।
तब से सबसे बड़े बदलावों में से एक है कैश का बढ़ना। कैश मिस बहुत महंगा है, इसलिए संदर्भ का स्थानीयता अब बहुत अधिक महत्वपूर्ण है। नोड-आधारित डेटा संरचनाएं, जिनमें संदर्भ की कम स्थानीयता है, बहुत कम समझ में आता है। अगर मैं आज एसटीएल डिजाइन कर रहा होता, तो मेरे पास कंटेनरों का एक अलग सेट होता। उदाहरण के लिए, एक इन-मेमोरी बी * -ट्री एक सहयोगी कंटेनर को लागू करने के लिए लाल-काले पेड़ की तुलना में कहीं बेहतर विकल्प है। - अलेक्जेंडर स्टेपानोव
क्या मानचित्रों को हमेशा पेड़ों का उपयोग करना चाहिए?
एक अन्य संभावित मानचित्र कार्यान्वयन एक क्रमबद्ध वेक्टर (प्रविष्टि प्रकार) और द्विआधारी खोज होगा। यह उन कंटेनरों के लिए अच्छा काम करेगा, जिन्हें अक्सर संशोधित नहीं किया जाता है, लेकिन अक्सर इनकी देखभाल की जाती है। मैं अक्सर के रूप में सी में यह कर qsort
और bsearch
में बनाया जाता है।
क्या मुझे मानचित्र का उपयोग करने की आवश्यकता है?
कैश के विचारों का अर्थ है कि यह शायद ही कभी उपयोग करने के लिए std::list
या उन स्थितियों के लिए भी std::deque
अधिक समझ में आता है std:vector
जो हमें स्कूल में सिखाई गई थीं (जैसे सूची के बीच से एक तत्व को निकालना)। उसी तर्क को लागू करते हुए, लूप फॉर लीनियर खोज के लिए लूप का उपयोग करना अक्सर कुछ लुकअप के लिए मानचित्र बनाने की तुलना में अधिक कुशल और क्लीनर होता है।
बेशक पठनीय कंटेनर चुनना आमतौर पर प्रदर्शन से अधिक महत्वपूर्ण है।