डेटा संरचनाओं और एल्गोरिदम के बीच क्या संबंध है? [बन्द है]


13

मैं डेटा संरचनाओं में एक अच्छे ऑनलाइन कोर्स की खोज कर रहा हूं, लेकिन यह पाया है कि Google एल्गोरिदम पाठ्यक्रमों के लिए भी परिणाम देता है, जो कहते हैं:

इस कोर्स में आप एल्गोरिथ्म डिजाइन के कई बुनियादी सिद्धांतों को सीखेंगे: डिवाइड-एंड-कॉनकेयर मेथड्स, ग्राफ एल्गोरिदम, प्रैक्टिकल डेटा स्ट्रक्चर्स (ढेर, हैश टेबल, सर्च ट्री) , रैंडमाइज्ड एल्गोरिदम, और बहुत कुछ। [स्रोत]

तथा

इस वर्ग के अंत तक आप ग्राफ़ और अन्य महत्वपूर्ण डेटा संरचनाओं के लिए नए एल्गोरिदम को तैयार करने और इन एल्गोरिदम की दक्षता का मूल्यांकन करने के लिए आवश्यक प्रमुख अवधारणाओं को समझेंगे । [स्रोत]

तथा

यह पाठ्यक्रम कम्प्यूटेशनल समस्याओं के गणितीय मॉडलिंग का परिचय प्रदान करता है। यह इन समस्याओं को हल करने के लिए उपयोग किए जाने वाले सामान्य एल्गोरिदम, एल्गोरिथम प्रतिमान और डेटा संरचनाओं को कवर करता है[स्रोत]

मेरा प्रश्न है: एल्गोरिदम और डेटा संरचनाएं अंतरंग रूप से जुड़ी हुई हैं, जिसका अर्थ है कि उन्हें एक साथ समझा जाना चाहिए या एक विषय दूसरे की तुलना में अधिक मूलभूत है?

EDIT: इस प्रश्न को बंद करने के लिए मतदान करने वालों के लिए, क्या आप मुझे बता सकते हैं कि क्यों और शायद इस एक को कैसे सुधारें? सही प्रश्न पूछना सीखना शैक्षिक प्रक्रिया का हिस्सा है।


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

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

7
@Euphoric मैं यह कहना गलत होगा कि एल्गोरिदम डेटा संरचना का हिस्सा हैं। एक द्विआधारी खोज को लागू करने का एक से अधिक तरीका है: आप, उदाहरण के लिए, भोली if less than recurse to the left; if greater than, recurse to the right; if equal, returnखोज या थोड़ा अधिक परिष्कृत कर सकते हैं if less than recurse to the left; otherwise keep track of this value as a potential candidate and recurse to the right; check for equality once we reach the leaves। उनके पास तुलनाओं की संख्या थोड़ी अलग है। दोनों कई चीजों में से एक हैं जिन्हें आप एक पेड़ के साथ चुन सकते हैं।
डोभाल

4
@ यूफोरिक आप डेटा संरचना को अमूर्त डेटा प्रकार के साथ भ्रमित कर रहे हैं जो डेटा संरचना और एल्गोरिदम के संयोजन को लागू करता है।
डोभाल

7
@ अनौपचारिक, मुझे असहमत होना है। मर्ज सॉर्ट एक एल्गोरिथ्म है। एक सरणी एक डेटा संरचना है। एक लिंक की गई सूची एक अलग डेटा संरचना है। मैं या तो संचालित करने के लिए मर्जसॉर्ट का कार्यान्वयन लिख सकता हूं। कुछ डेटा संरचनाएं एक विशेष एल्गोरिथ्म के लिए अधिक प्राकृतिक या अधिक कुशल हो सकती हैं, लेकिन यह शायद ही कभी एक पूर्ण आवश्यकता होती है (आप बहुत अधिक है ढेर ढेर को लागू करने के लिए एक ढेर लगाना पड़ता है)। निकोलस विर्थ ने 1980 के दशक में एक लोकप्रिय पाठ्य पुस्तक लिखी जिसका शीर्षक था: "एल्गोरिदम + डेटा संरचनाएं = कार्यक्रम"
चार्ल्स ई। ग्रांट

जवाबों:


20

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

संपादित करें: जैसा कि @Doval ने सही ढंग से बताया है, प्रति से डेटा संरचनाएं उनके साथ जुड़ी कोई भी कार्रवाई नहीं करती हैं। डेटा संरचना और एल्गोरिथ्म के संयोजन का कार्य एक सार डेटा प्रकार बनाता है।

एल्गोरिदम के बिना डेटा संरचनाएं

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

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

(वास्तविक) डेटा संरचनाओं के बिना एल्गोरिदम

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

इस तरह के एक एल्गोरिथ्म के लिए एक उदाहरण दो संख्याओं के सबसे बड़े सामान्य भाजक की गणना करना होगा। एलसीडी के लिए यूक्लिड के एल्गोरिदम को वास्तव में केवल दो पूर्णांक रखने और उन्हें हेरफेर करने की आवश्यकता है।

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

एल्गोरिथ्म डेटा संरचनाओं, उर्फ ​​अमूर्त डेटा प्रकारों के साथ संयुक्त

अब ये दिलचस्प हैं, लेकिन दो अलग-अलग कारणों से। आमतौर पर, आप इन दो दिशाओं से संपर्क कर सकते हैं: डेटा संरचना पहले, या एल्गोरिथ्म पहले।

जबकि एक सार डेटा प्रकार डेटा संरचना + एल्गोरिदम / संचालन के संयोजन से परिभाषित होता है, हम अक्सर उनमें से किसी एक पर ध्यान केंद्रित करते हुए देखते हैं और दूसरे को एनबलर मानते हैं।

डेटा संरचना, फिर एल्गोरिथ्म

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

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

एल्गोरिथ्म, फिर डेटा संरचना

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

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

बारीकी से संबंधित डेटा संरचनाओं और एल्गोरिदम

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

इन मामलों के लिए, हम परिणामी अमूर्त डेटा प्रकारों के बारे में अपने विचार को हर बार बदलते हैं। कभी-कभी आप अपने पेड़ की संरचना के बारे में परवाह करते हैं, कुछ मिनट बाद आप परवाह करते हैं कि आप उस पर एक खोज ऑपरेशन चलाने में सक्षम हैं, तो आप एक नोड को हटाने के बारे में आश्चर्य करते हैं, और इस बारे में सही-सही कि संरचना बाद में कैसे दिखती है। हालांकि यह सब ऊपर के अन्य वर्गों के लिए सही है, लेकिन यह कुछ ऐसा नहीं है जो आपके दिमाग में प्राथमिक फोकस है, उदाहरण के लिए, जब आप डेटा को एक से / से Map, या जब आप एक लिंक की गई सूची को संग्रहीत / पुनर्प्राप्त करते हैं।


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

ध्यान दें कि एक एल्गोरिथ्म में हमेशा छिपा होता है क्योंकि कार्यों का निरीक्षण करने का कोई तरीका नहीं है। शायद इसीलिए उन्हें लैंबडा कैलकुलस (जिसका एकमात्र डेटा प्रकार फ़ंक्शन है) में सार कहा जाता है ।
डोभाल

2
तुम सही हो। फिर भी, मुझे इस बात में अंतर दिखाई देता है कि हम अलग-अलग एडीटी को कैसे देखते हैं। मैंने अपना उत्तर संपादित कर लिया है और आशा है कि यह अब और स्पष्ट हो गया है और अब ADTs के साथ संरचना का खुलासा नहीं करता है, जबकि अभी भी जोर दे रहा है, कि आप किसी भी ADT के लिए संरचना और / या संचालन पर ध्यान केंद्रित कर सकते हैं।
फ्रैंक

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

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

5

डेटा संरचनाएं अक्सर एक एल्गोरिथ्म के विवरण को प्रभावित करती हैं। इस वजह से दोनों अक्सर साथ-साथ चलते हैं।

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

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

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

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