2011-09-08 11 views
12

के साथ मल्टीमैप बनाम मानचित्र मैं सोच रहा हूं कि कौन सा अधिक कुशल है।सेट

std::map< String, std::set<int> > 

या

std::multimap< String, int > 

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

+4

"कुशल" परिभाषित करें। –

+1

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

+0

कृपया मेरा संपादन –

उत्तर

9

यह मेरा मानना ​​है कि कार्यान्वयन निर्भर है, लेकिन एक (अन) शिक्षित अनुमान:

व्यवहार में यह पूर्णांकों की संख्या है कि आप multimap या std::set में रखते हुए किया जाएगा पर निर्भर करता है। एक multimap कुंजी की लॉग (एन) खोज के बाद मूल्यों की रैखिक खोज का सबसे अधिक उपयोग करेगा। यदि आपके पास बड़ी संख्या में पूर्णांक मान हैं, तो लॉग (एन) मानों की खोज के बाद कुंजी की लॉग (n) खोज थोड़ी तेज़ी से हो सकती है।

हालांकि, दक्षता के मामले में, map या multimap में string कुंजी के साथ कुछ भी संग्रहीत करना लगभग किसी भी मामले में अंतर से निश्चित रूप से अधिक होगा।

जैसा कि नीचे बताया गया है, multimap का उपयोग करना आसान होगा और इसे एक विशिष्ट लाभ प्रदान करने के लिए और अधिक स्पष्ट होगा।

1

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

1

std :: multimap < स्ट्रिंग, int> अधिक मेमोरी कुशल है।

+4

एक तर्क मिला? –

+0

संग्रहित संख्याओं की संख्या दोनों में समान है, लेकिन क्योंकि आप दो लाल काले पेड़ों का उपयोग कर रहे हैं, आप निरंतर की तुलना में "पुस्तक रखने" स्ट्रक्चर की संख्या से दो बार उपयोग कर रहे हैं। इसके अलावा, यह देखते हुए कि अधिकांश std :: स्ट्रिंग एसटीएल कार्यान्वयन संदर्भ गणना और लेखन अर्थशास्त्र पर प्रतिलिपि का उपयोग करते हैं, तारों द्वारा उपयोग किए जाने वाले डेटा को दोगुना नहीं किया जा सकता है। उम्मीद है कि यह समझ में आता है क्योंकि मैं इसे अपने फोन पर टाइप करता हूं। –

+1

असल में, आपने साबित नहीं किया है कि एक मानचित्र और सेट मल्टीमैप (मल्टीमैप की _additional_ बहीखाता के बारे में क्या है?) से अधिक जगह लेते हैं, लेकिन वास्तव में आप दो से अधिक पेड़ संग्रहित करेंगे। और ये लागू किए गए हैं क्योंकि पेड़ निर्दिष्ट नहीं हैं। और एसटीएल में कोई 'std' नेमस्पेस नहीं है। और, वास्तव में, मेरी टिप्पणी का उद्देश्य आपको अपने _answer_ पर एक तर्क जोड़ने में उकसाया गया था;) –

1

आप उन सवालों के जवाब अब तक (नहीं कह रही है कि आप नहीं कर रहे हैं) के साथ खुश नहीं हैं और मैं बिल्कुल जवाब देने के लिए मजबूर कर रहा हूँ, मैं दे देंगे मेरी शिक्षित "अनुमान" भी:

सम्मिलित करने के लिए, मल्टीमैप अधिक "कुशल" प्रतीत होता है। मानचित्र दृष्टिकोण के साथ, आपको पहले पुनर्प्राप्त करना होगा, फिर सेट पर ऑपरेशन करें। हटाने/पुनर्प्राप्त करने के लिए, मानचित्र अधिक "कुशल" लगता है।

4

"सेट" विकल्प कुंजी + वैल्यू जोड़े डुप्लिकेशंस को खत्म कर देगा, चाहे मल्टीमैप नहीं होगा।

0

वे वास्तव में वैसे भी समान नहीं हैं। एक multimap<X,Y> डुप्लिकेट कुंजी-मूल्य जोड़े संग्रहीत करने की अनुमति देता है, जबकि map<T, set<X>> नहीं करता है।

multimap<int, int> m; 
m.insert(make_pair(2, 3)); 
m.insert(make_pair(2, 3)); // This changes the size of m! 

जबकि

map<int, set<int>> m; 
m[2].insert(3); 
m[2].insert(3); // This does nothing. 

तो मैं सेट दृष्टिकोण का उपयोग जब तक आप कुंजी-मान जोड़ों नकल की आवश्यकता होगी। वाक्यविन्यास भी अच्छा है। मुझे उम्मीद है कि प्रदर्शन और स्मृति उपयोग में अंतर इतना अच्छा नहीं है।