साहचर्य सरणी

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

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

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

साहचर्य सरणियों में memoization जैसे मूलभूत सॉफ्टवेयर डिजाइन पैटर्न सहित कई अनुप्रयोग हैं और डेकोरेटर पैटर्न। नाम गणित में ज्ञात साहचर्य गुण से नहीं आता है। बल्कि, यह इस तथ्य से उत्पन्न होता है कि मान कुंजियों से जुड़े होते हैं। इसे फ्लिन के टैक्सोनॉमी#संबंधी संपत्ति के साथ भ्रमित नहीं होना चाहिए।

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

आमतौर पर एक साहचर्य सरणी के लिए परिभाषित किए जाने वाले ऑपरेशन हैं:


 * डालें या डालें: एक नया जोड़ें $$(key, value)$$ कुंजी को उसके नए मान से मैप करते हुए संग्रह से जोड़े। कोई भी मौजूदा मैपिंग अधिलेखित है। इस ऑपरेशन के तर्क कुंजी और मान हैं।
 * हटाएं या हटाएं: हटाएं ए $$(key, value)$$ संग्रह से जोड़ी, किसी दिए गए कुंजी को उसके मूल्य से अनमैप करना। इस ऑपरेशन का तर्क कुंजी है।
 * लुकअप, फाइंड, या गेट: वह मान (यदि कोई हो) खोजें जो किसी दिए गए कुंजी से जुड़ा हो। इस ऑपरेशन का तर्क कुंजी है, और ऑपरेशन से मान वापस किया जाता है। यदि कोई मान नहीं मिलता है, तो कुछ लुकअप फ़ंक्शन अपवाद हैंडलिंग बढ़ाते हैं, जबकि अन्य डिफ़ॉल्ट मान (शून्य, शून्य, विशिष्ट मान निर्माता को दिए गए ...) लौटाते हैं।

इसके अलावा, साहचर्य सरणियों में अन्य ऑपरेशन भी शामिल हो सकते हैं जैसे मैपिंग की संख्या निर्धारित करना या सभी मैपिंग पर लूप करने के लिए एक इटरेटर का निर्माण करना। आमतौर पर, इस तरह के ऑपरेशन के लिए, जिस क्रम में मैपिंग लौटाई जाती है, वह कार्यान्वयन-परिभाषित हो सकता है।

एक मल्टीमैप एक एकल कुंजी के साथ कई मानों को संबद्ध करने की अनुमति देकर एक साहचर्य सरणी का सामान्यीकरण करता है। एक द्विदिश नक्शा एक संबंधित अमूर्त डेटा प्रकार है जिसमें मैपिंग दोनों दिशाओं में संचालित होती है: प्रत्येक मान को एक अद्वितीय कुंजी के साथ जोड़ा जाना चाहिए, और दूसरा लुकअप ऑपरेशन एक मान को एक तर्क के रूप में लेता है और उस मान से जुड़ी कुंजी को देखता है।

गुण
साहचर्य सरणी के संचालन को विभिन्न गुणों को पूरा करना चाहिए: कहाँ  और   चाबियाँ हैं,   एक मूल्य है,   एक सहयोगी सरणी है, और   एक नया, खाली साहचर्य सरणी बनाता है।
 * , कहाँ  एक अपवाद या डिफ़ॉल्ट मान है
 * , कहाँ  एक अपवाद या डिफ़ॉल्ट मान है

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

<वाक्यविन्यास प्रकाश लैंग = जावास्क्रिप्ट> { गर्व और पूर्वाग्रह: ऐलिस, वुथरिंग हाइट्स: ऐलिस, ग्रेट एक्सपेक्टेशंस: जॉन }

प्रमुख ग्रेट एक्सपेक्टेशंस पर एक लुकअप ऑपरेशन जॉन को लौटाएगा। यदि जॉन अपनी पुस्तक लौटाता है, तो यह हटाने की कार्रवाई का कारण बनेगा, और यदि पैट एक पुस्तक की जांच करता है, तो यह एक सम्मिलन कार्रवाई का कारण बनेगा, जिससे एक अलग स्थिति होगी:

<वाक्यविन्यास प्रकाश लैंग = जावास्क्रिप्ट> { गर्व और पूर्वाग्रह: ऐलिस, द ब्रदर्स करमाज़ोव: पैट, वुथरिंग हाइट्स: ऐलिस }

कार्यान्वयन
मैपिंग की बहुत कम संख्या वाले शब्दकोशों के लिए, संघ सूची, मैपिंग की एक लिंक्ड सूची का उपयोग करके शब्दकोश को लागू करना समझ में आ सकता है। इस कार्यान्वयन के साथ, बुनियादी शब्दकोश संचालन करने का समय मैपिंग की कुल संख्या में रैखिक है; हालाँकि, इसे लागू करना आसान है और इसके चलने के समय में स्थिर कारक छोटे हैं। एक अन्य बहुत ही सरल कार्यान्वयन तकनीक, जब कुंजियों को एक संकीर्ण सीमा तक सीमित किया जाता है, तो एक सरणी में सीधे संबोधित किया जाता है: किसी दिए गए कुंजी k के मान को सरणी सेल A [k] में संग्रहीत किया जाता है, या यदि k के लिए कोई मैपिंग नहीं है तब सेल एक विशेष प्रहरी मान संग्रहीत करता है जो मैपिंग की अनुपस्थिति को इंगित करता है। सरल होने के साथ-साथ, यह तकनीक तेज़ है: प्रत्येक शब्दकोश संक्रिया में निरंतर समय लगता है। हालाँकि, इस संरचना के लिए स्थान की आवश्यकता पूरे कीस्पेस का आकार है, जब तक कि कीस्पेस छोटा न हो, यह अव्यावहारिक है।

शब्दकोशों को लागू करने के दो प्रमुख तरीके हैश टेबल या सर्च ट्री हैं।

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

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

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

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

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

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

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

आदेशित शब्दकोशों की बाद की भावना अधिक सामान्य रूप से सामना की जाती है। उन्हें एक सामान्य शब्दकोश के शीर्ष पर एक दोगुनी लिंक की गई सूची को ओवरले करके, या वास्तविक डेटा को विरल (अक्रमित) सरणी से बाहर और एक घने सम्मिलन-आदेशित एक में ले जाकर, एक एसोसिएशन सूची का उपयोग करके कार्यान्वित किया जा सकता है।
 * छँटाई के द्वारा चाबियों के दिए गए सेट के लिए गणना का क्रम हमेशा नियतात्मक होता है। यह वृक्ष-आधारित कार्यान्वयन का मामला है, एक प्रतिनिधि सी ++ का कंटेनर।
 * गणना का क्रम कुंजी-स्वतंत्र है और इसके बजाय सम्मिलन के क्रम पर आधारित है। यह .NET फ्रेमवर्क, Java के LinkedHashMap (प्रोग्रामिंग लैंग्वेज) और Python (प्रोग्रामिंग लैंग्वेज) में ऑर्डर किए गए डिक्शनरी के मामले में है।

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

साहचर्य सरणियों के लिए अंतर्निहित सिंटैक्टिक समर्थन 1969 में SNOBOL द्वारा नाम तालिका के तहत पेश किया गया था। TMG (भाषा) ने स्ट्रिंग कुंजियों और पूर्णांक मानों के साथ तालिकाओं की पेशकश की। MUMPS ने बहु-आयामी साहचर्य सरणियाँ बनाईं, वैकल्पिक रूप से लगातार, इसकी प्रमुख डेटा संरचना। SETL ने उन्हें सेट और मैप्स के एक संभावित कार्यान्वयन के रूप में समर्थन दिया। AWK से शुरू होने वाली और Rexx, Perl, PHP, Tcl, JavaScript, Maple (सॉफ्टवेयर), Python (प्रोग्रामिंग लैंग्वेज), Ruby (प्रोग्रामिंग लैंग्वेज), Wolfram Language, Go (प्रोग्रामिंग लैंग्वेज), और Lua (प्रोग्रामिंग) सहित अधिकांश आधुनिक स्क्रिप्टिंग भाषाएँ भाषा), एक प्राथमिक कंटेनर प्रकार के रूप में साहचर्य सरणियों का समर्थन करता है। कई और भाषाओं में, वे विशेष सिंटैक्स के बिना पुस्तकालय कार्यों के रूप में उपलब्ध हैं।

स्मॉलटॉक में, Objective-C, .NET Framework|.NET, पायथन (प्रोग्रामिंग लैंग्वेज), असली बुनियादी, स्विफ्ट (प्रोग्रामिंग भाषा), एप्लिकेशन और डेल्फी के लिए विजुअल बेसिक (प्रोग्रामिंग लैंग्वेज) उन्हें शब्दकोश कहा जाता है; पर्ल, रूबी (प्रोग्रामिंग भाषा) और बीज7 में उन्हें हैश कहा जाता है; C++, Java (प्रोग्रामिंग लैंग्वेज), गो (प्रोग्रामिंग लैंग्वेज), क्लोजर, स्काला (प्रोग्रामिंग भाषा), OCaml, Haskell (प्रोग्रामिंग लैंग्वेज) में उन्हें मैप्स कहा जाता है (मैप देखें (C++), unordered_map (C++), और ); सामान्य लिस्प और विंडोज पॉवरशेल में, उन्हें हैश टेबल कहा जाता है (चूंकि दोनों आमतौर पर इस कार्यान्वयन का उपयोग करते हैं); मेपल (सॉफ्टवेयर) और लुआ में, उन्हें टेबल कहा जाता है। PHP में, सभी सरणियाँ साहचर्य हो सकती हैं, सिवाय इसके कि कुंजियाँ पूर्णांकों और स्ट्रिंग्स तक सीमित हैं। जावास्क्रिप्ट में (JSON भी देखें), सभी ऑब्जेक्ट स्ट्रिंग-वैल्यू कुंजियों के साथ साहचर्य सरणियों के रूप में व्यवहार करते हैं, जबकि मानचित्र और WeakMap प्रकार मनमाना वस्तुओं को कुंजियों के रूप में लेते हैं। लुआ में, वे सभी डेटा संरचनाओं के लिए आदिम बिल्डिंग ब्लॉक के रूप में उपयोग किए जाते हैं। विजुअल फॉक्सप्रो में, उन्हें संग्रह कहा जाता है। D (प्रोग्रामिंग लैंग्वेज) में साहचर्य सरणियों के लिए भी समर्थन है।

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

बाद c. 2010, क्लाउड कम्प्यूटिंग के लिए उपयुक्त उच्च-प्रदर्शन डेटाबेस की आवश्यकता और उनके उपयोग से कार्यक्रमों की आंतरिक संरचना से अधिक निकटता से मिलान करने से की-वैल्यू स्टोर बाजार में पुनर्जागरण हुआ। ये प्रणालियां मूल रूप से साहचर्य सरणियों को संग्रहीत और पुनः प्राप्त कर सकती हैं, जो सामान्य वेब-संबंधित वर्कफ़्लोज़ में प्रदर्शन में बहुत सुधार कर सकती हैं।

यह भी देखें

 * की-वैल्यू डेटाबेस
 * टपल
 * समारोह (गणित)
 * जेएसओएन

बाहरी संबंध

 * NIST's Dictionary of Algorithms and Data Structures: Associative Array