2015-12-18 8 views
6

मान लें कि मैं दो एक और दोनों आकार n का ख नामित सूचियों है, और मुझे निम्नलिखित टुकड़ा कश्मीर < nअजगर सेट स्लाइस जटिलता

a[:k] = b[:k] 

साथ आपरेशन की स्थापना अजगर विकि के Time Complexity पेज में क्या करना चाहते हैं यह कहते हैं कि स्लाइस सेटिंग की जटिलता ओ (एन + के) है जहां के टुकड़े की लंबाई है। मैं समझ नहीं पा रहा हूं कि उपर्युक्त स्थिति में यह ओ (के) क्यों नहीं है।

मुझे पता है कि स्लाइसिंग एक नई सूची देता है, इसलिए यह ओ (के) है, और मुझे पता है कि सूची में निरंतर तरीके से डेटा है, इसलिए बीच में एक आइटम डालने से ओ (एन) समय लगेगा। लेकिन उपरोक्त ऑपरेशन ओ (के) समय में आसानी से किया जा सकता है। क्या मैं कुछ भूल रहा हूँ?

इसके अलावा, क्या कोई दस्तावेज है जहां मुझे ऐसे मुद्दों के बारे में विस्तृत जानकारी मिल सकती है? क्या मुझे सीपीथन कार्यान्वयन में देखना चाहिए?

धन्यवाद।

+0

चूंकि कंटेनर में 'एन' तत्वों को एक बार अनुक्रमित किया गया है, है ना? मैं कोई विशेषज्ञ नहीं हूं लेकिन यह मुझे इस तरह सादा समझ में आता है। – Abhinav

उत्तर

5

ओ (एन + के) औसत केस है, जिसमें मूल स्लाइस को प्रतिस्थापित करने के लिए डाले गए तत्वों की संख्या के लिए समायोजित करने के लिए सूची को बढ़ाने या घटाना शामिल है।

आपका मामला, जहां आप स्लाइस को बराबर संख्या में नए तत्वों से प्रतिस्थापित करते हैं, कार्यान्वयन केवल ओ (के) चरणों को लेता है। लेकिन डाले गए और हटाए गए तत्वों की संख्या के सभी संभावित संयोजन दिए गए, औसत मामले को शेष शेष तत्वों को सूची में ऊपर या नीचे ले जाना है।

सटीक कार्यान्वयन के लिए list_ass_slice function देखें।

-1

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

2

आप सही हैं, अगर आप सटीक विवरण जानना चाहते हैं तो स्रोत का उपयोग करना सबसे अच्छा है। स्लाइस सेट करने का CPython कार्यान्वयन in listobject.c है।

अगर मैं इसे सही ढंग से पढ़ें, यह होगा ...

  1. गणना कितने नए तत्व आप डालने कर रहे हैं (या हटाना!)
  2. शिफ्ट n मौजूदा करने के लिए पर्याप्त स्थान से ऊपर सूची के तत्वों नए तत्वों के लिए जगह बनाओ, सबसे खराब मामले में ओ (एन) समय लेना (जब सूची के प्रत्येक तत्व को स्थानांतरित किया जाना चाहिए)।
  3. नए तत्वों को उस स्थान पर कॉपी करें जो अभी बनाया गया था, ओ (के) समय ले रहा था।

जो ओ (एन + के) तक बढ़ता है।

बेशक, आपका मामला शायद सबसे खराब मामला नहीं है: आप सूची के अंतिम के तत्वों को बदल रहे हैं, इसलिए आपको उम्मीद की जाने वाली जटिलता को कम करने की आवश्यकता नहीं हो सकती है। हालांकि, यह सामान्य रूप से सच नहीं है।

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