ऐरे (डेटा प्रकार): Difference between revisions
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
{{short description|Data type that represents a collection of elements (values or variables)}} | {{short description|Data type that represents a collection of elements (values or variables)}} | ||
{{About|सार डेटा प्रकार|बाइट स्तर की संरचना|सरणी डेटा संरचना|अन्य प्रकार के सरणियाँ|सरणी}} | {{About|सार डेटा प्रकार|बाइट स्तर की संरचना|सरणी डेटा संरचना|अन्य प्रकार के सरणियाँ|सरणी}} | ||
[[कंप्यूटर विज्ञान]] में, सरणी [[डेटा प्रकार]] है जो 'अवयव' ([[मूल्य (कंप्यूटर विज्ञान)]] या [[चर (कंप्यूटर विज्ञान)|वेरिएबल्स(चर) (कंप्यूटर विज्ञान)]]) के संग्रह का प्रतिनिधित्व करता है, प्रत्येक या से अधिक सूचकांकों (कुंजियों की पहचान) द्वारा चुना जाता है जिसे रन पर गणना की जा सकती है समय (कार्यक्रम जीवनचक्र चरण) कार्यक्रम निष्पादन के | [[कंप्यूटर विज्ञान]] में, सरणी [[डेटा प्रकार]] है जो 'अवयव' ([[मूल्य (कंप्यूटर विज्ञान)]] या [[चर (कंप्यूटर विज्ञान)|वेरिएबल्स(चर) (कंप्यूटर विज्ञान)]]) के संग्रह का प्रतिनिधित्व करता है, प्रत्येक या से अधिक सूचकांकों (कुंजियों की पहचान) द्वारा चुना जाता है जिसे रन पर गणना की जा सकती है समय (कार्यक्रम जीवनचक्र चरण) कार्यक्रम निष्पादन के समय। इस तरह के संग्रह को सामान्यतः सरणी वेरिएबल्स या सरणी मान कहा जाता है।<ref name="sebesta">Robert W. Sebesta (2001) ''Concepts of Programming Languages''. Addison-Wesley. 4th edition (1998), 5th edition (2001), {{ISBN|9780201385960}}</ref> गणितीय अवधारणाओं [[वेक्टर (गणित)]] और [[मैट्रिक्स (गणित)]] के अनुरूप, एक और दो सूचकांक वाले सरणी प्रकारों को क्रमशः वेक्टर प्रकार और मैट्रिक्स प्रकार कहा जाता है। अधिक सामान्यतः, बहुआयामी सरणी प्रकार को [[टेन्सर]] प्रकार कहा जा सकता है, भौतिक अवधारणा, टेंसर के अनुरूप है।<ref name="tensorflow">{{Cite web|url=https://www.tensorflow.org/guide/tensor|title=Introduction to Tensors | TensorFlow Core|website=TensorFlow}}</ref> | ||
सरणी प्रकारों के लिए भाषा समर्थन में कुछ [[अंतर्निर्मित प्रकार]] सम्मिलित हो सकते हैं|अंतर्निहित सरणी डेटा प्रकार, कुछ सिंटैक्टिक निर्माण (सरणी प्रकार निर्माता) जो [[प्रोग्रामर]] ऐसे प्रकारों को परिभाषित करने और सरणी वेरिएबल्स घोषित करने के लिए उपयोग कर सकते हैं, और सरणी अवयव को अनुक्रमणित करने के लिए विशेष संकेतन सम्मिलित हो सकते हैं।<ref name="sebesta" /> उदाहरण के लिए, [[पास्कल प्रोग्रामिंग भाषा]] में, डिक्लेरेशन <code>type MyTable = array [1..4,1..2] of integer</code>, नामक नए सरणी डेटा प्रकार को परिभाषित करता है <code>MyTable</code>. घोषणा <code>var A: MyTable</code> फिर वेरिएबल्स परिभाषित करता है <code>A</code> उस प्रकार का, जो आठ अवयव का योग है, प्रत्येक पूर्णांक वेरिएबल्स है जिसे दो सूचकांकों द्वारा पहचाना जाता है। पास्कल प्रोग्राम में, उन अवयव को निरूपित किया जाता है <code>A[1,1]</code>, <code>A[1,2]</code>, <code>A[2,1]</code>, …, <code>A[4,2]</code>.<ref name="pascal">K. Jensen and Niklaus Wirth, ''PASCAL User Manual and Report''. Springer. Paperback edition (2007) 184 pages, {{ISBN|978-3540069508}}</ref> विशेष सरणी प्रकार अधिकांशतः भाषा के मानक [[पुस्तकालय (कंप्यूटर विज्ञान)]] द्वारा परिभाषित किए जाते हैं। | सरणी प्रकारों के लिए भाषा समर्थन में कुछ [[अंतर्निर्मित प्रकार]] सम्मिलित हो सकते हैं|अंतर्निहित सरणी डेटा प्रकार, कुछ सिंटैक्टिक निर्माण (सरणी प्रकार निर्माता) जो [[प्रोग्रामर]] ऐसे प्रकारों को परिभाषित करने और सरणी वेरिएबल्स घोषित करने के लिए उपयोग कर सकते हैं, और सरणी अवयव को अनुक्रमणित करने के लिए विशेष संकेतन सम्मिलित हो सकते हैं।<ref name="sebesta" /> उदाहरण के लिए, [[पास्कल प्रोग्रामिंग भाषा]] में, डिक्लेरेशन <code>type MyTable = array [1..4,1..2] of integer</code>, नामक नए सरणी डेटा प्रकार को परिभाषित करता है <code>MyTable</code>. घोषणा <code>var A: MyTable</code> फिर वेरिएबल्स परिभाषित करता है <code>A</code> उस प्रकार का, जो आठ अवयव का योग है, प्रत्येक पूर्णांक वेरिएबल्स है जिसे दो सूचकांकों द्वारा पहचाना जाता है। पास्कल प्रोग्राम में, उन अवयव को निरूपित किया जाता है <code>A[1,1]</code>, <code>A[1,2]</code>, <code>A[2,1]</code>, …, <code>A[4,2]</code>.<ref name="pascal">K. Jensen and Niklaus Wirth, ''PASCAL User Manual and Report''. Springer. Paperback edition (2007) 184 pages, {{ISBN|978-3540069508}}</ref> विशेष सरणी प्रकार अधिकांशतः भाषा के मानक [[पुस्तकालय (कंप्यूटर विज्ञान)]] द्वारा परिभाषित किए जाते हैं। | ||
डायनेमिक सूचियाँ भी अधिक सामान्य और प्रयुक्त करने में आसान हैं गतिशील सरणियों की तुलना में। सरणी प्रकारों को [[रिकॉर्ड (कंप्यूटर विज्ञान)]] प्रकारों से मुख्य रूप से अलग किया जाता है क्योंकि वे पास्कल [[समनुदेशन ब्यान]] के रूप में रन टाइम (प्रोग्राम जीवनचक्र चरण) पर | डायनेमिक सूचियाँ भी अधिक सामान्य और प्रयुक्त करने में आसान हैं गतिशील सरणियों की तुलना में। सरणी प्रकारों को [[रिकॉर्ड (कंप्यूटर विज्ञान)]] प्रकारों से मुख्य रूप से अलग किया जाता है क्योंकि वे पास्कल [[समनुदेशन ब्यान]] के रूप में रन टाइम (प्रोग्राम जीवनचक्र चरण) पर अवयव सूचकांकों की गणना करने की अनुमति देते हैं। <code>A[I,J] := A[N-I,2*J]</code>. अन्य बातों के अतिरिक्त, यह सुविधा एकल पुनरावृत्त कथन (कंप्यूटर विज्ञान) को सरणी वेरिएबल्स के इच्छानुसार तरह से कई अवयव को संसाधित करने की अनुमति देती है। | ||
अधिक सैद्धांतिक संदर्भों में, विशेष रूप से प्रकार के सिद्धांत में और अमूर्त [[कलन विधि]] के विवरण में, सरणी और सरणी प्रकार कभी-कभी [[सार डेटा प्रकार]] (ADT) को संदर्भित करते हैं जिसे सार सरणी भी कहा जाता है या [[साहचर्य सरणी]], गणित मॉडल का उल्लेख कर सकता है। अधिकांश भाषाओं में विशिष्ट सरणी प्रकार के मूलभूतसंचालन और व्यवहार - मूल रूप से, अवयव का संग्रह जो रन-टाइम पर गणना किए गए सूचकांकों द्वारा चुना जाता है। | अधिक सैद्धांतिक संदर्भों में, विशेष रूप से प्रकार के सिद्धांत में और अमूर्त [[कलन विधि]] के विवरण में, सरणी और सरणी प्रकार कभी-कभी [[सार डेटा प्रकार]] (ADT) को संदर्भित करते हैं जिसे सार सरणी भी कहा जाता है या [[साहचर्य सरणी]], गणित मॉडल का उल्लेख कर सकता है। अधिकांश भाषाओं में विशिष्ट सरणी प्रकार के मूलभूतसंचालन और व्यवहार - मूल रूप से, अवयव का संग्रह जो रन-टाइम पर गणना किए गए सूचकांकों द्वारा चुना जाता है। | ||
भाषा के आधार पर, सरणी प्रकार अन्य डेटा प्रकारों जैसे [[सूची (कंप्यूटिंग)]] और [[स्ट्रिंग (कंप्यूटर विज्ञान)]] का वर्णन करने वाले अन्य डेटा प्रकारों को ओवरलैप (या पहचाना जा सकता है) कर सकते हैं। सरणी प्रकार अधिकांशतः [[सरणी डेटा संरचना]]ओं द्वारा कार्यान्वित किए जाते हैं, | भाषा के आधार पर, सरणी प्रकार अन्य डेटा प्रकारों जैसे [[सूची (कंप्यूटिंग)]] और [[स्ट्रिंग (कंप्यूटर विज्ञान)]] का वर्णन करने वाले अन्य डेटा प्रकारों को ओवरलैप (या पहचाना जा सकता है) कर सकते हैं। सरणी प्रकार अधिकांशतः [[सरणी डेटा संरचना]]ओं द्वारा कार्यान्वित किए जाते हैं, किन्तु कभी-कभी अन्य तरीकों से, जैसे [[हैश तालिका]], लिंक्ड सूचियां, या [[खोज पेड़|ट्री खोज]] आदि है। | ||
== इतिहास == | == इतिहास == | ||
[[Heinz Rutishauser|हेंज रूटिशॉसर]] की प्रोग्रामिंग भाषा सुपरप्लान (1949-1951) में बहुआयामी सरणियाँ सम्मिलित थीं। रुतिशौसर चूंकि यह वर्णन करते हुए कि उनकी भाषा के लिए संकलक कैसे बनाया जाना चाहिए, | [[Heinz Rutishauser|हेंज रूटिशॉसर]] की प्रोग्रामिंग भाषा सुपरप्लान (1949-1951) में बहुआयामी सरणियाँ सम्मिलित थीं। रुतिशौसर चूंकि यह वर्णन करते हुए कि उनकी भाषा के लिए संकलक कैसे बनाया जाना चाहिए, | ||
असेंबली लैंग्वेज और लो-लेवल लैंग्वेज जैसे बीसीपीएल<ref>John Mitchell, ''Concepts of Programming Languages''. Cambridge University Press.</ref> सामान्यतः सरणी के लिए कोई सिंटैक्टिक समर्थन नहीं होता है। | असेंबली लैंग्वेज और लो-लेवल लैंग्वेज जैसे बीसीपीएल<ref>John Mitchell, ''Concepts of Programming Languages''. Cambridge University Press.</ref> सामान्यतः सरणी के लिए कोई सिंटैक्टिक समर्थन नहीं होता है। | ||
कुशल संगणना के लिए सरणी संरचनाओं के महत्व के कारण, [[फोरट्रान]] (1957), [[COBOL|कोबोल]] (1960) और अल्गोल 60 (1960) सहित सबसे | कुशल संगणना के लिए सरणी संरचनाओं के महत्व के कारण, [[फोरट्रान]] (1957), [[COBOL|कोबोल]] (1960) और अल्गोल 60 (1960) सहित सबसे प्रारंभिक उच्च-स्तरीय प्रोग्रामिंग भाषाओं ने बहु-आयामी सरणियों के लिए समर्थन प्रदान किया गया। | ||
== सार सरणियाँ == | == सार सरणियाँ == | ||
एक सरणी डेटा संरचना को गणितीय रूप से [[सार डेटा संरचना]] (एक सार सरणी) के रूप में दो कार्यों के साथ तैयार किया जा सकता है | एक सरणी डेटा संरचना को गणितीय रूप से [[सार डेटा संरचना]] (एक सार सरणी) के रूप में दो कार्यों के साथ तैयार किया जा सकता है | ||
: प्राप्त करें ( | : प्राप्त करें (''A'', ''I''): सरणी ''A'' के अवयव में संग्रहीत डेटा जिसका सूचकांक पूर्णांक [[टपल]] है। | ||
: समुच्चय ( | : समुच्चय (''A'',''I'',''V''): वह सरणी जो उस अवयव के मान को ''V'' पर समुच्चय करके परिणाम देती है। | ||
सिद्धांतों को पूरा करने के लिए इन परिचालनों की आवश्यकता होती है<ref>Lukham, Suzuki (1979), "Verification of array, record, and pointer operations in Pascal". ''ACM Transactions on Programming Languages and Systems'' '''1''' (2), 226–244.</ref> | सिद्धांतों को पूरा करने के लिए इन परिचालनों की आवश्यकता होती है<ref>Lukham, Suzuki (1979), "Verification of array, record, and pointer operations in Pascal". ''ACM Transactions on Programming Languages and Systems'' '''1''' (2), 226–244.</ref> | ||
: प्राप्त करें (समुच्चय ( | : प्राप्त करें (समुच्चय (''A'',''I'', ''V''), ''I'') = ''V'' | ||
: | :प्राप्त(समुच्चय(A,I, V), J) = प्राप्त(A, J) यदि I ≠ J | ||
किसी भी सरणी स्थिति A के लिए, कोई मान V, और कोई भी टपल्स I, J जिसके लिए संचालन परिभाषित हैं। | किसी भी सरणी स्थिति A के लिए, कोई मान V, और कोई भी टपल्स I, J जिसके लिए संचालन परिभाषित हैं। | ||
प्रथम स्वयंसिद्ध का अर्थ है कि प्रत्येक | प्रथम स्वयंसिद्ध का अर्थ है कि प्रत्येक अवयव वेरिएबल्स की तरह व्यवहार करता है। दूसरे स्वयंसिद्ध का अर्थ है कि अलग-अलग सूचकांक वाले अवयव [[अलियासिंग (कंप्यूटिंग)]] वेरिएबल्स के रूप में व्यवहार करते हैं, जिससेएक अवयव में मान संग्रहीत करना किसी अन्य अवयव के मूल्य को प्रभावित न करे। | ||
ये स्वयंसिद्ध वैध इंडेक्स ट्यूपल्स I के समुच्चय पर कोई बाधा नहीं डालते हैं, इसलिए इस सार मॉडल का उपयोग [[त्रिकोणीय सरणी]] और अन्य अजीब आकार के सरणियों के लिए किया जा सकता है। | ये स्वयंसिद्ध वैध इंडेक्स ट्यूपल्स I के समुच्चय पर कोई बाधा नहीं डालते हैं, इसलिए इस सार मॉडल का उपयोग [[त्रिकोणीय सरणी]] और अन्य अजीब आकार के सरणियों के लिए किया जा सकता है। | ||
Line 34: | Line 34: | ||
सरणी डेटा संरचना (सूचक अंकगणित द्वारा किए गए अनुक्रमण के साथ) जैसे प्रकार के वेरिएबल्स को प्रभावी ढंग से प्रयुक्त करने के लिए, कई भाषाएँ [[पूर्णांक (कंप्यूटर विज्ञान)]] डेटा प्रकारों (या अन्य प्रकार जिन्हें पूर्णांक के रूप में व्याख्या की जा सकती हैं, जैसे [[बाइट|बाइटस]] और अन्य प्रकार) के लिए सूचकांकों को प्रतिबंधित करती हैं। [[प्रगणित प्रकार]]), और आवश्यक है कि सभी अवयव का डेटा प्रकार और भंडारण आकार समान हो। उन भाषाओं में से अधिकांश प्रत्येक अनुक्रमणिका को पूर्णांकों के परिमित [[अंतराल (गणित)]] तक सीमित करती हैं, जो कि सरणी वेरिएबल्स के पूरे जीवनकाल में स्थिर रहता है। कुछ [[संकलक]] भाषाओं में, वास्तव में, इंडेक्स रेंज को [[संकलन समय]] पर जाना जा सकता है। | सरणी डेटा संरचना (सूचक अंकगणित द्वारा किए गए अनुक्रमण के साथ) जैसे प्रकार के वेरिएबल्स को प्रभावी ढंग से प्रयुक्त करने के लिए, कई भाषाएँ [[पूर्णांक (कंप्यूटर विज्ञान)]] डेटा प्रकारों (या अन्य प्रकार जिन्हें पूर्णांक के रूप में व्याख्या की जा सकती हैं, जैसे [[बाइट|बाइटस]] और अन्य प्रकार) के लिए सूचकांकों को प्रतिबंधित करती हैं। [[प्रगणित प्रकार]]), और आवश्यक है कि सभी अवयव का डेटा प्रकार और भंडारण आकार समान हो। उन भाषाओं में से अधिकांश प्रत्येक अनुक्रमणिका को पूर्णांकों के परिमित [[अंतराल (गणित)]] तक सीमित करती हैं, जो कि सरणी वेरिएबल्स के पूरे जीवनकाल में स्थिर रहता है। कुछ [[संकलक]] भाषाओं में, वास्तव में, इंडेक्स रेंज को [[संकलन समय]] पर जाना जा सकता है। | ||
दूसरी ओर, कुछ प्रोग्रामिंग लैंग्वेज अधिक उदार सरणी प्रकार प्रदान करती हैं, जो मनमाना मूल्यों, जैसे [[तैरनेवाला स्थल]] | फ़्लोटिंग-पॉइंट नंबर, स्ट्रिंग (कंप्यूटर विज्ञान), [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]], [[संदर्भ (कंप्यूटर विज्ञान)]], आदि द्वारा अनुक्रमण की अनुमति देती हैं। इस तरह के सूचकांक मूल्यों को अंतराल तक सीमित नहीं किया जा सकता है, निश्चित अंतराल बहुत कम। इसलिए, ये भाषाएं सामान्यतः | दूसरी ओर, कुछ प्रोग्रामिंग लैंग्वेज अधिक उदार सरणी प्रकार प्रदान करती हैं, जो मनमाना मूल्यों, जैसे [[तैरनेवाला स्थल]] | फ़्लोटिंग-पॉइंट नंबर, स्ट्रिंग (कंप्यूटर विज्ञान), [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]], [[संदर्भ (कंप्यूटर विज्ञान)]], आदि द्वारा अनुक्रमण की अनुमति देती हैं। इस तरह के सूचकांक मूल्यों को अंतराल तक सीमित नहीं किया जा सकता है, निश्चित अंतराल बहुत कम। इसलिए, ये भाषाएं सामान्यतः इच्छानुसार तरह से नए अवयव को किसी भी समय बनाने की अनुमति देती हैं। यह विकल्प सरणी प्रकार के कार्यान्वयन को सरणी डेटा संरचनाओं के रूप में रोकता है। अर्थात्, वे भाषाएँ अधिक सामान्य साहचर्य सरणी शब्दार्थ को प्रयुक्त करने के लिए सरणी-जैसे सिंटैक्स का उपयोग करती हैं, और इसलिए उन्हें हैश तालिका या किसी अन्य [[खोज डेटा संरचना]] द्वारा कार्यान्वित किया जाना चाहिए। | ||
== भाषा समर्थन == | == भाषा समर्थन == | ||
=== बहु-आयामी सरणियाँ === | === बहु-आयामी सरणियाँ === | ||
किसी | किसी अवयव को निर्दिष्ट करने के लिए आवश्यक सूचकांकों की संख्या को सरणी प्रकार का आयाम, आयाम या [[रैंक (कंप्यूटर प्रोग्रामिंग)]] कहा जाता है। (यह नामकरण रेखीय बीजगणित में आयाम की अवधारणा के साथ संघर्ष करता है, जो मैट्रिक्स (गणित) # परिभाषा को व्यक्त करता है। इस प्रकार, 5 पंक्तियों और 4 स्तंभों वाली संख्याओं की सरणी, इसलिए 20 अवयव को कंप्यूटिंग संदर्भों में आयाम 2 कहा जाता है, किन्तु एक मैट्रिक्स का प्रतिनिधित्व करता है जिसे 4 × 5-आयामी कहा जाता है। साथ ही, रैंक का कंप्यूटर विज्ञान अर्थ [[टेंसर रैंक]] की धारणा के साथ संघर्ष करता है, जो [[मैट्रिक्स रैंक]] की रैखिक बीजगणित अवधारणा का सामान्यीकरण है।) | ||
[[File:Array of array storage.svg|120px|right|एक द्वि-आयामी सरणी को एक-आयामी सरणियों (पंक्तियों) के एक-आयामी सरणी के रूप में संग्रहीत किया जाता है।]]कई भाषाएँ केवल आयामी सरणियों का समर्थन करती हैं। उन भाषाओं में, एक बहु-आयामी सरणी को सामान्यतः Iliffe वेक्टर द्वारा दर्शाया जाता है, जो एक आयाम से कम के सरणियों के संदर्भ (कंप्यूटर विज्ञान) की एक-आयामी सरणी है। एक द्वि-आयामी सरणी, विशेष रूप से, इसकी पंक्तियों के पॉइंटर्स [[इलिफ वेक्टर]] के रूप में कार्यान्वित की जाएगी। इस प्रकार सरणी A की पंक्ति i और कॉलम j में एक | [[File:Array of array storage.svg|120px|right|एक द्वि-आयामी सरणी को एक-आयामी सरणियों (पंक्तियों) के एक-आयामी सरणी के रूप में संग्रहीत किया जाता है।]]कई भाषाएँ केवल आयामी सरणियों का समर्थन करती हैं। उन भाषाओं में, एक बहु-आयामी सरणी को सामान्यतः Iliffe वेक्टर द्वारा दर्शाया जाता है, जो एक आयाम से कम के सरणियों के संदर्भ (कंप्यूटर विज्ञान) की एक-आयामी सरणी है। एक द्वि-आयामी सरणी, विशेष रूप से, इसकी पंक्तियों के पॉइंटर्स [[इलिफ वेक्टर]] के रूप में कार्यान्वित की जाएगी। इस प्रकार सरणी A की पंक्ति i और कॉलम j में एक अवयव को डबल इंडेक्सिंग (A[i][j] विशिष्ट संकेतन में) द्वारा अभिगम किया जाएगा। बहुआयामी सरणियों का अनुकरण करने का यह विधि दांतेदार सरणियों के निर्माण की अनुमति देता है, जहां प्रत्येक पंक्ति का एक अलग आकार हो सकता है - या, सामान्यतः, जहां प्रत्येक सूचकांक की मान्य सीमा सभी पूर्ववर्ती सूचकांकों के मूल्यों पर निर्भर करती है। | ||
बहुआयामी सरणियों के लिए यह प्रतिनिधित्व सी और सी ++ सॉफ्टवेयर में अधिक प्रचलित है। यद्यपि, सी और सी ++ बहु-आयामी सरणियों के लिए रेखीय अनुक्रमण सूत्र का उपयोग करेंगे जो संकलन समय स्थिर आकार के साथ घोषित किए गए हैं, उदा। | बहुआयामी सरणियों के लिए यह प्रतिनिधित्व सी और सी ++ सॉफ्टवेयर में अधिक प्रचलित है। यद्यपि, सी और सी ++ बहु-आयामी सरणियों के लिए रेखीय अनुक्रमण सूत्र का उपयोग करेंगे जो संकलन समय स्थिर आकार के साथ घोषित किए गए हैं, उदा। पारंपरिक <code>int **A</code>. के अतिरिक्त <code>int A[10][20]</code> या <code>int A[m][n]</code>, द्वारा। <ref>Brian W. Kernighan and Dennis M. Ritchie (1988), ''The C programming Language''. Prentice-Hall, p. 81.</ref> | ||
=== अनुक्रमण संकेतन === | === अनुक्रमण संकेतन === | ||
अधिकांश प्रोग्रामिंग भाषाएं जो सरणियों का समर्थन करती हैं, स्टोर का समर्थन करती हैं और संचालन का चयन करती हैं, और अनुक्रमण के लिए विशेष सिंटैक्स होता है। प्रारंभिक भाषाओं में कोष्ठकों का प्रयोग किया जाता था, उदा. <code>A(i,j)</code>, फोरट्रान के रूप में; अन्य वर्ग कोष्ठक चुनते हैं, उदा। <code>A[i,j]</code> या <code>A[i][j]</code>, जैसा कि एल्गोल 60 और पास्कल में है ([[समारोह कॉल]] के लिए कोष्ठकों के उपयोग से अलग करने के लिए)। | अधिकांश प्रोग्रामिंग भाषाएं जो सरणियों का समर्थन करती हैं, स्टोर का समर्थन करती हैं और संचालन का चयन करती हैं, और अनुक्रमण के लिए विशेष सिंटैक्स होता है। प्रारंभिक भाषाओं में कोष्ठकों का प्रयोग किया जाता था, उदा. <code>A(i,j)</code>, फोरट्रान के रूप में; अन्य वर्ग कोष्ठक चुनते हैं, उदा। <code>A[i,j]</code> या <code>A[i][j]</code>, जैसा कि एल्गोल 60 और पास्कल में है ([[समारोह कॉल|फलन कॉल]] के लिए कोष्ठकों के उपयोग से अलग करने के लिए)। | ||
=== सूचकांक प्रकार === | === सूचकांक प्रकार === | ||
सरणी डेटा प्रकारों को अधिकांशतः सरणी संरचनाओं के रूप में प्रयुक्त किया जाता है: पूर्णांक (या पूरी तरह से आदेशित) मानों तक सीमित सूचकांकों के साथ, सरणी निर्माण समय पर तय की गई अनुक्रमणिका श्रेणियां, और बहु-रेखीय | सरणी डेटा प्रकारों को अधिकांशतः सरणी संरचनाओं के रूप में प्रयुक्त किया जाता है: पूर्णांक (या पूरी तरह से आदेशित) मानों तक सीमित सूचकांकों के साथ, सरणी निर्माण समय पर तय की गई अनुक्रमणिका श्रेणियां, और बहु-रेखीय अवयव एड्रेसिंग। अधिकांश तीसरी पीढ़ी की प्रोग्रामिंग भाषा में यही स्थिति थी| तीसरी पीढ़ी की भाषाएँ, और अभी भी अधिकांश [[सिस्टम प्रोग्रामिंग भाषा|प्रणाली प्रोग्रामिंग भाषा]]ओं जैसे [[एडा (प्रोग्रामिंग भाषा)]], [[सी प्रोग्रामिंग भाषा]] और [[सी ++]] का मामला है। यद्यपि, कुछ भाषाओं में, सरणी डेटा प्रकारों में साहचर्य सरणियों के शब्दार्थ होते हैं, जिनमें मनमाना प्रकार और गतिशील अवयव निर्माण के सूचकांक होते हैं। यह कुछ स्क्रिप्टिंग भाषाओं जैसे [[Awk प्रोग्रामिंग लैंग्वेज|एडब्लूके प्रोग्रामिंग लैंग्वेज]] और लुआ (प्रोग्रामिंग लैंग्वेज) और मानक सी ++ लाइब्रेरी द्वारा प्रदान किए गए कुछ सरणी प्रकारों में होता है। | ||
=== सीमा जाँच === | === सीमा जाँच === | ||
{{main|सीमा की जांच}} | {{main|सीमा की जांच}} | ||
कुछ भाषाएं (जैसे पास्कल और मोडुला) हर | कुछ भाषाएं (जैसे पास्कल और मोडुला) हर अभिगम पर [[सीमा जाँच]] करती हैं, अपवाद (कंप्यूटर साइंस) उठाती हैं या किसी इंडेक्स के वैध सीमा से बाहर होने पर प्रोग्राम को रद्द कर देती हैं। गति के लिए व्यापार सुरक्षा के लिए संकलक इन चेकों को बंद करने की अनुमति दे सकते हैं। अन्य भाषाएँ (जैसे फोरट्रान और सी) प्रोग्रामर पर भरोसा करती हैं और कोई जाँच नहीं करती हैं। अच्छे संकलक सूचकांक के संभावित मूल्यों की सीमा निर्धारित करने के लिए कार्यक्रम का विश्लेषण भी कर सकते हैं, और इस विश्लेषण से सीमा-जाँच समाप्त हो सकती है। | ||
=== सूचकांक उत्पत्ति === | === सूचकांक उत्पत्ति === | ||
Line 57: | Line 57: | ||
कुछ भाषाएं, जैसे सी, केवल [[शून्य-आधारित नंबरिंग]]|शून्य-आधारित सरणी प्रकार प्रदान करती हैं, जिसके लिए किसी भी इंडेक्स के लिए न्यूनतम मान्य मान 0 है। यह विकल्प सरणी कार्यान्वयन और पता गणनाओं के लिए सुविधाजनक है। सी जैसी भाषा के साथ, किसी भी सरणी के इंटीरियर के लिए सूचक को परिभाषित किया जा सकता है जो प्रतीकात्मक रूप से छद्म-सरणी के रूप में कार्य करेगा जो नकारात्मक सूचकांकों को समायोजित करता है। यह केवल इसलिए काम करता है क्योंकि सी उपयोग किए जाने पर सीमाओं के विरुद्ध सूचकांक की जांच नहीं करता है। | कुछ भाषाएं, जैसे सी, केवल [[शून्य-आधारित नंबरिंग]]|शून्य-आधारित सरणी प्रकार प्रदान करती हैं, जिसके लिए किसी भी इंडेक्स के लिए न्यूनतम मान्य मान 0 है। यह विकल्प सरणी कार्यान्वयन और पता गणनाओं के लिए सुविधाजनक है। सी जैसी भाषा के साथ, किसी भी सरणी के इंटीरियर के लिए सूचक को परिभाषित किया जा सकता है जो प्रतीकात्मक रूप से छद्म-सरणी के रूप में कार्य करेगा जो नकारात्मक सूचकांकों को समायोजित करता है। यह केवल इसलिए काम करता है क्योंकि सी उपयोग किए जाने पर सीमाओं के विरुद्ध सूचकांक की जांच नहीं करता है। | ||
अन्य भाषाएँ केवल एक-आधारित सरणी प्रकार प्रदान करती हैं, जहाँ प्रत्येक [[अनुक्रम]]णिका 1 से | अन्य भाषाएँ केवल एक-आधारित सरणी प्रकार प्रदान करती हैं, जहाँ प्रत्येक [[अनुक्रम]]णिका 1 से प्रारंभिक होती है; यह मैट्रिसेस और गणितीय अनुक्रमों के लिए गणित की पारंपरिक परंपरा है। पास्कल और लुआ जैसी कुछ भाषाएं एन-आधारित सरणी प्रकारों का समर्थन करती हैं, जिनके न्यूनतम नियमी सूचकांक प्रोग्रामर द्वारा चुने जाते हैं। प्रत्येक पसंद के सापेक्ष गुण गरमागरम बहस का विषय रहे हैं। शून्य-आधारित इंडेक्सिंग [[ऑफ-बाय-वन एरर]] | ऑफ-बाय-वन या [[बाड़पोस्ट त्रुटि]] से बच सकती है,<ref>[[Edsger W. Dijkstra]], "[http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html Why numbering should start at zero]"</ref> विशेष रूप से 0-आधारित <code>for (i = 0; i < 5; i += 1)</code> पुनरावृत्त (5-0) बार, जबकि समतुल्य 1-आधारित अर्ध-खुली सीमा में <code>for (i = 1; i < 6; i += 1)</code> 6 अपने आप में संभावित ऐसी त्रुटि है, जिसकी सामान्यतः आवश्यकता होती है <code>length() + 1</code>, और 1-आधारित समावेशी श्रेणी <code>for (i = 1; i <= 5; i+= 1)</code> पुनरावृत्त (5-1) +1 बार। | ||
=== उच्चतम सूचकांक === | === उच्चतम सूचकांक === | ||
एक सरणी घोषणा में दिखाई देने वाली संख्याओं और उस सरणी के अंतिम | एक सरणी घोषणा में दिखाई देने वाली संख्याओं और उस सरणी के अंतिम अवयव की अनुक्रमणिका के बीच का संबंध भी भाषा के अनुसार भिन्न होता है। कई भाषाओं में (जैसे सी), किसी को सरणी में निहित अवयव की संख्या निर्दिष्ट करनी चाहिए; जबकि अन्य में (जैसे पास्कल और विज़ुअल बेसिक .नेट) अंतिम अवयव के सूचकांक के संख्यात्मक मान को निर्दिष्ट करना चाहिए। कहने की आवश्यकता नहीं है, यह भेद उन भाषाओं में महत्वहीन है जहां सूचकांक 1 से प्रारंभिक होते हैं, जैसे लुआ (प्रोग्रामिंग भाषा)। | ||
=== सरणी बीजगणित === | === सरणी बीजगणित === | ||
कुछ प्रोग्रामिंग लैंग्वेज सरणी प्रोग्रामिंग को सपोर्ट करती हैं, जहां कुछ डेटा टाइप्स के लिए परिभाषित ऑपरेशंस और फंक्शन्स को उन टाइप्स के एलिमेंट्स के सरणी तक बढ़ाया जाता है। इस प्रकार दो सरणियों A और B के संबंधित अवयव को जोड़ने के लिए A+B लिख सकते हैं। सामान्यतः ये भाषाएँ हैडमार्ड उत्पाद (मैट्रिसेस) | | कुछ प्रोग्रामिंग लैंग्वेज सरणी प्रोग्रामिंग को सपोर्ट करती हैं, जहां कुछ डेटा टाइप्स के लिए परिभाषित ऑपरेशंस और फंक्शन्स को उन टाइप्स के एलिमेंट्स के सरणी तक बढ़ाया जाता है। इस प्रकार दो सरणियों A और B के संबंधित अवयव को जोड़ने के लिए A+B लिख सकते हैं। सामान्यतः ये भाषाएँ हैडमार्ड उत्पाद (मैट्रिसेस) | अवयव-दर-अवयव गुणन और रैखिक बीजगणित के मानक [[डॉट उत्पाद]] दोनों प्रदान करती हैं, और इनमें से कौन सा है * ऑपरेटर द्वारा प्रस्तुत भाषा के अनुसार भिन्न होता है। | ||
[[एपीएल प्रोग्रामिंग भाषा]] के इस क्षेत्र में नवाचारों के बाद से [[सरणी प्रोग्रामिंग]] क्षमताओं को प्रदान करने वाली भाषाओं का प्रसार हुआ है। ये [[डोमेन-विशिष्ट भाषा]]ओं की मुख्य क्षमताएँ हैं जैसे गॉस (प्रोग्रामिंग लैंग्वेज), [[इंटरएक्टिव डेटा भाषा]], मैटलैब और [[मेथेमेटिका]] वे [[जूलिया (प्रोग्रामिंग भाषा)]] और [[फोरट्रान]] के हाल के संस्करणों जैसी नई भाषाओं में मुख्य सुविधा हैं। ये क्षमताएं अन्य सामान्य प्रयोजन प्रोग्रामिंग भाषाओं के लिए मानक विस्तार पुस्तकालयों के माध्यम से भी प्रदान की जाती हैं (जैसे कि [[पायथन (प्रोग्रामिंग भाषा)]] के लिए व्यापक रूप से उपयोग की जाने वाली [[NumPy|न्यूमपी]] लाइब्रेरी)। | [[एपीएल प्रोग्रामिंग भाषा]] के इस क्षेत्र में नवाचारों के बाद से [[सरणी प्रोग्रामिंग]] क्षमताओं को प्रदान करने वाली भाषाओं का प्रसार हुआ है। ये [[डोमेन-विशिष्ट भाषा]]ओं की मुख्य क्षमताएँ हैं जैसे गॉस (प्रोग्रामिंग लैंग्वेज), [[इंटरएक्टिव डेटा भाषा]], मैटलैब और [[मेथेमेटिका]] वे [[जूलिया (प्रोग्रामिंग भाषा)]] और [[फोरट्रान]] के हाल के संस्करणों जैसी नई भाषाओं में मुख्य सुविधा हैं। ये क्षमताएं अन्य सामान्य प्रयोजन प्रोग्रामिंग भाषाओं के लिए मानक विस्तार पुस्तकालयों के माध्यम से भी प्रदान की जाती हैं (जैसे कि [[पायथन (प्रोग्रामिंग भाषा)]] के लिए व्यापक रूप से उपयोग की जाने वाली [[NumPy|न्यूमपी]] लाइब्रेरी)। | ||
Line 75: | Line 75: | ||
नव निर्मित सरणी के अवयव में अपरिभाषित मान हो सकते हैं (जैसा कि सी में), या विशिष्ट डिफ़ॉल्ट मान जैसे 0 या शून्य सूचक (जावा में) के रूप में परिभाषित किया जा सकता है। | नव निर्मित सरणी के अवयव में अपरिभाषित मान हो सकते हैं (जैसा कि सी में), या विशिष्ट डिफ़ॉल्ट मान जैसे 0 या शून्य सूचक (जावा में) के रूप में परिभाषित किया जा सकता है। | ||
सी ++ में एसटीडी :: वेक्टर ऑब्जेक्ट स्टोर का समर्थन करता है, ऊपर चर्चा की गई प्रदर्शन विशेषताओं के साथ संचालन का चयन करता है और जोड़ता है। वैक्टर को उनके आकार के लिए पूछा जा सकता है और उनका आकार बदला जा सकता है। बीच में | सी ++ में एसटीडी :: वेक्टर ऑब्जेक्ट स्टोर का समर्थन करता है, ऊपर चर्चा की गई प्रदर्शन विशेषताओं के साथ संचालन का चयन करता है और जोड़ता है। वैक्टर को उनके आकार के लिए पूछा जा सकता है और उनका आकार बदला जा सकता है। बीच में अवयव डालने जैसे धीमे संचालन भी समर्थित हैं। | ||
=== स्लाइसिंग === | === स्लाइसिंग === | ||
एक [[सरणी टुकड़ा करना]] ऑपरेशन सरणी-टाइप की गई इकाई (मान या वेरिएबल्स) के अवयव का उपसमुच्चय लेता है और फिर उन्हें अन्य सरणी-टाइप की गई इकाई के रूप में इकट्ठा करता है, संभवतः अन्य सूचकांकों के साथ। यदि सरणी प्रकारों को सरणी संरचनाओं के रूप में कार्यान्वित किया जाता है, तो संरचना के [[डोप वेक्टर]] में हेरफेर करके कई उपयोगी स्लाइसिंग ऑपरेशंस (जैसे कि उप-सरणी का चयन करना, सूचकांकों की अदला-बदली करना या सूचकांकों की दिशा को उलटना) बहुत कुशलता से किया जा सकता है। संभावित स्लाइसिंग कार्यान्वयन विवरण पर निर्भर करती है: उदाहरण के लिए, फोरट्रान मैट्रिक्स वेरिएबल्स के एक कॉलम को स्लाइस करने की अनुमति देता है, | एक [[सरणी टुकड़ा करना|सरणी भाग करना]] ऑपरेशन सरणी-टाइप की गई इकाई (मान या वेरिएबल्स) के अवयव का उपसमुच्चय लेता है और फिर उन्हें अन्य सरणी-टाइप की गई इकाई के रूप में इकट्ठा करता है, संभवतः अन्य सूचकांकों के साथ। यदि सरणी प्रकारों को सरणी संरचनाओं के रूप में कार्यान्वित किया जाता है, तो संरचना के [[डोप वेक्टर]] में हेरफेर करके कई उपयोगी स्लाइसिंग ऑपरेशंस (जैसे कि उप-सरणी का चयन करना, सूचकांकों की अदला-बदली करना या सूचकांकों की दिशा को उलटना) बहुत कुशलता से किया जा सकता है। संभावित स्लाइसिंग कार्यान्वयन विवरण पर निर्भर करती है: उदाहरण के लिए, फोरट्रान मैट्रिक्स वेरिएबल्स के एक कॉलम को स्लाइस करने की अनुमति देता है, किन्तु एक पंक्ति नहीं, और इसे वेक्टर के रूप में मानता है; जबकि सी मैट्रिक्स से पंक्ति को भाग करने की अनुमति देता है, किन्तु एक स्तंभ नहीं है। | ||
दूसरी तरफ, अन्य स्लाइसिंग ऑपरेशंस संभव होते हैं जब सरणी प्रकार अन्य तरीकों से प्रयुक्त होते हैं। | दूसरी तरफ, अन्य स्लाइसिंग ऑपरेशंस संभव होते हैं जब सरणी प्रकार अन्य तरीकों से प्रयुक्त होते हैं। | ||
Line 84: | Line 84: | ||
कुछ भाषाएँ डायनेमिक सरणियों की अनुमति देती हैं (जिन्हें आकार बदलने योग्य, बढ़ने योग्य या एक्स्टेंसिबल भी कहा जाता है): सरणी वेरिएबल्स जिनकी इंडेक्स रेंज को इसके वर्तमान अवयव के मूल्यों को बदले बिना, निर्माण के बाद किसी भी समय विस्तारित किया जा सकता है। | कुछ भाषाएँ डायनेमिक सरणियों की अनुमति देती हैं (जिन्हें आकार बदलने योग्य, बढ़ने योग्य या एक्स्टेंसिबल भी कहा जाता है): सरणी वेरिएबल्स जिनकी इंडेक्स रेंज को इसके वर्तमान अवयव के मूल्यों को बदले बिना, निर्माण के बाद किसी भी समय विस्तारित किया जा सकता है। | ||
एक आयामी सरणियों के लिए, यह सुविधा ऑपरेशन के रूप में प्रदान की जा सकती है<code>append</code>( | एक आयामी सरणियों के लिए, यह सुविधा ऑपरेशन के रूप में प्रदान की जा सकती है<code>append</code>(''A'',''x'') जो सरणी A के आकार को एक से बढ़ाता है और फिर अंतिम अवयव का मान एक्स पर समुच्चय करता है। अन्य सरणी प्रकार (जैसे पास्कल स्ट्रिंग्स) संयोजन संचालिका प्रदान करते हैं, जिसका उपयोग स्लाइसिंग के साथ मिलकर उस प्रभाव को प्राप्त करने के लिए किया जा सकता है। कुछ भाषाओं में, किसी सरणी के किसी अवयव को मान निर्दिष्ट करने से उस अवयव को सम्मिलित करने के लिए, यदि आवश्यक हो, तो स्वचालित रूप से सरणी का विस्तार हो जाता है। अन्य सरणी प्रकारों में, एक स्लाइस को अलग-अलग आकार की एक सरणी द्वारा प्रतिस्थापित किया जा सकता है, जिसके बाद के अवयव को तदनुसार फिर से क्रमांकित किया जा सकता है - जैसा कि पायथन की सूची असाइनमेंट में A[5:5] = [10,20,30] है, जो तीन नए अवयव को सम्मिलित करता है ( 10,20, और 30) अवयव A [5] से पहले। आकार बदलने योग्य सरणियाँ वैचारिक रूप से [[सूची (कंप्यूटर विज्ञान)]] के समान हैं, और दो अवधारणाएँ कुछ भाषाओं में समानार्थी हैं। | ||
एक एक्स्टेंसिबल सरणी को निश्चित आकार के सरणी के रूप में प्रयुक्त किया जा सकता है, जिसमें काउंटर होता है जो रिकॉर्ड करता है कि वास्तव में कितने | एक एक्स्टेंसिबल सरणी को निश्चित आकार के सरणी के रूप में प्रयुक्त किया जा सकता है, जिसमें काउंटर होता है जो रिकॉर्ड करता है कि वास्तव में कितने अवयव उपयोग में हैं। <code>append</code> ऑपरेशन केवल काउंटर को बढ़ाता है; जब तक पूरे सरणी का उपयोग नहीं किया जाता है, जब <code>append</code> ऑपरेशन को विफल करने के लिए परिभाषित किया जा सकता है। यह निश्चित क्षमता के साथ गतिशील सरणी का कार्यान्वयन है, जैसा कि <code>string</code> पास्कल का प्रकार। वैकल्पिक रूप से, <code>append</code> ऑपरेशन बड़े आकार के साथ अंतर्निहित सरणी को फिर से आवंटित कर सकता है, और पुराने अवयव को नए क्षेत्र में प्रतिलिपि कर सकता है। | ||
== यह भी देखें == | == यह भी देखें == |
Revision as of 15:24, 7 March 2023
कंप्यूटर विज्ञान में, सरणी डेटा प्रकार है जो 'अवयव' (मूल्य (कंप्यूटर विज्ञान) या वेरिएबल्स(चर) (कंप्यूटर विज्ञान)) के संग्रह का प्रतिनिधित्व करता है, प्रत्येक या से अधिक सूचकांकों (कुंजियों की पहचान) द्वारा चुना जाता है जिसे रन पर गणना की जा सकती है समय (कार्यक्रम जीवनचक्र चरण) कार्यक्रम निष्पादन के समय। इस तरह के संग्रह को सामान्यतः सरणी वेरिएबल्स या सरणी मान कहा जाता है।[1] गणितीय अवधारणाओं वेक्टर (गणित) और मैट्रिक्स (गणित) के अनुरूप, एक और दो सूचकांक वाले सरणी प्रकारों को क्रमशः वेक्टर प्रकार और मैट्रिक्स प्रकार कहा जाता है। अधिक सामान्यतः, बहुआयामी सरणी प्रकार को टेन्सर प्रकार कहा जा सकता है, भौतिक अवधारणा, टेंसर के अनुरूप है।[2]
सरणी प्रकारों के लिए भाषा समर्थन में कुछ अंतर्निर्मित प्रकार सम्मिलित हो सकते हैं|अंतर्निहित सरणी डेटा प्रकार, कुछ सिंटैक्टिक निर्माण (सरणी प्रकार निर्माता) जो प्रोग्रामर ऐसे प्रकारों को परिभाषित करने और सरणी वेरिएबल्स घोषित करने के लिए उपयोग कर सकते हैं, और सरणी अवयव को अनुक्रमणित करने के लिए विशेष संकेतन सम्मिलित हो सकते हैं।[1] उदाहरण के लिए, पास्कल प्रोग्रामिंग भाषा में, डिक्लेरेशन type MyTable = array [1..4,1..2] of integer
, नामक नए सरणी डेटा प्रकार को परिभाषित करता है MyTable
. घोषणा var A: MyTable
फिर वेरिएबल्स परिभाषित करता है A
उस प्रकार का, जो आठ अवयव का योग है, प्रत्येक पूर्णांक वेरिएबल्स है जिसे दो सूचकांकों द्वारा पहचाना जाता है। पास्कल प्रोग्राम में, उन अवयव को निरूपित किया जाता है A[1,1]
, A[1,2]
, A[2,1]
, …, A[4,2]
.[3] विशेष सरणी प्रकार अधिकांशतः भाषा के मानक पुस्तकालय (कंप्यूटर विज्ञान) द्वारा परिभाषित किए जाते हैं।
डायनेमिक सूचियाँ भी अधिक सामान्य और प्रयुक्त करने में आसान हैं गतिशील सरणियों की तुलना में। सरणी प्रकारों को रिकॉर्ड (कंप्यूटर विज्ञान) प्रकारों से मुख्य रूप से अलग किया जाता है क्योंकि वे पास्कल समनुदेशन ब्यान के रूप में रन टाइम (प्रोग्राम जीवनचक्र चरण) पर अवयव सूचकांकों की गणना करने की अनुमति देते हैं। A[I,J] := A[N-I,2*J]
. अन्य बातों के अतिरिक्त, यह सुविधा एकल पुनरावृत्त कथन (कंप्यूटर विज्ञान) को सरणी वेरिएबल्स के इच्छानुसार तरह से कई अवयव को संसाधित करने की अनुमति देती है।
अधिक सैद्धांतिक संदर्भों में, विशेष रूप से प्रकार के सिद्धांत में और अमूर्त कलन विधि के विवरण में, सरणी और सरणी प्रकार कभी-कभी सार डेटा प्रकार (ADT) को संदर्भित करते हैं जिसे सार सरणी भी कहा जाता है या साहचर्य सरणी, गणित मॉडल का उल्लेख कर सकता है। अधिकांश भाषाओं में विशिष्ट सरणी प्रकार के मूलभूतसंचालन और व्यवहार - मूल रूप से, अवयव का संग्रह जो रन-टाइम पर गणना किए गए सूचकांकों द्वारा चुना जाता है।
भाषा के आधार पर, सरणी प्रकार अन्य डेटा प्रकारों जैसे सूची (कंप्यूटिंग) और स्ट्रिंग (कंप्यूटर विज्ञान) का वर्णन करने वाले अन्य डेटा प्रकारों को ओवरलैप (या पहचाना जा सकता है) कर सकते हैं। सरणी प्रकार अधिकांशतः सरणी डेटा संरचनाओं द्वारा कार्यान्वित किए जाते हैं, किन्तु कभी-कभी अन्य तरीकों से, जैसे हैश तालिका, लिंक्ड सूचियां, या ट्री खोज आदि है।
इतिहास
हेंज रूटिशॉसर की प्रोग्रामिंग भाषा सुपरप्लान (1949-1951) में बहुआयामी सरणियाँ सम्मिलित थीं। रुतिशौसर चूंकि यह वर्णन करते हुए कि उनकी भाषा के लिए संकलक कैसे बनाया जाना चाहिए,
असेंबली लैंग्वेज और लो-लेवल लैंग्वेज जैसे बीसीपीएल[4] सामान्यतः सरणी के लिए कोई सिंटैक्टिक समर्थन नहीं होता है।
कुशल संगणना के लिए सरणी संरचनाओं के महत्व के कारण, फोरट्रान (1957), कोबोल (1960) और अल्गोल 60 (1960) सहित सबसे प्रारंभिक उच्च-स्तरीय प्रोग्रामिंग भाषाओं ने बहु-आयामी सरणियों के लिए समर्थन प्रदान किया गया।
सार सरणियाँ
एक सरणी डेटा संरचना को गणितीय रूप से सार डेटा संरचना (एक सार सरणी) के रूप में दो कार्यों के साथ तैयार किया जा सकता है
- प्राप्त करें (A, I): सरणी A के अवयव में संग्रहीत डेटा जिसका सूचकांक पूर्णांक टपल है।
- समुच्चय (A,I,V): वह सरणी जो उस अवयव के मान को V पर समुच्चय करके परिणाम देती है।
सिद्धांतों को पूरा करने के लिए इन परिचालनों की आवश्यकता होती है[5]
- प्राप्त करें (समुच्चय (A,I, V), I) = V
- प्राप्त(समुच्चय(A,I, V), J) = प्राप्त(A, J) यदि I ≠ J
किसी भी सरणी स्थिति A के लिए, कोई मान V, और कोई भी टपल्स I, J जिसके लिए संचालन परिभाषित हैं।
प्रथम स्वयंसिद्ध का अर्थ है कि प्रत्येक अवयव वेरिएबल्स की तरह व्यवहार करता है। दूसरे स्वयंसिद्ध का अर्थ है कि अलग-अलग सूचकांक वाले अवयव अलियासिंग (कंप्यूटिंग) वेरिएबल्स के रूप में व्यवहार करते हैं, जिससेएक अवयव में मान संग्रहीत करना किसी अन्य अवयव के मूल्य को प्रभावित न करे।
ये स्वयंसिद्ध वैध इंडेक्स ट्यूपल्स I के समुच्चय पर कोई बाधा नहीं डालते हैं, इसलिए इस सार मॉडल का उपयोग त्रिकोणीय सरणी और अन्य अजीब आकार के सरणियों के लिए किया जा सकता है।
कार्यान्वयन
सरणी डेटा संरचना (सूचक अंकगणित द्वारा किए गए अनुक्रमण के साथ) जैसे प्रकार के वेरिएबल्स को प्रभावी ढंग से प्रयुक्त करने के लिए, कई भाषाएँ पूर्णांक (कंप्यूटर विज्ञान) डेटा प्रकारों (या अन्य प्रकार जिन्हें पूर्णांक के रूप में व्याख्या की जा सकती हैं, जैसे बाइटस और अन्य प्रकार) के लिए सूचकांकों को प्रतिबंधित करती हैं। प्रगणित प्रकार), और आवश्यक है कि सभी अवयव का डेटा प्रकार और भंडारण आकार समान हो। उन भाषाओं में से अधिकांश प्रत्येक अनुक्रमणिका को पूर्णांकों के परिमित अंतराल (गणित) तक सीमित करती हैं, जो कि सरणी वेरिएबल्स के पूरे जीवनकाल में स्थिर रहता है। कुछ संकलक भाषाओं में, वास्तव में, इंडेक्स रेंज को संकलन समय पर जाना जा सकता है।
दूसरी ओर, कुछ प्रोग्रामिंग लैंग्वेज अधिक उदार सरणी प्रकार प्रदान करती हैं, जो मनमाना मूल्यों, जैसे तैरनेवाला स्थल | फ़्लोटिंग-पॉइंट नंबर, स्ट्रिंग (कंप्यूटर विज्ञान), ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग, संदर्भ (कंप्यूटर विज्ञान), आदि द्वारा अनुक्रमण की अनुमति देती हैं। इस तरह के सूचकांक मूल्यों को अंतराल तक सीमित नहीं किया जा सकता है, निश्चित अंतराल बहुत कम। इसलिए, ये भाषाएं सामान्यतः इच्छानुसार तरह से नए अवयव को किसी भी समय बनाने की अनुमति देती हैं। यह विकल्प सरणी प्रकार के कार्यान्वयन को सरणी डेटा संरचनाओं के रूप में रोकता है। अर्थात्, वे भाषाएँ अधिक सामान्य साहचर्य सरणी शब्दार्थ को प्रयुक्त करने के लिए सरणी-जैसे सिंटैक्स का उपयोग करती हैं, और इसलिए उन्हें हैश तालिका या किसी अन्य खोज डेटा संरचना द्वारा कार्यान्वित किया जाना चाहिए।
भाषा समर्थन
बहु-आयामी सरणियाँ
किसी अवयव को निर्दिष्ट करने के लिए आवश्यक सूचकांकों की संख्या को सरणी प्रकार का आयाम, आयाम या रैंक (कंप्यूटर प्रोग्रामिंग) कहा जाता है। (यह नामकरण रेखीय बीजगणित में आयाम की अवधारणा के साथ संघर्ष करता है, जो मैट्रिक्स (गणित) # परिभाषा को व्यक्त करता है। इस प्रकार, 5 पंक्तियों और 4 स्तंभों वाली संख्याओं की सरणी, इसलिए 20 अवयव को कंप्यूटिंग संदर्भों में आयाम 2 कहा जाता है, किन्तु एक मैट्रिक्स का प्रतिनिधित्व करता है जिसे 4 × 5-आयामी कहा जाता है। साथ ही, रैंक का कंप्यूटर विज्ञान अर्थ टेंसर रैंक की धारणा के साथ संघर्ष करता है, जो मैट्रिक्स रैंक की रैखिक बीजगणित अवधारणा का सामान्यीकरण है।)
कई भाषाएँ केवल आयामी सरणियों का समर्थन करती हैं। उन भाषाओं में, एक बहु-आयामी सरणी को सामान्यतः Iliffe वेक्टर द्वारा दर्शाया जाता है, जो एक आयाम से कम के सरणियों के संदर्भ (कंप्यूटर विज्ञान) की एक-आयामी सरणी है। एक द्वि-आयामी सरणी, विशेष रूप से, इसकी पंक्तियों के पॉइंटर्स इलिफ वेक्टर के रूप में कार्यान्वित की जाएगी। इस प्रकार सरणी A की पंक्ति i और कॉलम j में एक अवयव को डबल इंडेक्सिंग (A[i][j] विशिष्ट संकेतन में) द्वारा अभिगम किया जाएगा। बहुआयामी सरणियों का अनुकरण करने का यह विधि दांतेदार सरणियों के निर्माण की अनुमति देता है, जहां प्रत्येक पंक्ति का एक अलग आकार हो सकता है - या, सामान्यतः, जहां प्रत्येक सूचकांक की मान्य सीमा सभी पूर्ववर्ती सूचकांकों के मूल्यों पर निर्भर करती है।
बहुआयामी सरणियों के लिए यह प्रतिनिधित्व सी और सी ++ सॉफ्टवेयर में अधिक प्रचलित है। यद्यपि, सी और सी ++ बहु-आयामी सरणियों के लिए रेखीय अनुक्रमण सूत्र का उपयोग करेंगे जो संकलन समय स्थिर आकार के साथ घोषित किए गए हैं, उदा। पारंपरिक int **A
. के अतिरिक्त int A[10][20]
या int A[m][n]
, द्वारा। [6]
अनुक्रमण संकेतन
अधिकांश प्रोग्रामिंग भाषाएं जो सरणियों का समर्थन करती हैं, स्टोर का समर्थन करती हैं और संचालन का चयन करती हैं, और अनुक्रमण के लिए विशेष सिंटैक्स होता है। प्रारंभिक भाषाओं में कोष्ठकों का प्रयोग किया जाता था, उदा. A(i,j)
, फोरट्रान के रूप में; अन्य वर्ग कोष्ठक चुनते हैं, उदा। A[i,j]
या A[i][j]
, जैसा कि एल्गोल 60 और पास्कल में है (फलन कॉल के लिए कोष्ठकों के उपयोग से अलग करने के लिए)।
सूचकांक प्रकार
सरणी डेटा प्रकारों को अधिकांशतः सरणी संरचनाओं के रूप में प्रयुक्त किया जाता है: पूर्णांक (या पूरी तरह से आदेशित) मानों तक सीमित सूचकांकों के साथ, सरणी निर्माण समय पर तय की गई अनुक्रमणिका श्रेणियां, और बहु-रेखीय अवयव एड्रेसिंग। अधिकांश तीसरी पीढ़ी की प्रोग्रामिंग भाषा में यही स्थिति थी| तीसरी पीढ़ी की भाषाएँ, और अभी भी अधिकांश प्रणाली प्रोग्रामिंग भाषाओं जैसे एडा (प्रोग्रामिंग भाषा), सी प्रोग्रामिंग भाषा और सी ++ का मामला है। यद्यपि, कुछ भाषाओं में, सरणी डेटा प्रकारों में साहचर्य सरणियों के शब्दार्थ होते हैं, जिनमें मनमाना प्रकार और गतिशील अवयव निर्माण के सूचकांक होते हैं। यह कुछ स्क्रिप्टिंग भाषाओं जैसे एडब्लूके प्रोग्रामिंग लैंग्वेज और लुआ (प्रोग्रामिंग लैंग्वेज) और मानक सी ++ लाइब्रेरी द्वारा प्रदान किए गए कुछ सरणी प्रकारों में होता है।
सीमा जाँच
कुछ भाषाएं (जैसे पास्कल और मोडुला) हर अभिगम पर सीमा जाँच करती हैं, अपवाद (कंप्यूटर साइंस) उठाती हैं या किसी इंडेक्स के वैध सीमा से बाहर होने पर प्रोग्राम को रद्द कर देती हैं। गति के लिए व्यापार सुरक्षा के लिए संकलक इन चेकों को बंद करने की अनुमति दे सकते हैं। अन्य भाषाएँ (जैसे फोरट्रान और सी) प्रोग्रामर पर भरोसा करती हैं और कोई जाँच नहीं करती हैं। अच्छे संकलक सूचकांक के संभावित मूल्यों की सीमा निर्धारित करने के लिए कार्यक्रम का विश्लेषण भी कर सकते हैं, और इस विश्लेषण से सीमा-जाँच समाप्त हो सकती है।
सूचकांक उत्पत्ति
कुछ भाषाएं, जैसे सी, केवल शून्य-आधारित नंबरिंग|शून्य-आधारित सरणी प्रकार प्रदान करती हैं, जिसके लिए किसी भी इंडेक्स के लिए न्यूनतम मान्य मान 0 है। यह विकल्प सरणी कार्यान्वयन और पता गणनाओं के लिए सुविधाजनक है। सी जैसी भाषा के साथ, किसी भी सरणी के इंटीरियर के लिए सूचक को परिभाषित किया जा सकता है जो प्रतीकात्मक रूप से छद्म-सरणी के रूप में कार्य करेगा जो नकारात्मक सूचकांकों को समायोजित करता है। यह केवल इसलिए काम करता है क्योंकि सी उपयोग किए जाने पर सीमाओं के विरुद्ध सूचकांक की जांच नहीं करता है।
अन्य भाषाएँ केवल एक-आधारित सरणी प्रकार प्रदान करती हैं, जहाँ प्रत्येक अनुक्रमणिका 1 से प्रारंभिक होती है; यह मैट्रिसेस और गणितीय अनुक्रमों के लिए गणित की पारंपरिक परंपरा है। पास्कल और लुआ जैसी कुछ भाषाएं एन-आधारित सरणी प्रकारों का समर्थन करती हैं, जिनके न्यूनतम नियमी सूचकांक प्रोग्रामर द्वारा चुने जाते हैं। प्रत्येक पसंद के सापेक्ष गुण गरमागरम बहस का विषय रहे हैं। शून्य-आधारित इंडेक्सिंग ऑफ-बाय-वन एरर | ऑफ-बाय-वन या बाड़पोस्ट त्रुटि से बच सकती है,[7] विशेष रूप से 0-आधारित for (i = 0; i < 5; i += 1)
पुनरावृत्त (5-0) बार, जबकि समतुल्य 1-आधारित अर्ध-खुली सीमा में for (i = 1; i < 6; i += 1)
6 अपने आप में संभावित ऐसी त्रुटि है, जिसकी सामान्यतः आवश्यकता होती है length() + 1
, और 1-आधारित समावेशी श्रेणी for (i = 1; i <= 5; i+= 1)
पुनरावृत्त (5-1) +1 बार।
उच्चतम सूचकांक
एक सरणी घोषणा में दिखाई देने वाली संख्याओं और उस सरणी के अंतिम अवयव की अनुक्रमणिका के बीच का संबंध भी भाषा के अनुसार भिन्न होता है। कई भाषाओं में (जैसे सी), किसी को सरणी में निहित अवयव की संख्या निर्दिष्ट करनी चाहिए; जबकि अन्य में (जैसे पास्कल और विज़ुअल बेसिक .नेट) अंतिम अवयव के सूचकांक के संख्यात्मक मान को निर्दिष्ट करना चाहिए। कहने की आवश्यकता नहीं है, यह भेद उन भाषाओं में महत्वहीन है जहां सूचकांक 1 से प्रारंभिक होते हैं, जैसे लुआ (प्रोग्रामिंग भाषा)।
सरणी बीजगणित
कुछ प्रोग्रामिंग लैंग्वेज सरणी प्रोग्रामिंग को सपोर्ट करती हैं, जहां कुछ डेटा टाइप्स के लिए परिभाषित ऑपरेशंस और फंक्शन्स को उन टाइप्स के एलिमेंट्स के सरणी तक बढ़ाया जाता है। इस प्रकार दो सरणियों A और B के संबंधित अवयव को जोड़ने के लिए A+B लिख सकते हैं। सामान्यतः ये भाषाएँ हैडमार्ड उत्पाद (मैट्रिसेस) | अवयव-दर-अवयव गुणन और रैखिक बीजगणित के मानक डॉट उत्पाद दोनों प्रदान करती हैं, और इनमें से कौन सा है * ऑपरेटर द्वारा प्रस्तुत भाषा के अनुसार भिन्न होता है।
एपीएल प्रोग्रामिंग भाषा के इस क्षेत्र में नवाचारों के बाद से सरणी प्रोग्रामिंग क्षमताओं को प्रदान करने वाली भाषाओं का प्रसार हुआ है। ये डोमेन-विशिष्ट भाषाओं की मुख्य क्षमताएँ हैं जैसे गॉस (प्रोग्रामिंग लैंग्वेज), इंटरएक्टिव डेटा भाषा, मैटलैब और मेथेमेटिका वे जूलिया (प्रोग्रामिंग भाषा) और फोरट्रान के हाल के संस्करणों जैसी नई भाषाओं में मुख्य सुविधा हैं। ये क्षमताएं अन्य सामान्य प्रयोजन प्रोग्रामिंग भाषाओं के लिए मानक विस्तार पुस्तकालयों के माध्यम से भी प्रदान की जाती हैं (जैसे कि पायथन (प्रोग्रामिंग भाषा) के लिए व्यापक रूप से उपयोग की जाने वाली न्यूमपी लाइब्रेरी)।
स्ट्रिंग प्रकार और सरणियाँ
कई भाषाएं उस प्रकार के मूल्यों को बनाने के लिए विशेष अंकन (स्ट्रिंग शाब्दिक) के साथ अंतर्निहित शाब्दिक स्ट्रिंगकंप्यूटर विज्ञान) डेटा प्रकार प्रदान करती हैं। कुछ भाषाओं में (जैसे सी), स्ट्रिंग केवल वर्णों की सरणी है, या उसी तरह से नियंत्रित की जाती है। अन्य भाषाएँ, जैसे पास्कल प्रोग्रामिंग भाषा, स्ट्रिंग्स और सरणियों के लिए बहुत भिन्न संचालन प्रदान कर सकती हैं।
सरणी अनुक्रमणिका श्रेणी प्रश्न
कुछ प्रोग्रामिंग लैंग्वेज ऐसे ऑपरेशन प्रदान करती हैं जो सदिश के आकार (अवयव की संख्या) को लौटाते हैं, या अधिक सामान्यतः, सरणी के प्रत्येक सूचकांक की सीमा। सी (प्रोग्रामिंग लैंग्वेज) और सी ++ सरणियाँ आकार फ़ंक्शन का समर्थन नहीं करती हैं, इसलिए प्रोग्रामर को अधिकांशतः आकार को धारण करने के लिए अलग वेरिएबल्स घोषित करना पड़ता है, और इसे एक अलग पैरामीटर के रूप में प्रक्रियाओं में पास करना पड़ता है।
नव निर्मित सरणी के अवयव में अपरिभाषित मान हो सकते हैं (जैसा कि सी में), या विशिष्ट डिफ़ॉल्ट मान जैसे 0 या शून्य सूचक (जावा में) के रूप में परिभाषित किया जा सकता है।
सी ++ में एसटीडी :: वेक्टर ऑब्जेक्ट स्टोर का समर्थन करता है, ऊपर चर्चा की गई प्रदर्शन विशेषताओं के साथ संचालन का चयन करता है और जोड़ता है। वैक्टर को उनके आकार के लिए पूछा जा सकता है और उनका आकार बदला जा सकता है। बीच में अवयव डालने जैसे धीमे संचालन भी समर्थित हैं।
स्लाइसिंग
एक सरणी भाग करना ऑपरेशन सरणी-टाइप की गई इकाई (मान या वेरिएबल्स) के अवयव का उपसमुच्चय लेता है और फिर उन्हें अन्य सरणी-टाइप की गई इकाई के रूप में इकट्ठा करता है, संभवतः अन्य सूचकांकों के साथ। यदि सरणी प्रकारों को सरणी संरचनाओं के रूप में कार्यान्वित किया जाता है, तो संरचना के डोप वेक्टर में हेरफेर करके कई उपयोगी स्लाइसिंग ऑपरेशंस (जैसे कि उप-सरणी का चयन करना, सूचकांकों की अदला-बदली करना या सूचकांकों की दिशा को उलटना) बहुत कुशलता से किया जा सकता है। संभावित स्लाइसिंग कार्यान्वयन विवरण पर निर्भर करती है: उदाहरण के लिए, फोरट्रान मैट्रिक्स वेरिएबल्स के एक कॉलम को स्लाइस करने की अनुमति देता है, किन्तु एक पंक्ति नहीं, और इसे वेक्टर के रूप में मानता है; जबकि सी मैट्रिक्स से पंक्ति को भाग करने की अनुमति देता है, किन्तु एक स्तंभ नहीं है।
दूसरी तरफ, अन्य स्लाइसिंग ऑपरेशंस संभव होते हैं जब सरणी प्रकार अन्य तरीकों से प्रयुक्त होते हैं।
आकार बदलना
कुछ भाषाएँ डायनेमिक सरणियों की अनुमति देती हैं (जिन्हें आकार बदलने योग्य, बढ़ने योग्य या एक्स्टेंसिबल भी कहा जाता है): सरणी वेरिएबल्स जिनकी इंडेक्स रेंज को इसके वर्तमान अवयव के मूल्यों को बदले बिना, निर्माण के बाद किसी भी समय विस्तारित किया जा सकता है।
एक आयामी सरणियों के लिए, यह सुविधा ऑपरेशन के रूप में प्रदान की जा सकती हैappend
(A,x) जो सरणी A के आकार को एक से बढ़ाता है और फिर अंतिम अवयव का मान एक्स पर समुच्चय करता है। अन्य सरणी प्रकार (जैसे पास्कल स्ट्रिंग्स) संयोजन संचालिका प्रदान करते हैं, जिसका उपयोग स्लाइसिंग के साथ मिलकर उस प्रभाव को प्राप्त करने के लिए किया जा सकता है। कुछ भाषाओं में, किसी सरणी के किसी अवयव को मान निर्दिष्ट करने से उस अवयव को सम्मिलित करने के लिए, यदि आवश्यक हो, तो स्वचालित रूप से सरणी का विस्तार हो जाता है। अन्य सरणी प्रकारों में, एक स्लाइस को अलग-अलग आकार की एक सरणी द्वारा प्रतिस्थापित किया जा सकता है, जिसके बाद के अवयव को तदनुसार फिर से क्रमांकित किया जा सकता है - जैसा कि पायथन की सूची असाइनमेंट में A[5:5] = [10,20,30] है, जो तीन नए अवयव को सम्मिलित करता है ( 10,20, और 30) अवयव A [5] से पहले। आकार बदलने योग्य सरणियाँ वैचारिक रूप से सूची (कंप्यूटर विज्ञान) के समान हैं, और दो अवधारणाएँ कुछ भाषाओं में समानार्थी हैं।
एक एक्स्टेंसिबल सरणी को निश्चित आकार के सरणी के रूप में प्रयुक्त किया जा सकता है, जिसमें काउंटर होता है जो रिकॉर्ड करता है कि वास्तव में कितने अवयव उपयोग में हैं। append
ऑपरेशन केवल काउंटर को बढ़ाता है; जब तक पूरे सरणी का उपयोग नहीं किया जाता है, जब append
ऑपरेशन को विफल करने के लिए परिभाषित किया जा सकता है। यह निश्चित क्षमता के साथ गतिशील सरणी का कार्यान्वयन है, जैसा कि string
पास्कल का प्रकार। वैकल्पिक रूप से, append
ऑपरेशन बड़े आकार के साथ अंतर्निहित सरणी को फिर से आवंटित कर सकता है, और पुराने अवयव को नए क्षेत्र में प्रतिलिपि कर सकता है।
यह भी देखें
- सरणी एक्सेस विश्लेषण
- सरणी डेटाबेस प्रबंधन प्रणाली
- सीमा-जांच उन्मूलन
- सीमांकक-पृथक मान
- सूचकांक जाँच
- समानांतर सरणी
- विरल सरणी
- वेरिएबल्स-लंबाई सरणी
संदर्भ
- ↑ 1.0 1.1 Robert W. Sebesta (2001) Concepts of Programming Languages. Addison-Wesley. 4th edition (1998), 5th edition (2001), ISBN 9780201385960
- ↑ "Introduction to Tensors | TensorFlow Core". TensorFlow.
- ↑ K. Jensen and Niklaus Wirth, PASCAL User Manual and Report. Springer. Paperback edition (2007) 184 pages, ISBN 978-3540069508
- ↑ John Mitchell, Concepts of Programming Languages. Cambridge University Press.
- ↑ Lukham, Suzuki (1979), "Verification of array, record, and pointer operations in Pascal". ACM Transactions on Programming Languages and Systems 1 (2), 226–244.
- ↑ Brian W. Kernighan and Dennis M. Ritchie (1988), The C programming Language. Prentice-Hall, p. 81.
- ↑ Edsger W. Dijkstra, "Why numbering should start at zero"