ठीक है, यह सॉर्टेडलिस्ट पर एक आसान जीत है। किसी आइटम को सम्मिलित करने के लिए प्रविष्टि बिंदु खोजने के लिए बाइनरी खोज (ओ (लॉग (एन)) की आवश्यकता होती है, फिर आइटम डालने के लिए एक सूची। प्रविष्ट करें (ओ (एन))। सम्मिलित करें() हावी है, सूची को पॉप्युलेट करने के लिए ओ (एन^2)। यदि इनपुट आइटम पहले ही सॉर्ट किए गए हैं तो सम्मिलन ओ (1) में गिर जाता है लेकिन खोज को प्रभावित नहीं करता है। पॉपुलटिंग अब ओ (नलॉग (एन)) है। आप चिंता नहीं करते कि ओह कितना बड़ा है, पहले सॉर्ट करना हमेशा अधिक कुशल होता है। मान लीजिए कि आप दोगुनी स्टोरेज आवश्यकता का भुगतान कर सकते हैं।
सॉर्टेड डिक्शनरी अलग है, यह लाल-काले पेड़ का उपयोग करता है। सम्मिलन बिंदु को ढूंढने के लिए ओ (लॉग (एन)) की आवश्यकता होती है। पेड़ को पुनर्व्यवस्थित करना इसके बाद आवश्यक है, जो ओ (लॉग (एन) भी लेता है)। शब्दकोश को पॉप्युलेट करने से ओ (nlog (n)) होता है। सॉर्ट किए गए इनपुट का उपयोग सम्मिलन बिंदु या रीबैलेंसिंग खोजने के प्रयास को नहीं बदलता है, यह अभी भी ओ (nlog (एन))। अब ओह मायने रखता है, सॉर्ट किए गए इनपुट डालने के लिए वृक्ष को कोस्टा की आवश्यकता होती है खुद को पुनर्जन्म। यदि इनपुट यादृच्छिक है तो यह बेहतर काम करता है, आप सॉर्ट किए गए इनपुट नहीं चाहते हैं।
तो क्रमबद्ध इनपुट के साथ SortedList को आबाद करने और अवर्गीकृत इनपुट के साथ SortedDictionary पॉप्युलेट दोनों ओ (nlog (एन)) है। क्रमबद्ध इनपुट प्रदान करने की लागत को अनदेखा करते हुए, सॉर्टेडलिस्ट का ओह सॉर्टेड डिक्शनरी के ओह से छोटा है। सूची मेमोरी आवंटित करने के तरीके के कारण यह कार्यान्वयन विस्तार है। इसे केवल ओ (लॉग (एन)) बार करना है, एक लाल-काले पेड़ को ओ (एन) बार आवंटित करना होता है। बहुत छोटा ओह बीटीडब्ल्यू।
उल्लेखनीय है कि कोई भी सूची को पॉप्युलेट करने पर अनुकूलता से तुलना नहीं करता है, फिर सॉर्ट() को कॉल करता है। यह भी ओ (नलॉग (एन)) है। वास्तव में, यदि इनपुट पहले ही गलती से सॉर्ट किया गया है तो आप सॉर्ट() कॉल को बाईपास कर सकते हैं, यह ओ (एन) तक गिर जाता है। लागत विश्लेषण को अब इनपुट क्रमबद्ध करने के लिए किए गए प्रयासों में स्थानांतरित करने की आवश्यकता है। सॉर्ट(), ओ (एनएलओएल (एन)) की मौलिक जटिलता को बाईपास करना मुश्किल है। यह आसानी से दिखाई नहीं दे सकता है, आप एक एसक्यूएल क्वेरी कहकर इनपुट इनपुट प्राप्त कर सकते हैं। इसे पूरा करने में अधिक समय लगेगा।
या तो SortedList या SortedDictonary का उपयोग करने का बिंदु संग्रह आवेषण के बाद हल कर रखने के लिए है। यदि आप केवल पॉपुलटिंग के बारे में चिंता करते हैं लेकिन उत्परिवर्तन नहीं करते हैं तो आपको उन संग्रहों का उपयोग नहीं करना चाहिए।
स्रोत
2010-01-10 15:10:26
क्या आपने यह सुनिश्चित करने के लिए अपना कोड प्रोफाइल करने का प्रयास किया है कि आपके सॉर्ट किए गए डेटासक्चर को प्रारंभ करना वास्तव में आपके कोड में बाधा है? –
अभी तक यह एक काल्पनिक प्रश्न है, लेकिन हाँ, यह अब तक बाधा होगी। – Martin
मुझे याद नहीं है लेकिन मुझे लगता है कि मैं मान रहा था कि सभी विधियां निष्पादन में असीमित रूप से बराबर थीं और शायद उपयोग के मामले में औसत (ओ (1)) प्रदर्शन में भिन्न थीं। – Martin