शब्दकोश बनाम सूची


30

इसलिए मैं Dictionary<int, int>आज काम पर भाग गया । यह सिर्फ मुझे अजीब लग रहा था क्योंकि मैं शायद सिर्फ एक List<int>बजाय इस्तेमाल किया होता । क्या कोई अंतर है और क्या कोई उपयोग मामला होगा जहां एक संरचना दूसरे पर पसंद की जाएगी?


1
क्या दो या दो (या अधिक) के बीच संबंध दिया जाना चाहिए? फिर नक्शा (इस भाषा में शब्दकोश) समझ में आता है।
रिग

3
नाम शब्दकोश यह मेरे लिए स्पष्ट करता है। जब आपको कुछ त्वरित देखने की आवश्यकता होती है तो आप एक शब्दकोश का उपयोग करते हैं।
ChaosPandion

2
@ChaosPandion: List<T>.NET ढाँचे के भीतर एक यादृच्छिक अभिगम सरणी है, जहाँ लुकअप ऑपरेशन आमतौर पर a की तुलना में तेज़ होता है Dictionary<int,T>
डॉक ब्राउन

2
@DocBrown - केवल संख्यात्मक सूचकांक कुंजी के रूप में उपयोग करने के अजीब मामले में। अन्य बुद्धिमान एक नज़र का उपयोग करते समय तेजी से होने वाला है Dictionary<TKey, TValue>
चोसपंडियन

2
@ ये सवाल उस अजीब मामले के बारे में है।
MarkJ

जवाबों:


32

Dictionary<int, int>यदि आपकी अनुक्रमणिका में विशेष स्थिति के अलावा सिर्फ एक विशेष अर्थ है तो आप इसका उपयोग करेंगे ।

तत्काल उदाहरण जो दिमाग में आता है वह एक डेटाबेस में एक आईडी कॉलम और एक इंट कॉलम को स्टोर कर रहा है। उदाहरण के लिए, यदि आपके पास एक [person-id]कॉलम और एक [personal-pin]कॉलम है, तो आप उन लोगों को एक में ला सकते हैं Dictionary<int, int>। यह तरीका pinDict[person-id]आपको एक पिन देता है, लेकिन सूचकांक सार्थक है और न कि केवल एक स्थिति में List<int>

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


यदि मेरी व्यक्ति-आईडी 0, ..., 999 की सीमा से है, और मुझे सभी 1000 व्यक्तियों के लिए व्यक्तिगत-पिन मानों को मेमोरी में लोड करना होगा, तो मैं आमतौर पर List<int>एक शब्दकोश चुनूंगा, और शब्दकोश नहीं। मेरा जवाब नीचे देखें।
Doc Brown

3
हाँ, लेकिन एक शब्द विरल हो सकता है
jk।

@ जक: यह वही है जो मैंने अपने उत्तर में विस्तृत करने की कोशिश की थी।
डॉक ब्राउन

7
व्यक्तिगत पिन? लगता है बेमानी।
जैक

एचएम, जब सूचकांक का "एक विशेष अर्थ" होता है, वास्तविक विश्व-परिदृश्यों में यह संभावना हो सकती है कि वे एक सन्निहित सीमा नहीं बनाते हैं [0, ..., n] (हालांकि यह अनिवार्य नहीं है), इसलिए यह उत्तर है सादा गलत नहीं है, लेकिन अभेद्य। फिर भी IMHO का निर्णय इस "विशेष अर्थ की चीज" पर आधारित नहीं होना चाहिए, लेकिन केवल "चाबियाँ लगभग एक अंतराल का निर्माण करती हैं [0, ..., n]"। अपवोट की संख्या के आधार पर मुझे लगता है कि अधिकांश पाठकों ने उस बिंदु को याद किया।
डॉक्टर ब्राउन

28

Listएक सरणी के Dictionaryरूप में और एक के रूप में सोचो हैश तालिका । आप केवल तभी उपयोग करेंगे Dictionaryजब आपको मूल्यों के लिए (या सहयोगी) सार्थक कुंजियों को मैप करने की आवश्यकता होगी, जबकि मूल्यों के लिए Listकेवल नक्शे (या सहयोगी) स्थिति (या सूचकांक)।

उदाहरण के लिए, मान लें कि आप किसी व्यक्ति की आयु और उनकी ऊंचाई के बीच एक संगृहीत करना चाहते हैं। आप Dictionary<int, int>व्यक्ति की आयु (a int) को उनकी ऊँचाई (a) का नक्शा बनाने के लिए उपयोग कर सकते हैंint :

Dictionary<int, int> personHeightMap = new Dictionary<int, int>();

personHeightMap.Add(21, 185);
personHeightMap.Add(31, 174);

int height = personHeightMap.ContainsKey(21) ? personHeightMap[21] : -1;

बहुत उपयोगी उदाहरण नहीं है, लेकिन मुद्दा यह है कि आप ऐसा करने में सक्षम नहीं होंगे Listक्योंकि इसे इन मूल्यों को औपचारिक रूप से संग्रहीत करने की आवश्यकता होगी।


7
+1 उल्लेख करने के लिए कि ऑर्डर केList साथ एक सौदा , जहां एसोसिएशन के साथ एक सौदा है । यदि आपको हर बार एक निश्चित क्रम में अपना डेटा प्राप्त करने की आवश्यकता है, या एक दूसरे के संबंध में उनका आदेश महत्वपूर्ण है, तो जाने का एक तरीका है। अनियंत्रित हो जाते हैं, और मानचित्रण कुंजी -> मूल्य संबंधों से निपटते हैं। DictionaryListDictionaries
KChaloux

2
अंतिम नहीं कम से कम, जब आप जानते हैं कि आप क्या देख रहे हैं, हैश तालिका O (1) समय के आसपास है, जबकि सरणी सबसे अच्छा मामले में O (logN) है (सॉर्ट किया गया और w / o डुप्लिकेट) और O (N) इन सबसे ख़राब मामला।
JensG

1
+1। ऐसा नहीं लगता कि किसी ने इस बात को संबोधित किया हो कि सूचियों का क्रमबद्ध रूप से आदेश दिया गया है और dicts शब्दशः लुकअप हैं, जो कि मेरी राय में, बिल्कुल मौलिक है
बेंजामिन हॉजसन

15

शब्दार्थ, a Dictionary<int, T>और List<T>बहुत समान हैं, दोनों .NET फ्रेमवर्क के यादृच्छिक अभिगम कंटेनर हैं। किसी शब्दकोश के प्रतिस्थापन के रूप में एक सूची का उपयोग करने के लिए, आपको अपनी सूची में खाली स्लॉट का प्रतिनिधित्व करने के लिए अपने प्रकार T(जैसे null) में एक विशेष मूल्य की आवश्यकता होती है । यदि Tएक अशक्त प्रकार नहीं है int, तो आप int?इसके बजाय उपयोग कर सकते हैं , या यदि आप केवल सकारात्मक मूल्यों को संग्रहीत करने की उम्मीद कर रहे हैं, तो आप खाली स्लॉट का प्रतिनिधित्व करने के लिए -1 जैसे विशेष मूल्य का भी उपयोग कर सकते हैं।

आपको जो चुनना होगा, वह प्रमुख मूल्यों की सीमा पर निर्भर होना चाहिए। यदि आपकी कुंजियाँ Dictionary<int, T>पूर्णांक अंतराल के भीतर हैं, तो उन दोनों के बीच कई अंतरालों के बिना (उदाहरण के लिए, [0, ... 100] में से 80 मान), तो एक List<T>और अधिक उपयुक्त होगा, क्योंकि अनुक्रमणिका तक पहुँच तेज़ है, और इस मामले में एक शब्दकोश की तुलना में स्मृति और समय बहुत कम है।

यदि आपके प्रमुख मूल्य int[0, ..., 1000000] जैसी सीमा से 100 मान हैं , तो List<T>T के 1000000 मान रखने के लिए मेमोरी की आवश्यकता है, जहाँ आपके शब्दकोश को T के 100 मानों के चारों ओर परिमाण के क्रम में मेमोरी की आवश्यकता होगी। Int के 100 मान (साथ ही कुछ ओवरहेड, वास्तव में उन 100 कुंजी और मूल्यों को संग्रहीत करने के लिए 2 गुना मेमोरी की उम्मीद करते हैं)। तो बाद के मामले में एक शब्दकोश अधिक उपयुक्त होगा।


6
यह महत्वपूर्ण अंतर imho है, शब्दकोश <int, int> विरल हो सकता है
jk।

उस स्थिति में, क्या हम सूची <KeyValuePair <int, int >> का उपयोग नहीं कर सकते हैं? लीनियर ट्रैवर्सल के लिए कौन सा बेहतर होगा?
दीपक मिश्रा

@DeepakMishra: यहाँ मुख्य अंतर है, List<KeyValuePair<int,T>>कोई O (1) लुकअप ऑपरेशन उपलब्ध नहीं है। दूसरा, तत्वों में List<KeyValuePair<int,T>>एक विशिष्ट क्रम हो सकता है, जो उनके प्रमुख मूल्यों से स्वतंत्र है। यदि आपको बाद की जरूरत है, लेकिन पूर्व की नहीं, List<KeyValuePair<int,T>>या List<Tuple<int,T>>बेहतर विकल्प हो सकता है। अगर आप दोनों की जरूरत है, वहाँ भी है OrderedDictionary
डॉक ब्राउन

@DocBrown लीनियर ट्रैवर्सल (यानी फोरचेक) और इंसर्ट ऑपरेशन के लिए कौन सा बेहतर होगा, डायरेक्ट लुक की कोई जरूरत नहीं है?
दीपक मिश्रा

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

6

कोई उन्हें कैसे समकक्ष मान सकता है?

शब्दकोश विरल है और यादृच्छिक सम्मिलन की अनुमति देता है, लेकिन इन-ऑर्डर ट्रैवर्सल को एक समस्या बनाता है, सूची विरल नहीं है और ऑर्डर प्रविष्टि में से एक महंगा है, यह स्वाभाविक रूप से इन-ऑर्डर ट्रैवर्सल प्रदान करता है।

ऐसी बहुत कम स्थितियाँ होंगी जहाँ कोई नाटकीय रूप से दूसरे से श्रेष्ठ न हो।


2

एक तरफ: अन्य प्रोग्रामिंग भाषाओं में एक शब्दकोश के बजाय एक मैप के रूप में इस प्रकार की डेटा संरचना का उल्लेख है।

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

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

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


1

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

इसके बारे में .... उदाहरण के साथ शब्दकोश बनाम सूची


-1

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


-3

ये महान उत्तर हैं जो आधारों को ढंकते हैं।

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


8
मैं असहमत हूं। शब्दकोश / मानचित्र एक मौलिक डेटा संरचना है, जिसे प्रत्येक सॉफ्टवेयर इंजीनियर को आंतरिक रूप से परिचित होना चाहिए। किसी भी तरह से: आपको किसी भी डेटा संरचना का उपयोग करने के लिए एक उचित कारण की आवश्यकता होगी; सूची सहित।
स्टीवन एवर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.