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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

उदाहरण के लिए, एक प्राथमिकता क्यू को प्रायः स्टैक के रूप में प्रयुक्त किया जाता है, जबकि एक साहचर्य सरणी को प्रायः हैश सारणी के रूप में कार्यान्वित किया जाता है, इसलिए इन अमूर्त प्रकारों को प्रायः इस चयनात्मक कार्यान्वयन द्वारा हीप या हैश के रूप में संदर्भित किया जाता है, हालांकि यह परिशुद्ध रूप से सही नहीं है।

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


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

बाहरी संबंध

 * 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.