मैप और अनऑर्डर किए गए_मैप के बीच चयन कैसे करें?


84

मान लीजिए कि मैं कुंजी के रूप में एक स्ट्रिंग के साथ डेटा मैप करना चाहता था। क्या कंटेनर मुझे चुना जाना चाहिए, mapया unordered_map? unordered_mapअधिक स्मृति लेता है तो मान लें कि स्मृति कोई समस्या नहीं है, और चिंता गति है।

unordered_mapआमतौर पर O (n) की सबसे खराब स्थिति के साथ O (1) की औसत जटिलता देनी चाहिए। ओ (एन) को किन मामलों में मिलेगा? mapइससे अधिक समय कब मिलता है unordered_map? क्या यह तब होता है जब n छोटा होता है?

मान लें कि मैं unordered_mapडिफ़ॉल्ट हैमर V के साथ STL का उपयोग करूंगा । नक्शा। स्ट्रिंग कुंजी है।

यदि मैं हर बार किसी व्यक्तिगत तत्व तक पहुंचने के बजाय तत्वों पर पुनरावृति करने जा रहा हूं, तो क्या मुझे पसंद करना चाहिए map?


3
क्या आपको छांटने के लिए मानचित्रण में वस्तुओं की आवश्यकता है?
कुछ प्रोग्रामर ने

unordered_mapअधिक मेमोरी के उपयोग का कौन सा कार्यान्वयन ?
पीटर वुड

हैश मैप में आपके पास हमेशा मेमोरी ओवरहेड होता है, हालांकि यह आमतौर पर नगण्य होता है।
ypnos

यह एक मामूली बात है, लेकिन जैसा कि आप पुनरावृत्ति का उल्लेख करते हैं, यह इंगित करने योग्य है कि यदि आप तत्वों को सम्मिलित करते समय पुनरावृति करते हैं, तो आपको unordered_map पर मानचित्र का पक्ष लेना चाहिए।
जॉन मैकफ़ारलेन

जवाबों:


67

व्यवहार में, यदि मेमोरी कोई समस्या नहीं है, unordered_mapतो यदि आप सिंगल एलिमेंट एक्सेस चाहते हैं , तो यह हमेशा तेज होता है।

सबसे खराब मामला सैद्धांतिक और सभी तत्वों के लिए एक एकल हैश लेखांकन के लिए बाध्य है। यह व्यावहारिक प्रासंगिकता का नहीं है। unordered_mapधीमी जैसे ही आप एक ही हैश से संबंधित कम से कम लॉग एन तत्वों पर है के रूप में हो जाता है। यह भी व्यावहारिक प्रासंगिकता का नहीं है। कुछ विशेष परिदृश्यों में आप एक विशिष्ट हैशिंग एल्गोरिथ्म का उपयोग कर सकते हैं जो अधिक समान वितरण सुनिश्चित करता है। साधारण स्ट्रिंग्स के लिए जो एक विशिष्ट पैटर्न साझा नहीं करते हैं, जेनेरिक हैश फ़ंक्शंस unordered_mapबस के रूप में अच्छे हैं।

यदि आप मानचित्र (पुनरावृत्तियों का उपयोग करके) को क्रमबद्ध तरीके से करना चाहते हैं, तो आप उपयोग नहीं कर सकते unordered_map। इसके विपरीत, mapन केवल अनुमति देता है, बल्कि आपको कुंजी के एक अनुमान के आधार पर नक्शे में अगले तत्व भी प्रदान कर सकते हैं (देखें lower_boundऔर upper_boundतरीके)।


6
यह उत्तर भ्रामक है। यह सच नहीं है कि "unordered_map सिंगल एलीमेंट एक्सेस के लिए हमेशा तेज़ होता है" - केवल एक चीज जिसके बारे में मैं हमेशा सोच सकता हूं, वह यह है कि यह हमेशा तेजी से amortized और asymptotically है । "परिशोधित" अभ्यास में एक महत्वपूर्ण चेतावनी है: यह मानकर कि इसे किसी प्रकार की हैश टेबल के रूप में लागू किया जाता है, अगर मुझे अपने हैश टेबल को सही तरीके से याद है, जैसा कि आप इसे तत्वों को सम्मिलित करके बढ़ाते हैं, तो यह Ω (n) ऑपरेशन के साथ "हिचकी" होगा। हर बार। कोई विशेष ऐप बर्दाश्त कर सकता है या नहीं कुछ हो सकता है।
डॉन हैच

211
                       | map              | unordered_map
---------------------------------------------------------
element ordering       | strict weak      | n/a 
                       |                  |
common implementation  | balanced tree    | hash table
                       | or red-black tree|  
                       |                  |
search time            | log(n)           | O(1) if there are no hash collisions
                       |                  | Up to O(n) if there are hash collisions 
                       |                  | O(n) when hash is the same for any key
                       |                  |     
Insertion time         | log(n)+rebalance | Same as search
                       |                  | 
Deletion time          | log(n)+rebalance | Same as search
                       |                  | 
needs comparators      | only operator <  | only operator ==
                       |                  |
needs hash function    | no               | yes
                       |                  |
common use case        | when good hash is| In most other cases. 
                       | not possible or  | 
                       | too slow. Or when|
                       | order is required| 

6
सामान्य कार्यान्वयन के बारे में टिप्पणी: एक लाल-काला पेड़ एक प्रकार का संतुलित वृक्ष है (या अधिक विशेष रूप से, एक प्रकार का आत्म-संतुलन द्विआधारी खोज वृक्ष)।
17:44 पर हैलोगूडीबाई


सभी तत्वों पर ध्यान देने के बारे में क्या?
शाश्वत

7

ओ (एन) को किन मामलों में मिलेगा?

यदि आपके पास ऐसा कोई खराब हैश फ़ंक्शन है, जो सभी इनपुट हलचल के लिए एक ही हैश मान का उत्पादन करता है (अर्थात टक्करों का उत्पादन) ...

मुझे कौन सा कंटेनर चुनना चाहिए, नक्शा या unordered_map?

यह हमेशा आवश्यकताओं और आपके पास डेटा की मात्रा / राशि का प्रश्न होता है।

किसी मानचित्र को unordered_map की तुलना में अधिक समय कुशल कब मिलता है?

यह सिर्फ अलग संरचना है। आप अपने विशिष्ट उपयोग के मामलों के आधार पर उनमें से किसी एक का उपयोग करने के लिए एक चिओज़ बनाने के लिए बेहतर होगा (खाते में किस तरह का डेटा और इसकी राशि है)

क्या यह hppaen है जब n छोटा है?

छोटी डेटा राशि के मामले में सब कुछ विशेष रूप से एसटीएल कार्यान्वयन पर निर्भर करता है ... इसलिए कभी-कभी एक सादा वेक्टर / सरणी भी साहचर्य कंटेनरों की तुलना में तेज हो सकती है ...


7

मुझे कौन सा कंटेनर चुनना चाहिए, नक्शा या unordered_map? unordered_map अधिक मेमोरी लेता है तो मान लीजिए कि मेमोरी कोई समस्या नहीं है, और चिंता गति है।

प्रोफाइल और फिर तय करें। unordered_mapआम तौर पर तेजी से होता है, लेकिन यह प्रति मामले में भिन्न होता है।

ओ (एन) को किन मामलों में मिलेगा?

जब हैशिंग अच्छा नहीं है और तत्वों का एक गुच्छा एक ही डिब्बे को सौंपा जा रहा है।

किसी मानचित्र को unordered_map की तुलना में अधिक समय कुशल कब मिलता है? क्या यह छोटा है जब n छोटा है?

शायद नहीं, लेकिन यह प्रोफ़ाइल यदि आप वास्तव में देखभाल करते हैं। एक छोटे आकार के साथ एक कंटेनर होने से आपके कार्यक्रम की अड़चन बहुत कम लगती है। वैसे भी, vectorरैखिक खोज के साथ एक सरल ऐसे मामलों के लिए तेज हो सकता है।


निर्णय लेते समय सबसे महत्वपूर्ण बात यह है कि आदेशों की आवश्यकताएं और पुनरावृत्ति अमान्यता की कमी। यदि आपको जरूरत है, तो आपको बहुत अधिक उपयोग करना होगा map। अन्यथा, unordered_map


0

std :: मैप आंतरिक रूप से BST में तत्वों को संग्रहीत करता है। इसलिए, तत्वों को कुंजी के क्रमबद्ध क्रम में संग्रहीत किया जाएगा।

std :: हैश टेबल का उपयोग करते हुए unordered_map स्टोर एलिमेंट्स। इसलिए, तत्वों को किसी भी क्रम में संग्रहीत नहीं किया जाएगा। उन्हें मनमाने क्रम में संग्रहित किया जाएगा।

स्मृति उपयोग :

मैप की तुलना में unordered_map में मेमोरी का उपयोग अधिक है क्योंकि हैश टेबल के लिए भी unordered_map को स्थान की आवश्यकता होती है।

खोज तत्व के लिए समय जटिलता:

एसटीडी में तत्वों को खोजने के लिए समय की जटिलता :: नक्शा ओ (लॉग एन) है। यहां तक ​​कि सबसे खराब स्थिति में यह ओ (लॉग एन) होगा क्योंकि तत्वों को आंतरिक रूप से बैलेंस्ड बाइनरी सर्च ट्री (बीएसटी) के रूप में संग्रहीत किया जाता है।

जबकि, std :: unordered_map खोज के लिए सबसे अच्छा मामला समय जटिलता O (1) है। जहां के रूप में, यदि हैश कोड फ़ंक्शन अच्छा नहीं है, तो सबसे खराब स्थिति जटिलता ओ (एन) हो सकती है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.