.NET हैशटेबल बनाम डिक्शनरी - क्या डिक्शनरी इतनी तेज हो सकती है?


276

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

लेकिन मैंने यह भी पढ़ा है कि डिक्शनरी हमेशा वस्तुओं को उस क्रम में वापस नहीं लाएगी जिस क्रम में उन्हें डाला गया है। जहां हैशटेबल के रूप में होगा। जैसा कि मैं समझता हूं कि यह कुछ स्थितियों के लिए हैशटेबल से कहीं अधिक तेज है।

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


5
मैं इसे उखाड़ना नहीं चाहता, लेकिन आपका कर्म 7,777 है और मैं वह आदमी नहीं बनना चाहता जो आपके लिए गड़बड़ करता है।
CaptainMarvel

जवाबों:


298

System.Collections.Generic.Dictionary<TKey, TValue>और System.Collections.Hashtableकक्षाएं दोनों आंतरिक रूप से एक हैश तालिका डेटा संरचना बनाए रखती हैं। उनमें से कोई भी वस्तुओं के क्रम को संरक्षित करने की गारंटी नहीं देता है।

बॉक्सिंग / अनबॉक्सिंग मुद्दों को एक तरफ छोड़ दें, तो ज्यादातर समय, उनका प्रदर्शन बहुत ही समान होना चाहिए।

उन दोनों के बीच प्राथमिक संरचनात्मक अंतर यह है कि है Dictionaryपर निर्भर करता है चेनिंग जबकि संकल्प टकराव के (प्रत्येक हैश तालिका बाल्टी के लिए मदों की एक सूची बनाए रखने) Hashtableका उपयोग करता है rehashing टक्कर समाधान के लिए (जब एक टक्कर होती है, एक बाल्टी के लिए महत्वपूर्ण मैप करने के लिए एक और हैश समारोह की कोशिश करता है) ।

Hashtableयदि आप .NET फ्रेमवर्क 2.0+ के लिए लक्ष्य बना रहे हैं तो कक्षा का उपयोग करने के लिए बहुत कम लाभ है । यह प्रभावी रूप से अप्रचलित है Dictionary<TKey, TValue>


21
@ Jon- श्रृंखलन और rehashing यहाँ गहराई में चर्चा की है msdn.microsoft.com/en-us/library/ms379571(VS.80).aspx
RichardOD

तुम दोनों को धन्यवाद। जैसा कि रिचर्ड ने पोस्ट किया था, उस पृष्ठ को पाया ... चैनिंग के बारे में पूछने जा रहा था लेकिन MSDN साइट वास्तव में मददगार है!
जॉन

6
@ मेहरदाद - मेरे बारे में यह स्पष्ट नहीं है कि टकराव कैसे हल किए जाते हैं: यदि एक ही हैश में कई कुंजियाँ हो सकती हैं, तो आप यह कैसे सुनिश्चित करते हैं कि आपको लुकअप पर सही मूल्य मिल रहा है, अर्थात फ़ंक्शन किस तत्व को जानता है वापसी? में msdn.microsoft.com/en-us/library/ms379571%28VS.80%29.aspx यह एक टकराव की स्थिति में reprobing से कहते हैं, "दरअसल, के रूप में, शब्दकोश बस चेन किसी भी टकराव से Hashtable वर्ग के साथ किया जाता बाल्टी की सूची में। " क्या इसका मतलब यह है कि शब्दकोश का उपयोग करते समय, टकराव कुछ ऐसा नहीं है जो डेवलपर को चिंतित होना चाहिए?
होवीकैंप

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

@ मेहरदाद स्पष्ट होने के लिए, हैशटेबल और डिक्शनरी ऑब्जेक्ट दोनों ही कुंजी को स्टोर करते हैं, और दोनों डेवलपर से टकराव भी छिपाते हैं?
होवीसेम्प

111

मुझे लगता है कि इसका अब आपके लिए कोई मतलब नहीं है। लेकिन सिर्फ लोगों द्वारा रोक के लिए संदर्भ के लिए

प्रदर्शन टेस्ट - सॉर्टेडलिस्ट बनाम सॉर्टेड वर्क बनाम डिक्शनरी बनाम हैशटेबल

स्मृति आवंटन:

मेमोरी उपयोग प्रदर्शन परीक्षण

डालने के लिए समय का उपयोग:

डालने के लिए समय का उपयोग किया जाता है

किसी आइटम को खोजने का समय:

किसी वस्तु को खोजने का समय


बहुत दिलचस्प है कि क्रमबद्ध सूची में हैशटेबल की तुलना में फिस्टर लुकअप है। मुझे लगा कि हैशटेबल O (1) बनाम सॉर्ट की गई सूची O (logn) है। जाहिरा तौर पर हैशटेबल बेकार है। मैं इसका इस्तेमाल कभी नहीं करूँगा।
जॉन हेन्केल

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

31

हैशटेबल और डिक्शनरी के बीच अंतर

शब्दकोश:

  • यदि हम एक कुंजी खोजने की कोशिश करते हैं जो मौजूद नहीं है, तो शब्दकोश त्रुटि देता है।
  • बॉक्सिंग और बॉक्सिंग नहीं होने के कारण एक हैशटेबल से अधिक तेजी से शब्दकोश।
  • शब्दकोश एक सामान्य प्रकार है जिसका अर्थ है कि हम इसे किसी भी डेटा प्रकार के साथ उपयोग कर सकते हैं।

हैश टेबल:

  • यदि हम एक कुंजी खोजने की कोशिश करते हैं जो मौजूद नहीं है, तो हैशटेबल अशक्त हो जाता है।
  • शब्दकोश से हैशटेबल धीमा है क्योंकि इसमें बॉक्सिंग और अनबॉक्सिंग की आवश्यकता होती है।
  • हैशटेबल एक सामान्य प्रकार नहीं है,

24

एक और महत्वपूर्ण अंतर यह है कि हैशटेबल टाइप लॉक-फ्री मल्टीपल रीडर्स और एक ही समय में एक ही लेखक को सपोर्ट करता है, जबकि डिक्शनरी ऐसा नहीं करता है।


8
समवर्ती शब्दकोश (.Net 4.0) का समर्थन करेगा
तमिलमारन

1
मुझे यकीन नहीं है अगर मैं इस जवाब को समझूंगा। यहाँ देख रहे हैं कि msdn.microsoft.com/en-us/library/… यह कहता है कि "कई लेखकों का समर्थन करने के लिए हैशटेबल पर सभी कार्यों को सिंक्रोनाइज़्ड विधि द्वारा लौटाए गए रैपर के माध्यम से किया जाना चाहिए, बशर्ते कि हेटटेबल ऑब्जेक्ट को पढ़ने वाले थ्रेड न हों। " ऐसा लगता है कि "लॉक-फ्री मल्टीपल रीडर्स" फीचर को बहुत बेकार बना दिया गया है, इसलिए हम शब्दकोश के समान ही हैशटेबल तक सभी पहुंच को लॉक कर सकते हैं।
रेन्नीपेट

16

MSDN आलेख: " Dictionary<TKey, TValue>वर्ग की कक्षा के समान कार्यक्षमता होती है HashtableDictionary<TKey, TValue> एक विशिष्ट प्रकार (अन्य के अलावा Object) में Hashtableमूल्य प्रकारों की तुलना में बेहतर प्रदर्शन होता है क्योंकि तत्व प्रकार के Hashtableहोते हैं Objectऔर इसलिए, बॉक्सिंग और अनबॉक्सिंग आमतौर पर होते हैं यदि भंडारण या मान प्रकार प्राप्त करना "।

लिंक: http://msdn.microsoft.com/en-us/library/4yh14awz(v=vs.90s.govx


11

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


8

एक अन्य महत्वपूर्ण अंतर यह है कि Hashtableधागा सुरक्षित है। Hashtableकई पाठक / एकल लेखक (एमआर / एसडब्ल्यू) थ्रेड सेफ्टी में बनाया गया है, जिसका अर्थ Hashtableहै बिना लॉक किए बिना एक से अधिक पाठकों के साथ एक लेखक। के मामले में Dictionaryवहाँ है, कोई धागा सुरक्षा है अगर आप की जरूरत सुरक्षा थ्रेड आप अपने खुद के तुल्यकालन को लागू करना चाहिए।

आगे विस्तृत करने के लिए:

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

.NET फ्रेमवर्क 2.0 संग्रह वर्गों की तरह List<T>, Dictionary<TKey, TValue>, आदि किसी भी धागा तुल्यकालन प्रदान नहीं करते हैं; जब आइटम जोड़े जाते हैं या समवर्ती रूप से कई थ्रेड्स पर निकाले जाते हैं, तो उपयोगकर्ता कोड को सभी सिंक्रनाइज़ेशन प्रदान करना होगा। यदि आपको टाइप सुरक्षा के साथ-साथ सुरक्षा की आवश्यकता है, तो .NET फ्रेमवर्क में समवर्ती संग्रह कक्षाओं का उपयोग करें। आगे यहां पढ़ रहे हैं।


3

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


1

यदि आप पढ़ने के बारे में परवाह करते हैं जो हमेशा एक शब्दकोश में डाली गई वस्तुओं को वापस कर देंगे, तो आप पर एक नज़र डाल सकते हैं

OrderedDictionary - मूल्यों (जिस क्रम में आइटम जोड़ा गया था द्वारा) एक पूर्णांक सूचकांक के माध्यम से पहुँचा जा सकता है SortedDictionary - आइटम स्वचालित रूप से हल कर रहे हैं


0

शब्दकोश हैशटेबल से अधिक तेज़ है क्योंकि शब्दकोश एक सामान्य मजबूत प्रकार है। हैशटेबल धीमा है क्योंकि यह ऑब्जेक्ट को डेटा प्रकार के रूप में लेता है जो बॉक्सिंग और अनबॉक्सिंग की ओर जाता है।


2
चरण 9studios.com/post/2008/01/08/DictionaryVSHashTable.aspx plz लेख के नीचे की टिप्पणियों को पढ़ें
अरवंड

4
@ अरविंद लिंक टूटा - बिक्री के लिए डोमेन।
रेनीपेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.