2010-01-10 10 views
21

यह this one जैसे प्रश्नों की एक निरंतरता है।सॉर्टेडलिस्ट बनाम सॉर्टेड डिक्शनरी बनाम सॉर्ट करें()

क्या प्रदर्शन को बदलने के लिए कोई दिशानिर्देश हैं? मेरा मतलब बड़ा-ओ में लाभ नहीं है, बस कुछ रैखिक समय बचाओ।

उदाहरण के लिए, SortedList या SortedDictionary पर प्री-सॉर्टिंग को कितना बचाता है?

कहें कि मेरे पास 3 गुणों के साथ एक व्यक्ति वर्ग है, उनमें से एक साल में उम्र है। क्या मुझे वस्तुओं को पहले उम्र में बाल्टी करना चाहिए?

मैं पहली बार प्रकार पर एक संपत्ति है, तो जिसके परिणामस्वरूप सूची/शब्दकोश दो गुणों पर और इतने पर सॉर्ट करने के लिए उपयोग करना चाहिए?

कोई अन्य अनुकूलन जो ध्यान में रखता है?

+1

क्या आपने यह सुनिश्चित करने के लिए अपना कोड प्रोफाइल करने का प्रयास किया है कि आपके सॉर्ट किए गए डेटासक्चर को प्रारंभ करना वास्तव में आपके कोड में बाधा है? –

+1

अभी तक यह एक काल्पनिक प्रश्न है, लेकिन हाँ, यह अब तक बाधा होगी। – Martin

+0

मुझे याद नहीं है लेकिन मुझे लगता है कि मैं मान रहा था कि सभी विधियां निष्पादन में असीमित रूप से बराबर थीं और शायद उपयोग के मामले में औसत (ओ (1)) प्रदर्शन में भिन्न थीं। – Martin

उत्तर

55

ठीक है, यह सॉर्टेडलिस्ट पर एक आसान जीत है। किसी आइटम को सम्मिलित करने के लिए प्रविष्टि बिंदु खोजने के लिए बाइनरी खोज (ओ (लॉग (एन)) की आवश्यकता होती है, फिर आइटम डालने के लिए एक सूची। प्रविष्ट करें (ओ (एन))। सम्मिलित करें() हावी है, सूची को पॉप्युलेट करने के लिए ओ (एन^2)। यदि इनपुट आइटम पहले ही सॉर्ट किए गए हैं तो सम्मिलन ओ (1) में गिर जाता है लेकिन खोज को प्रभावित नहीं करता है। पॉपुलटिंग अब ओ (नलॉग (एन)) है। आप चिंता नहीं करते कि ओह कितना बड़ा है, पहले सॉर्ट करना हमेशा अधिक कुशल होता है। मान लीजिए कि आप दोगुनी स्टोरेज आवश्यकता का भुगतान कर सकते हैं।

सॉर्टेड डिक्शनरी अलग है, यह लाल-काले पेड़ का उपयोग करता है। सम्मिलन बिंदु को ढूंढने के लिए ओ (लॉग (एन)) की आवश्यकता होती है। पेड़ को पुनर्व्यवस्थित करना इसके बाद आवश्यक है, जो ओ (लॉग (एन) भी लेता है)। शब्दकोश को पॉप्युलेट करने से ओ (nlog (n)) होता है। सॉर्ट किए गए इनपुट का उपयोग सम्मिलन बिंदु या रीबैलेंसिंग खोजने के प्रयास को नहीं बदलता है, यह अभी भी ओ (nlog (एन))। अब ओह मायने रखता है, सॉर्ट किए गए इनपुट डालने के लिए वृक्ष को कोस्टा की आवश्यकता होती है खुद को पुनर्जन्म। यदि इनपुट यादृच्छिक है तो यह बेहतर काम करता है, आप सॉर्ट किए गए इनपुट नहीं चाहते हैं।

तो क्रमबद्ध इनपुट के साथ SortedList को आबाद करने और अवर्गीकृत इनपुट के साथ SortedDictionary पॉप्युलेट दोनों ओ (nlog (एन)) है। क्रमबद्ध इनपुट प्रदान करने की लागत को अनदेखा करते हुए, सॉर्टेडलिस्ट का ओह सॉर्टेड डिक्शनरी के ओह से छोटा है। सूची मेमोरी आवंटित करने के तरीके के कारण यह कार्यान्वयन विस्तार है। इसे केवल ओ (लॉग (एन)) बार करना है, एक लाल-काले पेड़ को ओ (एन) बार आवंटित करना होता है। बहुत छोटा ओह बीटीडब्ल्यू।

उल्लेखनीय है कि कोई भी सूची को पॉप्युलेट करने पर अनुकूलता से तुलना नहीं करता है, फिर सॉर्ट() को कॉल करता है। यह भी ओ (नलॉग (एन)) है। वास्तव में, यदि इनपुट पहले ही गलती से सॉर्ट किया गया है तो आप सॉर्ट() कॉल को बाईपास कर सकते हैं, यह ओ (एन) तक गिर जाता है। लागत विश्लेषण को अब इनपुट क्रमबद्ध करने के लिए किए गए प्रयासों में स्थानांतरित करने की आवश्यकता है। सॉर्ट(), ओ (एनएलओएल (एन)) की मौलिक जटिलता को बाईपास करना मुश्किल है। यह आसानी से दिखाई नहीं दे सकता है, आप एक एसक्यूएल क्वेरी कहकर इनपुट इनपुट प्राप्त कर सकते हैं। इसे पूरा करने में अधिक समय लगेगा।

या तो SortedList या SortedDictonary का उपयोग करने का बिंदु संग्रह आवेषण के बाद हल कर रखने के लिए है। यदि आप केवल पॉपुलटिंग के बारे में चिंता करते हैं लेकिन उत्परिवर्तन नहीं करते हैं तो आपको उन संग्रहों का उपयोग नहीं करना चाहिए।

+2

सिडेनोट: यदि डेटा को गैर-तुलनात्मक विधि जैसे रेडिक्स सॉर्ट का उपयोग करके सॉर्ट किया जा सकता है तो सॉर्टिंग छद्म-रैखिक हो सकती है (इनपुट की तुलना में "रेडिक्स" की लंबाई के आधार पर) ओ (एन) समय तक गिर जाती है बिना छेड़छाड़ किए गए इनपुट के लिए भी सॉर्ट करें, जिस स्थिति में एक सूची बनाना और सॉर्ट() का उपयोग करना तेज हो सकता है। – apokryfos

+0

वास्तव में सहायक उत्तर, धन्यवाद! – namford

संबंधित मुद्दे