संग्रह (सार डेटा प्रकार)

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

संग्रह के उदाहरणों में सूची (सार डेटा प्रकार), सेट (कंप्यूटर विज्ञान), मल्टीसेट, ट्री (डेटा संरचना) और ग्राफ़ (डेटा संरचना) शामिल हैं।

निश्चित आकार की सरणियों (या तालिकाओं) को आमतौर पर एक संग्रह नहीं माना जाता है क्योंकि वे निश्चित संख्या में डेटा आइटम रखते हैं, हालांकि वे आमतौर पर संग्रह के कार्यान्वयन में एक भूमिका निभाते हैं। चर-आकार सरणियों को आम तौर पर संग्रह माना जाता है।

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

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

ढेर
एक ढेर एक एलआईएफओ डेटा संरचना है जिसमें दो प्रमुख संचालन होते हैं: धक्का, जो संग्रह के शीर्ष पर एक तत्व जोड़ता है, और पॉप, जो शीर्ष तत्व को हटा देता है।

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

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

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

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

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

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

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

वृक्ष संग्रह का उपयोग स्वाभाविक रूप से पदानुक्रमित डेटा को संग्रहीत करने के लिए किया जा सकता है, जो एक पेड़ की तरह तरीके से प्रस्तुत किया जाता है, जैसे मेनू सिस्टम और डेटा स्टोरेज सिस्टम पर निर्देशिकाओं में फ़ाइलें।

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

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

उदाहरण के लिए, एक प्राथमिकता कतार को अक्सर ढेर के रूप में लागू किया जाता है, जबकि एक साहचर्य सरणी को अक्सर हैश तालिका के रूप में कार्यान्वित किया जाता है, इसलिए इन अमूर्त प्रकारों को अक्सर इस पसंदीदा कार्यान्वयन द्वारा हीप या हैश के रूप में संदर्भित किया जाता है, हालांकि यह कड़ाई से नहीं है सही।

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


 * सी ++: कंटेनर (सार डेटा प्रकार) के रूप में जाना जाता है, सी ++ मानक लाइब्रेरी और पहले मानक टेम्पलेट लाइब्रेरी में लागू किया गया
 * जावा: जावा संग्रह ढांचे में लागू किया गया
 * ओरेकल पीएल/एसक्यूएल संग्रह को प्रोग्रामर परिभाषित प्रकारों के रूप में लागू करता है
 * पायथन: कुछ अंतर्निहित, अन्य संग्रह पुस्तकालय में कार्यान्वित

बाहरी संबंध

 * Apache Commons Collections.
 * AS3Commons Collections Framework ActionScript3 implementation of the most common collections.
 * CollectionSpy &mdash; A profiler for Java's Collections Framework.
 * Guava.
 * Mango Java library.