किसी सरणी के बजाय लिंक की गई सूची का उपयोग करने के लिए ठोस नियम क्या हैं?


18

जब आप सस्ते प्रविष्टि और तत्वों को हटाना चाहते हैं तो लिंक की गई सूची का उपयोग किया जा सकता है और जब यह कोई फर्क नहीं पड़ता कि तत्व स्मृति में एक दूसरे के बगल में नहीं हैं।

यह बहुत सारगर्भित है और मैं इस बात का ठोस स्पष्टीकरण चाहूंगा कि एक सरणी के बजाय एक लिंक्ड सूची का उपयोग क्यों किया जाना चाहिए। मैं प्रोग्रामिंग के साथ बहुत अनुभवी नहीं हूं, इसलिए मुझे वास्तविक दुनिया का अनुभव नहीं मिला है।


3
ईमानदारी से, मुझे नहीं लगता कि उदाहरणों का अर्थ यह होगा कि आपके पास बहुत कुछ है जब तक कि आपको कुछ लिखने का कुछ अनुभव नहीं है, और फिर उस प्रभाव को देखकर जो आपके कोड पर डेटा संरचनाओं को बदल रहा है। या तो आप जिस चीज़ में रुचि रखते हैं उसे लिखने की कोशिश करें, और यह पता लगाएँ कि डेटा संरचनाएँ और कंटेनर सबसे अच्छे हैं या किसी मौजूदा कोड को देखें और सोचें कि प्रत्येक कंटेनर को क्यों चुना गया था, और इसका क्या प्रभाव होता है।
बेकार

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

जवाबों:


37

यहाँ एक उदाहरण और एक सादृश्य के बीच कुछ हिस्सा है। आपके पास करने के लिए कुछ काम हैं, इसलिए आप कागज का एक टुकड़ा पकड़ लेते हैं और लिखते हैं:

  • बैंक
  • किराने का सामान
  • ड्राईक्लीनिंग छोड़ दें

फिर आपको याद है कि आपको स्टैम्प खरीदने की भी ज़रूरत है। अपने शहर के भूगोल के कारण, आपको बैंक के बाद ऐसा करने की आवश्यकता है। आप अपनी पूरी सूची को एक नए कागज़ पर कॉपी कर सकते हैं:

  • बैंक
  • टिकटों
  • किराने का सामान
  • ड्राईक्लीनिंग छोड़ दें

या आप जो आपके पास थे उस पर हाथापाई कर सकते हैं:

  • बैंक ....... STAMPS
  • किराने का सामान
  • ड्राईक्लीनिंग छोड़ दें

जैसा कि आप अन्य कामों के बारे में सोचते हैं, आप उन्हें सूची में सबसे नीचे लिख सकते हैं, लेकिन तीरों के साथ खुद को याद दिलाते हैं कि उन्हें क्या करना है? यह एक लिंक की गई सूची है। हर बार जब आप कुछ जोड़ते हैं तो यह पूरी सूची की नकल करने की तुलना में तेज़ और आसान होता है।

तब आपके सेल फोन की घंटी बजती है जब आप बैंक में होते हैं "अरे, मुझे स्टैम्प मिल गए हैं, कोई और मत उठाओ"। आप सूची से केवल STAMPS को पार करते हैं, आप इसमें STAMPS के बिना एक नया नाम नहीं लिखते हैं।

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



@ डेनिस हाँ, मुझे पता है, शब्दार्थ को स्थानांतरित करने के लिए धन्यवाद। हालांकि यह सभी भाषाओं के लिए सही नहीं है इसलिए उदाहरण खड़ा है।
केट ग्रेगोरी

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

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

2
मुझे नहीं लगता कि यह सादृश्य बहुत सटीक है। मनुष्य के रूप में, हम कम से कम (इतनी छोटी सूची के लिए) O (1) में एक तत्व खोज सकते हैं। लेकिन अगर आप किसी लिंक्ड लिस्ट में रैंडम इंसर्ट करना चाहते हैं, तो आपको औसतन आधे ऐसे तत्वों को ट्रेस करना होगा, जिनकी कीमत आपको O (n) है, केवल उस पोजिशन को खोजने के लिए जहां आप इंसर्ट करना चाहते हैं। वास्तविक प्रविष्टि तब केवल O (1) खर्च होती है, लेकिन एक सरणी के साथ, आपकी लागत भी "केवल" O (n) है। तो इसका कारण केवल मूवमेंट सिमेंटिक्स नहीं बल्कि एल्गोरिथम है। बिग-ओ द्वारा छिपाया गया निरंतर कारक पसंदीदा सूची के लिए बहुत बड़ा है, हालांकि, गैर-सन्निहित स्मृति पहुंच के कारण।
5gon12eder

18
  • हैशटेब का उपयोग करें चेनिंग संकल्प हैश टकराव के विशिष्ट रूप से उस बाल्टी में तत्वों के लिए बाल्टी प्रति एक लिंक्ड सूची है।
  • सरल मेमोरी एलोकेटर्स एक मुफ्त सूची का उपयोग करते हैं अप्रयुक्त मेमोरी क्षेत्रों की का उपयोग करते हैं, मूल रूप से मुक्त स्मृति के अंदर सूची सूचक के साथ एक लिंक की गई सूची
  • एक FAT फाइल सिस्टम में , एक बड़ी फ़ाइल के मेटाडेटा को FAT प्रविष्टियों की लिंक की गई सूची के रूप में व्यवस्थित किया जाता है।

12

सी-भाषा "कॉल स्टैक" को x86 (और अधिकांश अन्य) बाइनरी एपीआई में एक लिंक्ड सूची के रूप में लागू किया गया है

यही है, सी-भाषा प्रक्रिया कॉलिंग एक प्रथम, अंतिम-आउट अनुशासन है। निष्पादित (संभवतः पुनरावर्ती) फ़ंक्शन कॉल के परिणाम को "कॉल स्टैक", या कभी-कभी केवल "स्टैक" के रूप में संदर्भित किया जाता है।

CALLX86 निर्देश "कॉल स्टैक" का उपयोग कर एक लिंक्ड सूची implmenting समाप्त होता है। एक CALLअनुदेश% EIP रजिस्टर की सामग्री, निर्देश का पता धक्का के बादCALL पर ढेर स्मृति। स्टैक मेमोरी पर कॉल-फ़िक्शन प्रोलॉग% ईबीपी रजिस्टर की सामग्री, कॉलिंग फिगेरियो में स्थानीय चर का सबसे कम पता देता है। तब फंक्शन प्रोलॉग% EBP को वर्तमान फ़ंक्शन के स्टैक बेस में सेट करता है।

इसका मतलब है कि% EBP एक मेमोरी लोकेशन का पॉइंटर है जो कॉलिंग फ़ंक्शन के% EBP मान का पता रखता है। यह एक लिंक की गई सूची से अधिक कुछ नहीं है, हार्डवेयर के माध्यम से आंशिक रूप से लागू किया गया है CALL

जहाँ तक यह किस लिए अच्छा है, यह है कि x86 CPUs फंक्शन कॉल्स को कैसे लागू करते हैं, विशेष रूप से फंक्शन कॉल्स जहाँ फंक्शन की अपनी कॉपी होती है, और फंक्शन के लिए वैरिएबल लोकल होते हैं। प्रत्येक फ़ंक्शन कॉल "कॉल स्टैक" पर कुछ जानकारी को धक्का देता है जो सीपीयू को लेने की अनुमति देता है जहां वह कॉलिंग फ़ंक्शन में बंद हो जाता है, जिसे बिना फ़ंक्शन या कॉलिंग फ़ंक्शन के हस्तक्षेप के बिना छोड़ दिया जाता है।


3

संदेश कतार को लागू करने के लिए लिंक की गई सूची का उपयोग किया जा सकता है।

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

उपयोग परिदृश्य से जो मैंने अभी वर्णित किया है, यह स्पष्ट होना चाहिए कि हमने संदेश कतार में संग्रहीत घटनाओं के लिए यादृच्छिक पहुंच की कभी परवाह नहीं की; हमें केवल संदेशों को संग्रहीत करने और उन्हें पुनर्प्राप्त करने में सक्षम होने की परवाह है। तो, यह एक लिंक्ड सूची का उपयोग करने के लिए समझ में आता है, जो इष्टतम सम्मिलन / हटाने का समय प्रदान करता है।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.