2012-12-27 11 views
12

मुझे समझ में नहीं आता कि एक लिंक्ड सूची के अंत में क्यों हटाना ओ (1) समय में जाता है, क्योंकि wikipedia article कहता है।एक लिंक की गई सूची ओ (1) में क्यों हट रहा है?

एक एकल लिंक्ड सूची नोड्स से बाहर होती है। एक नोड में कुछ प्रकार का डेटा होता है, और अगले नोड का संदर्भ होता है। लिंक्ड सूची में अंतिम नोड का संदर्भ शून्य है।

-------------- --------------   -------------- 
| data | ref | -> | data | ref | -> ... -> | data | ref | 
-------------- --------------   -------------- 

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

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

-edit- शायद इस बिंदु का दृश्य कुछ और स्पष्टता देता है। लेकिन मैं नोड को हटाने और पिछले संदर्भ को शून्य के रूप में सेट करने के रूप में "नोड का विलोपन" देखता हूं।

+2

मुझे उस विकिपीडिया आलेख में ओ (1) के दो संदर्भ दिखाई देते हैं, लेकिन उनमें से कोई भी नहीं बताता है कि एकल-लिंक्ड सूची में अंतिम नोड को निकालना ओ (1) ऑपरेशन है। संभवतः, पहले से ही किसी भी नोड को हटाने के लिए आवश्यक हटाने के प्रयास के दौरान आप पहले से नोड को पॉइंटर धारण करते हैं। –

उत्तर

23

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

हालांकि, यदि आपके पास हेड पॉइंटर के अलावा सूची में कोई अतिरिक्त पॉइंटर्स नहीं है, तो आप सूची के अंत तक स्कैन किए बिना सूची के अंतिम तत्व को हटा नहीं सकते, जिसके लिए Θ (n) समय, जैसा कि आपने नोट किया है। आप बिल्कुल सही हैं कि केवल पॉइंटर्स को बदलने के बिना आखिरी नोड को हटा देना बहुत बुरा विचार होगा, क्योंकि यदि आप ऐसा करना चाहते हैं तो मौजूदा सूची में एक डिलीओटेड ऑब्जेक्ट में पॉइंटर होगा।

अधिक आम तौर पर - एकल-लिंक्ड सूची में सम्मिलन या हटाना करने की लागत ओ (1) है, मान लीजिए कि आपके पास डालने या हटाने के पहले नोड को पॉइंटर सही है। हालांकि, आपको उस नोड को खोजने के लिए अतिरिक्त कार्य करना होगा (Θ (एन) तक)।

आशा है कि इससे मदद मिलती है!

+0

यह अनुमोदित उत्तर होना चाहिए। एक बेहतर स्पष्टीकरण। –

6

अलावा/किसी भी स्थान पर किसी भी नोड का विलोपन हे है (1)। नोड को जोड़ने/हटाने के लिए कोड केवल निश्चित लागत (कुछ पॉइंटर्स गणना और मॉलोक/फ्री) के साथ खेलते हैं। यह अंकगणितीय लागत किसी भी विशिष्ट मामले के लिए तय की गई है।

हालांकि, वांछित नोड तक पहुंचने की लागत (इंडेक्सिंग) ओ (एन) है।

आलेख केवल कई उप-श्रेणियों (मध्य, शुरुआत, अंत में जोड़ना) में जोड़/हटाना सूचीबद्ध करता है ताकि यह दिखाया जा सके कि शुरुआत/अंत में जोड़ने से मध्य अंतर में जोड़ने के लिए लागत (लेकिन संबंधित लागत अभी भी तय की गई है)।

+0

मुझे अभी भी यकीन नहीं है कि अगर मैं इसे सही ढंग से समझता हूं। आप नोड ओ (1) को हटाने के रूप में हटाते हुए देखते हैं, और पिछले नोड के संदर्भ को शून्य, ओ (एन), "वांछित नोड तक पहुंचने के लिए लागत" को सेट नहीं करते हैं? मैं अर्थात् नोड को हटाने और पिछले नोड के संदर्भ को शून्य के रूप में सेट करने के रूप में हटाने को हटाता हूं। –

+0

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

0

उदाहरण के लिए, आप अंतिम ("अंत से दूसरे") से पहले तत्व के लिए पॉइंटर प्राप्त कर सकते हैं और हटाते समय: 1. इस "दूसरे से अंत" तत्व के बाद * हटाएं। 2. इसे "दूसरा से अंत" सेट करें * NULL

+0

इसके अलावा, यदि आप "अंत से दूसरे" को पॉइंटर रखते हैं तो आपको अब पॉइंटर कहा जाना होगा। – James

0

ओ (1) बस "निरंतर लागत" का अर्थ है। इसका मतलब 1 ऑपरेशन नहीं है। इसका अर्थ यह है कि "अधिकांश सी" संचालनों को सी के साथ अन्य पैरामीटर बदलने (जैसे सूची आकार) के बावजूद तय किया जा रहा है। असल में, कभी-कभी भ्रमित दुनिया में बड़े-ओह: ओ (1) == ओ (22)।

पूरी सूची को हटाने के विपरीत ओ (एन) लागत है, क्योंकि लागत सूची के आकार (एन) के साथ बदलती है।

+1

पूरी सूची हटाना ओ (1) है। पूरी सूची खाली करना ओ (एन) है। –

0

यदि आप लटकते नोड को ठीक करने की लागत समेत हैं, तो आप अंत में सेंटीनेल नोड के उपयोग के साथ ओ (1) में भी कर सकते हैं (उस पृष्ठ पर भी वर्णित)।

आपका "खाली" सूची एक भी प्रहरी

Head -> [Sentinel] 

साथ शुरू होता है कुछ सामग्री जोड़ें

Head -> 1 -> 2 -> 3 -> [Sentinel] 

अब नोड है कि 3 के रूप में अवैध था चिह्नित करके पूंछ (3) को हटाने के बाद पुरानी सेंटीनेल के लिंक को हटाने और इसके लिए मेमोरी को मुक्त करना:

Head -> 1 -> 2 -> 3 -> [Sentinel] 
Head -> 1 -> 2 -> [Sentinel] -> [Sentinel] 
Head -> 1 -> 2 -> [Sentinel] 
+0

मुझे यह पसंद है। यह समय जटिलता ओ (1) करेगा, जबकि एक अंतरिक्ष व्यापार को प्रेरित करते हुए, हालांकि यह अंतरिक्ष जटिलता ओ (एन) रखेगा। जाहिर है, जैसा कि आपने कहा था, आप सूची में सफाई के लिए ओ (एन) ऑपरेशन करने के लिए थोड़ी देर में एक बार होगा, या आप स्मृति समस्याओं में भाग सकते हैं। –

0

भविष्य के संदर्भ के लिए, मुझे कहना होगा कुछ शोध के बाद मैंने पाया कि इस प्रश्न के जवाब में प्रदान किए गए तर्कों में से कोई भी प्रासंगिक नहीं है। जवाब यह है कि हम केवल ढेर के शीर्ष के लिए लिंक की गई सूची (पूंछ की बजाय) के प्रमुख होने का निर्णय लेते हैं। यह पुश दिनचर्या में मामूली बदलाव पेश करेगा लेकिन फिर पॉप और पुश दोनों ओ (1) बने रहेंगे।

+0

@morgul कृपया जिन पोस्टों की आप समीक्षा कर रहे हैं उन्हें पढ़ें। यह * एक उत्तर है। – Rob

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