2009-06-22 11 views
7

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

धन्यवाद।

संपादित करें: जेनेरिक हैं ताकि आपको लिंक्ड सूचियां बनाने की आवश्यकता न हो?

उत्तर

4

यह आपके द्वारा उपयोग की जा रही भाषा और ढांचे पर निर्भर करेगा। अधिकांश आधुनिक भाषाएं और ढांचे आपको इन पहियों को पुनर्निर्मित नहीं करेंगे। इसके बजाय, वे List<T> या हैशटेबल जैसी चीजें प्रदान करेंगे।

संपादित करें:

हम शायद जुड़ा हुआ उपयोग सूचियों हर समय है, लेकिन यह एहसास नहीं है। हमें अपनी खुद की लिंक्ड सूचियों के कार्यान्वयन को लिखना नहीं है, क्योंकि हमारे द्वारा उपयोग किए जाने वाले ढांचे ने उन्हें पहले से ही लिखा है।

आप "जेनेरिक" के बारे में भ्रमित भी हो सकते हैं। आप जेनेरिक लिस्ट क्लासेस जैसे List<T> का जिक्र कर रहे हैं। यह गैर-जेनेरिक वर्ग सूची के समान ही है, लेकिन जहां तत्व हमेशा T टाइप होता है। इसे शायद एक लिंक्ड सूची के रूप में लागू किया गया है, लेकिन हमें इसकी परवाह नहीं है।

हमें भौतिक स्मृति आवंटन, या कैसे इंटरप्ट काम करता है, या फ़ाइल सिस्टम बनाने के बारे में चिंता करने की ज़रूरत नहीं है। हमारे पास यह करने के लिए ऑपरेटिंग सिस्टम हैं। लेकिन हमें सिखाया जा सकता है कि स्कूल में जानकारी वही है।

+2

सूची एक सरणी के रूप में लागू किया गया है। यह गतिशील रूप से आवश्यकतानुसार आकार बदलता है (प्रत्येक बार लंबाई में दोगुना)। – DancesWithBamboo

+0

सूची शायद एक लिंक्ड सूची के रूप में लागू नहीं किया गया है। यह निश्चित रूप से एक सरणी के रूप में लागू किया गया है, क्योंकि फ्रंट पेज (http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx) कहता है। इसके अलावा, आपको डेटा संरचनाओं के बारे में चिंता करने की आवश्यकता नहीं है, लेकिन अन्य व्यवसाय प्रोग्रामर करते हैं। और ... शायद आपको भी होना चाहिए। –

+0

हाँ, आपको शायद ईमानदार होने के बारे में परवाह करना होगा। – mquander

3

निश्चित रूप से। आधुनिक भाषाओं में कई "सूची" कार्यान्वयन वास्तव में सूचियों से जुड़े होते हैं, कभी-कभी सीधे पहुंच के लिए सरणी या हैश तालिकाओं के साथ संयोजन में (पुनरावृत्ति के विपरीत सूचकांक द्वारा)।

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

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

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

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

स्पष्टीकरण: मेरा उत्तर भाषा अज्ञेयवादी है और विशेष रूप से जेनेरिक से संबंधित नहीं है जो मेरी समझ में एक लिंक्ड सूची कार्यान्वयन है।

+0

मैं उलझन में हूँ। क्या आप कह रहे हैं कि "सूची" कार्यान्वयन (जेनेरिक मुझे लगता है) लिंक की गई सूचियां हैं जिनका उपयोग आमतौर पर किया जाता है? या लिंक्ड सूचियां कुछ और हैं जिन्हें आपको आम तौर पर बनाना है? आपके कमेंट के लिए धन्यवाद। – johnny

+0

कुछ भाषाओं में, सबसे मौलिक सूची संरचना वास्तव में एक लिंक्ड सूची है (हालांकि सी डेरिवेटिव्स में, यह आमतौर पर एक सरणी है, और फिर आकार बदलने योग्य सूचियों के लिए एक वेक्टर।) यदि यह भाषा के लिए मौलिक नहीं है, तो आमतौर पर आप एक लिंक पा सकते हैं मानक पुस्तकालयों (यानी .NET, जावा।) में डेटा संरचना की सूची – mquander

+0

आप किस आधार पर कहते हैं कि पाइथन ने सूचियों को लिंक किया है? http://stackoverflow.com/questions/280243/python-linked-list और अन्य स्रोत दृढ़ता से अन्यथा इंगित करते हैं। "मुख्य" सूची प्रकार एक सरणी (http://mail.python.org/pipermail/python-list/2007-January/594523.html) पर आधारित है, जैसे .NET और Java। –

0

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

यह मेरा अनुभव रहा है।

0

मैं कहूंगा कि यह उपयोग पर निर्भर करता है, कुछ मामलों में वे सामान्य यादृच्छिक एक्सेस कंटेनरों से तेज़ होते हैं।

मुझे लगता है कि इन्हें कुछ पुस्तकालयों द्वारा अंतर्निहित संग्रह प्रकार के रूप में उपयोग किया जाता है, इसलिए एक गैर-लिंक्ड सूची की तरह क्या हो सकता है वास्तव में नीचे एक हो सकता है।

0

एक सी/सी ++ एप्लिकेशन में मैंने अपनी आखिरी कंपनी में विकसित किया, हमने हर समय दोगुनी लिंक्ड सूचियों का उपयोग किया। वे जो भी कर रहे थे, उनके लिए आवश्यक थे, जो वास्तविक समय 3 डी ग्राफिक्स था।

1

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

और हां, लिंक्ड सूचियों को सी ++/एसटीएल से .NET तक किसी भी क्लास लाइब्रेरी में शामिल किया गया है।

और मेरी इच्छा है कि यह इसके बजाय सरणी का उपयोग करे।

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

Google "संदर्भ का इलाका"।

+0

आप ऐसा कह रहे हैं कि एक सूची का ट्रैक्टर एक वेक्टर (सी ++ डेटा संरचनाओं का उपयोग करके) से कम कुशल है, जो सच है। हालांकि, सूचियों में अन्य गुण होते हैं जो उन्हें कुछ परिस्थितियों में तेज़ी से बनाते हैं। सामान्य रूप से, वेक्टर <> का उपयोग करें, लेकिन याद रखें कि अन्य डेटा संरचनाएं अन्य आवश्यकताओं के लिए मौजूद हैं। –

+0

यह एक अधिक सरल तस्वीर है। सभी डेटा एक्सेस पैटर्न बराबर नहीं हैं। लिंक्ड सूचियां कुछ ऐप्स के लिए बहुत उपयोगी हैं, उदा। जब बड़ी सूचियों को मध्य में शुरुआत या हटाए जाने में आवेषण की आवश्यकता होती है। –

+0

@ मैथ्यू: मेरा जवाब कुछ सामान्य सामान्य, लिंक किए गए सूची में परिवर्तन या प्रदर्शन परीक्षण सुझावों का उपयोग करके कोड को काम करता है। –

1

विश्वविद्यालय में होमवर्क के अलावा हाथ से बने सूचियों का कभी भी उपयोग नहीं किया गया।

+0

जो मैंने सोचा था और यही है कि मेरे प्रश्न को किसने प्रेरित किया। मुझे इसे पढ़ने का आनंद मिलता है लेकिन सोच रहा था ... शायद मैं इसका अधिक उपयोग नहीं करूंगा। धन्यवाद। – johnny

+0

मुझे लगता है कि यह जानना बुरा नहीं है कि यह कैसे काम करता है। सब के बाद बेकार ज्ञान नहीं है। –

0

हां दैनिक सॉफ्टवेयर विकास में सभी प्रकार के डेटा-संरचनाएं बहुत उपयोगी हैं। अधिकांश भाषाओं में जो मुझे पता है (सी/सी ++/पायथन/उद्देश्य-सी) ऐसे ढांचे हैं जो उन डेटा-संरचनाओं को लागू करते हैं ताकि आपको पहिया को फिर से शुरू करने की आवश्यकता न हो।

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

आप संदेश कतारों, डेटा मैप्स, हैश तालिकाओं में डेटा-संरचनाओं का उपयोग करते हैं, डेटा ऑर्डर रखने, तेज़ी से पहुंच/हटाने/सम्मिलन और इतने पर निर्भर करता है कि क्या करने की आवश्यकता है।

2

एक सिंगल-लिंक्ड सूची एक स्मृति कुशल अपरिवर्तनीय सूची रखने का एकमात्र तरीका है जिसे इसे "उत्परिवर्तित" करने के लिए बनाया जा सकता है। देखें कि एरलांग कैसे करता है। यह सरणी समर्थित सूची की तुलना में थोड़ा धीमा हो सकता है लेकिन इसमें बहुप्रचारित और पूरी तरह से कार्यात्मक कार्यान्वयन में बहुत उपयोगी गुण हैं।

+0

@ करल: ओपी ने "व्यापार" प्रोग्रामिंग के बारे में पूछा। मुझे आश्चर्य है कि क्या वह आपके उदाहरणों को "व्यवसाय" प्रोग्रामिंग मानेंगे। –

0

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

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

1

उपयोग के आधार पर एक लिंक्ड सूची सबसे अच्छा विकल्प हो सकता है। सूची के मोर्चे से हटाए गए एक सरणी सूची की तुलना में एक लिंक्ड सूची के साथ बहुत तेज हैं।

एक जावा प्रोग्राम में जो मैंने प्रोफाइलिंग बनाए रखा है, दिखाता है कि मैं एक सूची के लिए एक लिंकलेलिस्ट से एक लिंक के लिए एक बढ़ती हुई सूची में बढ़कर प्रदर्शन में वृद्धि कर सकता हूं जिसमें शुरुआत में बहुत सारे डिलीट थे।

0

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

आमतौर पर आप चाहते हैं इन सूचियों को डेटाबेस सिस्टम में संग्रहीत करें, लेकिन कहीं आपको उन्हें डीबी से लाने की ज़रूरत है, उन्हें अपने एप्लिकेशन में स्टोर करें और उन्हें कुशलतापूर्वक रखें, भले ही आप ड्रॉप-डाउन कम्बोबॉक्स में आने वाली चीजों की एक छोटी सूची को पुनर्प्राप्त करना आसान हो।

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

आप अभी भी इन विषयों को सीखने का लाभ उठा रहे हैं, उदा। यदि आप सी # के साथ काम कर रहे हैं तो आप जानना चाहते हैं कि एक ऐरेलिस्ट कैसे काम करता है, और मक्खन आप ऐरेलिस्ट या कुछ अन्य चीज़ों को जोड़ने/डालने/खोज/यादृच्छिक इंडेक्स जैसी सूची के आधार पर कुछ और चुनने के लिए चुनते हैं।

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