सबसे पहले आपको यह समझने की आवश्यकता है कि नक्शा क्या है और आप कौन से संचालन का प्रतिनिधित्व कर रहे हैं। एक std::map
एक संतुलित बाइनरी पेड़ है, लुकअप O(log N)
संचालन लेगा, जिनमें से प्रत्येक कुंजी की तुलना में कुछ अतिरिक्त है जो आप ज्यादातर मामलों (सूचक प्रबंधन) में अनदेखा कर सकते हैं। सम्मिलन सम्मिलन के बिंदु का पता लगाने के लिए लगभग उसी समय लेता है, साथ ही नए नोड का आवंटन, पेड़ में वास्तविक सम्मिलन और पुनर्वितरण। जटिलता फिर से O(log N)
है हालांकि छुपे हुए स्थिरांक अधिक हैं।
जब आप यह निर्धारित करने का प्रयास करते हैं कि प्रविष्टि से पहले मानचित्र में कोई कुंजी है, तो आप लुकअप की लागत ले रहे हैं और यदि यह सफल नहीं होता है, तो प्रविष्टि के बिंदु का पता लगाने के लिए एक ही लागत है। आप std::map::insert
का उपयोग करके अतिरिक्त लागत से बच सकते हैं जो एक जोड़ी को एक पुनरावर्तक के साथ वापस लौटाता है और एक बूल आपको बताता है कि सम्मिलन वास्तव में हुआ था या तत्व पहले से ही वहां था।
सिवाय इसके, आप (MyStruct
सिर्फ एक int
या उनमें से हजार पकड़ सकता है) को समझने के लिए महंगा यह अपनी चाबी है, जो क्या सवाल शो से बाहर हो जाता है की तुलना करने की जरूरत है, जो कुछ आप में लेने की जरूरत है लेखा।
अंत में, यह मामला है कि एक map
अपनी आवश्यकताओं के लिए सबसे कारगर डेटा संरचना नहीं है हो सकता है, और आप या तो एक std::unordered_map
(हैश तालिका) के उपयोग पर विचार के लिए निरंतर समय सम्मिलन उम्मीद है कि (यदि हैश फंक्शन चाहते हो सकता है भयानक) या छोटे डेटा सेट के लिए भी एक सादा आदेशित सरणी (या std::vector
) सेट करता है जिस पर आप तत्वों का पता लगाने के लिए बाइनरी खोज का उपयोग कर सकते हैं (इससे अधिक महंगे प्रविष्टियों की लागत पर आवंटन की संख्या कम हो जाएगी, लेकिन यदि आयोजित प्रकार छोटे होते हैं, यह इसके लायक हो सकता है)
हमेशा प्रदर्शन के साथ, उपाय करें और फिर यह समझने की कोशिश करें कि समय कहां खर्च किया जा रहा है। यह भी ध्यान रखें कि किसी विशेष फ़ंक्शन या डेटा संरचना में बिताए गए 10% समय आपके आवेदन के आधार पर बहुत कुछ या लगभग कुछ भी नहीं हो सकता है। उदाहरण के लिए, यदि आपका एप्लिकेशन केवल डेटा सेट में लुकअप और सम्मिलन कर रहा है, और इसमें केवल 10% सीपीयू लगता है, तो आपके पास कहीं और अनुकूलित करने के लिए बहुत कुछ है!
स्रोत
2012-04-15 20:43:24
स्रोत कोड के बिना, हम वास्तव में नहीं बता सकते हैं। 'डालने' के संस्करण को भी देखें जो एक जोड़ी देता है (यह आपके दूसरे प्रश्न का उत्तर देगा) –
क्या आप अपने तुलनात्मक फ़ंक्शन पर 'MyStruct' पर जानकारी साझा कर सकते हैं कि मानचित्र भी उपयोग करता है? – amit
क्या आप बताए गए फ़ंक्शन के भीतर क्या कर रहे हैं इसके बारे में कुछ और जानकारी प्रदान कर सकते हैं? चूंकि मानचित्र की लुकअप जटिलता ओ (लॉग एन) है, मुझे यकीन नहीं है कि कोई सुधार कहाँ से आएगा। –