समानांतर सरणी

From alpha
Jump to navigation Jump to search

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

उदाहरण

समांतर सरणी का उपयोग कर सी (प्रोग्रामिंग भाषा) में एक उदाहरण:

int  ages[]   = {0,          17,        2,          52,         25};
char *names[] = {"None",     "Mike",    "Billy",    "Tom",      "Stan"};
int  parent[] = {0 /*None*/, 3 /*Tom*/, 1 /*Mike*/, 0 /*None*/, 3 /*Tom*/};

for (i = 1; i <= 4; i++) {
    printf("Name: %s, Age: %d, Parent: %s \n",
           names[i], ages[i], names[parent[i]]);
}

पर्ल में (प्रत्येक सरणी के संदर्भ रखने के लिए सरणी के हैश का उपयोग करके):

my %data = (
    first_name   => ['Joe',  'Bob',  'Frank',  'Hans'    ],
    last_name    => ['Smith','Seger','Sinatra','Schultze'],
    height_in_cm => [169,     158,    201,      199      ]);

for $i (0..$#{$data{first_name}}) {
    printf "Name: %s %s\n", $data{first_name}[$i], $data{last_name}[$i];
    printf "Height in CM: %i\n", $data{height_in_cm}[$i];
}

या, पायथन प्रोग्रामिंग भाषा में: <वाक्यविन्यास लैंग = पायथन 3> first_names = [जो, बॉब, फ्रैंक, हंस] last_names = [ स्मिथ , सेगर , सिनात्रा , शुल्त्स ] ऊंचाई_में_सेमी = [169, 158, 201, 199]

मैं सीमा में (लेन (first_names)) के लिए:

   प्रिंट (नाम:% s% s% (प्रथम_नाम [i], अंतिम_नाम [i]))
   प्रिंट (सेमी में ऊँचाई:% s% ऊँचाई_में_सेमी [i])
  1. ज़िप का उपयोग करना:

ज़िप में first_name, last_name, height_in_cm के लिए (first_names, last_names, height_in_cm):

   प्रिंट (च नाम: {first_name} {last_name} )
   प्रिंट (एफ ऊंचाई सेमी में: {ऊंचाई_में_सेमी})

</वाक्यविन्यास हाइलाइट>

पक्ष और विपक्ष

सामान्य दृष्टिकोण की तुलना में समानांतर सरणियों के कई व्यावहारिक लाभ हैं:

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

इनमें से कई लाभ विशेष रूप से विशेष प्रोग्रामिंग भाषा और उपयोग में आने वाले कार्यान्वयन पर निर्भर करते हैं।

हालाँकि, समानांतर सरणियों के कई मजबूत नुकसान भी हैं, जो यह समझाने का काम करती हैं कि उन्हें आम तौर पर क्यों पसंद नहीं किया जाता है:

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

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

एक अन्य विकल्प एकल सरणी का उपयोग करना है, जहां प्रत्येक प्रविष्टि एक रिकॉर्ड संरचना है। कई भाषाएँ वास्तविक अभिलेखों और उनकी सारणियों को घोषित करने का एक तरीका प्रदान करती हैं। अन्य भाषाओं में n*m आकार की एक सरणी घोषित करके इसे अनुकरण करना संभव हो सकता है, जहाँ m सभी फ़ील्ड्स का एक साथ आकार है, फ़ील्ड्स को प्रभावी रूप से एक रिकॉर्ड में पैक करना, भले ही विशेष भाषा के लिए प्रत्यक्ष समर्थन का अभाव हो अभिलेख। कुछ संकलक अनुकूलन, विशेष रूप से वेक्टर प्रोसेसर के लिए, इस परिवर्तन को स्वचालित रूप से करने में सक्षम होते हैं जब पी में संरचनाओं की सरणियाँ बनाई जाती हैंकार्यक्रम।[citation needed]

यह भी देखें

  • लिंक की गई सूची # नोड्स के सरणियों का उपयोग करके लिंक की गई सूचियाँ
  • स्तंभ-उन्मुख DBMS

संदर्भ

  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Introduction to Algorithms, Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7. Page 209 of section 10.3: Implementing pointers and objects.
  • Skeet, Jon (3 June 2014). "Anti-pattern: parallel collections". Retrieved 28 October 2014.