सभी प्रकार के मिश्रण मौजूद हैं। आपके पास डेटा संरचनाएं हैं, जो कि एल्गोरिदम, एल्गोरिदम से जुड़ी नहीं हैं, जिनके लिए कोई (वास्तविक) डेटा संरचना की आवश्यकता नहीं है, लेकिन अक्सर दोनों एक पैकेज में आते हैं।
संपादित करें: जैसा कि @Doval ने सही ढंग से बताया है, प्रति से डेटा संरचनाएं उनके साथ जुड़ी कोई भी कार्रवाई नहीं करती हैं। डेटा संरचना और एल्गोरिथ्म के संयोजन का कार्य एक सार डेटा प्रकार बनाता है।
एल्गोरिदम के बिना डेटा संरचनाएं
उदाहरण के लिए 2-आयामी निर्देशांक संग्रहीत करने के लिए एक डेटा संरचना पर विचार करें, उचित रूप से कहा जाता है Point
। एक बिंदु के लिए किए जाने वाले एल्गोरिदम के संदर्भ में बहुत कुछ नहीं है और यह वास्तव में ए x
और y
मूल्य के लिए सिर्फ एक कंटेनर है । बेशक, इस डेटा संरचना को देते हुए, अब आप इसके शीर्ष पर सभी प्रकार के एल्गोरिदम जोड़ सकते हैं (दूरी की गणना, उत्तल पतवार, क्या है-आप)।
आप बहुत सी डेटा संरचनाओं के बारे में सोच सकते हैं, जो केवल व्यक्तिगत डेटा का एक संचय हैं। हालांकि ये अक्सर अभ्यास में होते हैं, वे अच्छी शिक्षण सामग्री के लिए नहीं बनाते हैं, क्योंकि इससे कुछ भी सीखने को नहीं मिलता है, एक बार जब आप समझ जाते हैं, तो एकल डेटा आइटम एक नई डेटा संरचना में जमा हो सकते हैं (जैसे आप क्या सीखते हैं उपरोक्त Point
उदाहरण के बाद , अगर मैं आपको उस भयानक डेटा संरचना के साथ प्रदान करता हूं जिसे कहा जाता है Point3D
, जो 3-आयामी स्थान के लिए एक ही काम कर सकता है?)
(वास्तविक) डेटा संरचनाओं के बिना एल्गोरिदम
"रियल", क्योंकि स्पष्ट रूप से प्रत्येक दिलचस्प एल्गोरिदम को पूर्णांक या बूलियन जैसे आदिम डेटा प्रकारों की आवश्यकता होती है, और हम इस संदर्भ में डेटा संरचनाओं के रूप में उन पर विचार नहीं करना चाहते हैं। ऊपर से इसी तरह, ये एल्गोरिदम आमतौर पर सरल होते हैं। विशेष रूप से, वे किसी भी प्रकार की जटिल स्थिति के साथ नहीं आते हैं, क्योंकि यह आमतौर पर डेटा संरचना में जाता है (अगला भाग देखें)।
इस तरह के एक एल्गोरिथ्म के लिए एक उदाहरण दो संख्याओं के सबसे बड़े सामान्य भाजक की गणना करना होगा। एलसीडी के लिए यूक्लिड के एल्गोरिदम को वास्तव में केवल दो पूर्णांक रखने और उन्हें हेरफेर करने की आवश्यकता है।
एक बार जब चीजें अधिक दिलचस्प होने लगती हैं, तो आप बहुत जल्द सार डेटा प्रकारों की दुनिया में प्रवेश करते हैं। उदाहरण के लिए, एराटोस्थनीज की छलनी एक सरणी पर आधारित है। अब हम चर्चा कर सकते हैं कि क्या कोई सरणी अभी भी आदिम है, या वास्तव में, आप चर्चा कर सकते हैं कि क्या पूर्णांक पहले से ही डेटा संरचना नहीं है। किसी भी तरह से, डेटा संरचनाओं के बिना पूरी तरह से मौजूद एल्गोरिदम बल्कि उबाऊ होते हैं, भले ही आप उनके पृथक अस्तित्व को स्वीकार करते हैं।
एल्गोरिथ्म डेटा संरचनाओं, उर्फ अमूर्त डेटा प्रकारों के साथ संयुक्त
अब ये दिलचस्प हैं, लेकिन दो अलग-अलग कारणों से। आमतौर पर, आप इन दो दिशाओं से संपर्क कर सकते हैं: डेटा संरचना पहले, या एल्गोरिथ्म पहले।
जबकि एक सार डेटा प्रकार डेटा संरचना + एल्गोरिदम / संचालन के संयोजन से परिभाषित होता है, हम अक्सर उनमें से किसी एक पर ध्यान केंद्रित करते हुए देखते हैं और दूसरे को एनबलर मानते हैं।
डेटा संरचना, फिर एल्गोरिथ्म
आप अमूर्त डेटा प्रकारों का सामना करेंगे, जो उपयोग करने के लिए सरल हैं, लेकिन आंतरिक रूप से काम करने के लिए अधिक या कम जटिल एल्गोरिदम को शामिल करते हैं। उदाहरण के लिए, HashMap
उपयोग करने के लिए एक तुच्छ है, लेकिन निफ्टी हैश फ़ंक्शन और अंदर पर हैश टकराव से निपटना शामिल है। फिर भी, आपके दृष्टिकोण से एक उपयोगकर्ता के रूप में आप इसके बारे में परवाह करते हैं जो आपके लिए डेटा रखता है, न कि कुछ ऐसा जो आपके लिए कुछ करता है।
नीचे दिए गए अंतिम समूह के विपरीत, ये डेटा संरचनाएं अपने उपयोगकर्ताओं को इन एल्गोरिदम के लिए उजागर नहीं करती हैं। आपको HashMap
इसका उपयोग करने में सक्षम होने के लिए एक आंतरिक आंतरिक हैश फ़ंक्शन के बारे में जानने और न ही देखभाल करने की आवश्यकता है। (हालांकि इसे प्रभावी ढंग से उपयोग करने के लिए, आप इन बातों को जानना चाह सकते हैं;)
एल्गोरिथ्म, फिर डेटा संरचना
दूसरी दिशा का मतलब है कि आपके पास एक एल्गोरिथ्म है, जिसे आप केवल उपयोग करने में सक्षम होना चाहते हैं, लेकिन जिसे डेटा संरचनाओं की आवश्यकता होती है, उसे बनाने के लिए आंतरिक रूप से काम करना चाहिए। एक उदाहरण एक द्विआधारी अंतरिक्ष विभाजन (बीएसपी) एल्गोरिथ्म होगा, जो कि आप बस 2-आयामी Point
बिंदुओं के एक बड़े सेट से पूछ सकते हैं जो किसी दिए गए क्वेरी बिंदु के सबसे करीब है। हालाँकि, आपको वास्तव में एल्गोरिथ्म लिखने के लिए एक ट्री संरचना (और दूरी गणना की तरह अतिरिक्त एल्गोरिदम) की आवश्यकता होती है।
सामान्य तौर पर, कोई यह कह सकता है कि इस समूह के एल्गोरिदम अपने आंतरिक राज्य प्रतिनिधित्व के लिए शामिल डेटा संरचनाओं का उपयोग करते हैं। मैं तर्क दूंगा, कि एल्गोरिदम का यह समूह सबसे विविध है और आपको कई अलग-अलग मिल जाएंगे जो इस सामान्य योजना के लिए उपयुक्त हैं। देखने के बिंदु के बारे में, हम उन्हें दिलचस्प के रूप में देखते हैं, क्योंकि वे हमारे लिए कुछ करते हैं (f.ex. सॉर्टिंग), और डेटा होल्डिंग भाग के बारे में ज्यादा परवाह नहीं करते हैं।
बारीकी से संबंधित डेटा संरचनाओं और एल्गोरिदम
अंत में, आपके पास डेटा संरचनाएं हैं, जो एल्गोरिदम से बहुत करीब हैं जो सीधे उनके साथ मेल खाती हैं। एक विशिष्ट उदाहरण एक द्विआधारी पेड़ है, जो, जब आप इसके साथ कुछ भी सार्थक करना चाहते हैं, तो आप पर पेड़-चलने वाले एल्गोरिदम के विषय को बल देते हैं (गहराई-पहले, चौड़ाई-पहले, जो भी हो)।
इन मामलों के लिए, हम परिणामी अमूर्त डेटा प्रकारों के बारे में अपने विचार को हर बार बदलते हैं। कभी-कभी आप अपने पेड़ की संरचना के बारे में परवाह करते हैं, कुछ मिनट बाद आप परवाह करते हैं कि आप उस पर एक खोज ऑपरेशन चलाने में सक्षम हैं, तो आप एक नोड को हटाने के बारे में आश्चर्य करते हैं, और इस बारे में सही-सही कि संरचना बाद में कैसे दिखती है। हालांकि यह सब ऊपर के अन्य वर्गों के लिए सही है, लेकिन यह कुछ ऐसा नहीं है जो आपके दिमाग में प्राथमिक फोकस है, उदाहरण के लिए, जब आप डेटा को एक से / से Map
, या जब आप एक लिंक की गई सूची को संग्रहीत / पुनर्प्राप्त करते हैं।