c# hindi - हैशटेबल पर शब्दकोश क्यों पसंद किया जाता है?




of tag (16)

अधिकांश प्रोग्रामिंग भाषाओं में, हैशटेबल्स पर शब्दकोशों को प्राथमिकता दी जाती है। इसके पीछे क्या कारण हैं?


Answers

एफवाईआई: .NET में, Hashtable एकाधिक पाठक धागे और एकल लेखन धागे द्वारा उपयोग के लिए थ्रेड सुरक्षित है, जबकि Dictionary सार्वजनिक स्थिर सदस्य थ्रेड सुरक्षित हैं, लेकिन किसी भी इंस्टेंस सदस्यों को थ्रेड सुरक्षित होने की गारंटी नहीं है।

इस वजह से हमें अपने सभी Hashtable को वापस Hashtable बदलना पड़ा।


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

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

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

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

List<T>, Dictionary<TKey, TValue> इत्यादि जैसे .NET Framework 2.0 संग्रह वर्ग कोई थ्रेड सिंक्रनाइज़ेशन प्रदान नहीं करते हैं; उपयोगकर्ता कोड को सभी सिंक्रनाइज़ेशन प्रदान करना चाहिए जब आइटम को कई धागे पर एक साथ जोड़ा या हटा दिया जाता है

यदि आपको सुरक्षा की सुरक्षा के साथ-साथ थ्रेड सुरक्षा की आवश्यकता है, तो .NET Framework में समवर्ती संग्रह कक्षाओं का उपयोग करें। आगे पढ़ने के लिए।

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


हैश टेबल:

ढेर में भंडारण करते समय कुंजी / मान ऑब्जेक्ट (मुक्केबाजी) प्रकार में परिवर्तित हो जाएगा।

ढेर से पढ़ने के दौरान कुंजी / मान वांछित प्रकार में परिवर्तित करने की आवश्यकता है।

ये ऑपरेशन बहुत महंगा हैं। हमें जितना संभव हो मुक्केबाजी / अनबॉक्सिंग से बचने की जरूरत है।

शब्दकोश: हैशटेबल का जेनेरिक संस्करण।

कोई मुक्केबाजी / अनबॉक्सिंग नहीं। कोई रूपांतरण आवश्यक नहीं है।


एमएसडीएन पर सी # आलेख का उपयोग करके डेटा संरचनाओं की व्यापक परीक्षा में कहा गया है कि टकराव समाधान रणनीति में भी अंतर है:

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

रीहैशिंग निम्नानुसार काम करता है: हैश के विभिन्न कार्यों का एक सेट है, एच 1 ... एच एन , और हैश टेबल से किसी आइटम को डालने या पुनर्प्राप्त करते समय, प्रारंभ में एच 1 हैश फ़ंक्शन का उपयोग किया जाता है। यदि यह टकराव की ओर जाता है, तो इसके बजाय एच 2 की कोशिश की जाती है, और यदि आवश्यक हो तो एच के लिए आगे बढ़ता है।

शब्दकोश एक तकनीक का उपयोग करता है जिसे चेनिंग कहा जाता है।

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


चूंकि .NET Framework 3.5 में HashSet<T> जो Dictionary<TKey, TValue> सभी पेशेवरों को प्रदान करता है Dictionary<TKey, TValue> यदि आपको केवल चाबियाँ और कोई मान नहीं चाहिए।

तो यदि आप एक Dictionary<MyType, object> और हमेशा सुरक्षित हैश तालिका को अनुकरण करने के लिए मान को null पर सेट करते हैं तो आपको शायद HashSet<T> पर स्विच करने पर विचार करना चाहिए।


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

डिक्शनरी क्लास में हैशटेबल क्लास के समान कार्यक्षमता है। एक विशिष्ट प्रकार (ऑब्जेक्ट के अलावा) के एक डिक्शनरी के लिए हैशटेबल की तुलना में बेहतर प्रदर्शन होता है क्योंकि हैशटेबल के तत्व ऑब्जेक्ट प्रकार के होते हैं और इसलिए, बॉक्सिंग और अनबॉक्सिंग आमतौर पर एक मान प्रकार को संग्रहीत या पुनर्प्राप्त करते समय होती है।

आगे पढ़ने के लिए: हैशटेबल और शब्दकोश संग्रह प्रकार


.NET परावर्तक का उपयोग करके मैं जो देखता हूं उसके अनुसार:

[Serializable, ComVisible(true)]
public abstract class DictionaryBase : IDictionary, ICollection, IEnumerable
{
    // Fields
    private Hashtable hashtable;

    // Methods
    protected DictionaryBase();
    public void Clear();
.
.
.
}
Take note of these lines
// Fields
private Hashtable hashtable;

तो हम यह सुनिश्चित कर सकते हैं कि DictionaryBase आंतरिक रूप से हैशटेबल का उपयोग करता है।


लोग कह रहे हैं कि एक शब्दकोश हैश टेबल जैसा ही है।

आवश्यक रूप से यह सही नहीं है। एक हैश टेबल एक शब्दकोश का कार्यान्वयन है। उस पर एक विशिष्ट, और यह .NET में डिफ़ॉल्ट हो सकता है, लेकिन यह परिभाषा केवल एक ही नहीं है।

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


Dictionary <<< >>> Hashtable मतभेद:

  • जेनेरिक <<< >>> गैर-जेनेरिक
  • अपने धागे सिंक्रनाइज़ेशन की आवश्यकता है <<< >>> Synchronized() विधि के माध्यम से थ्रेड सुरक्षित संस्करण प्रदान करता है
  • गणना की गई वस्तु: KeyValuePair <<< >>> अनुमानित आइटम: DictionaryEntry
  • नया (> .NET 2.0 ) <<< >>> पुराना ( .NET 1.0 के बाद से)
  • सिस्टम में है। चयन। जेनेरिक <<< >>> सिस्टम में है। चयन
  • गैर-मौजूदा कुंजी का अनुरोध अपवाद फेंकता है <<< >>> गैर-मौजूदा कुंजी रिटर्न के लिए अनुरोध शून्य
  • मूल्य प्रकारों के लिए संभावित रूप से थोड़ा तेज़ <<< >>> थोड़ा धीमा (मुक्केबाजी / अनबॉक्सिंग की आवश्यकता है) मूल्य प्रकारों के लिए

Dictionary / Hashtable समानताएं:

  • दोनों आंतरिक रूप से हैशटेबल्स == कुंजी के अनुसार कई आइटम डेटा तक तेजी से पहुंच हैं
  • दोनों को अपरिवर्तनीय और अद्वितीय कुंजी की आवश्यकता है
  • दोनों की कुंजी को GetHashCode() विधि की आवश्यकता है

इसी तरह के .NET संग्रह (शब्दकोश और हशटेबल के बजाय उपयोग करने वाले उम्मीदवार):

  • ConcurrentDictionary - थ्रेड सुरक्षित (समेकित रूप से कई धागे से सुरक्षित रूप से पहुंचा जा सकता है)
  • HybridDictionary - अनुकूलित प्रदर्शन (कुछ वस्तुओं के लिए और कई वस्तुओं के लिए भी)
  • OrderedDictionary - मूल्यों को इंट इंडेक्स के माध्यम से एक्सेस किया जा सकता है (जिस क्रम में आइटम जोड़े गए थे)
  • SortedDictionary - आइटम स्वचालित रूप से क्रमबद्ध
  • स्ट्रिंग StringDictionary - दृढ़ता से टाइप और स्ट्रिंग के लिए अनुकूलित

Dictionary<> एक सामान्य प्रकार है और इसलिए यह सुरक्षित है।

आप हैशटेबल में कोई भी वैल्यू टाइप डाल सकते हैं और यह कभी-कभी अपवाद फेंक सकता है। लेकिन Dictionary<int> केवल पूर्णांक मान स्वीकार करेगा और इसी प्रकार Dictionary<string> केवल स्ट्रिंग स्वीकार करेगा।

तो, HashTable बजाय Dictionary<> का उपयोग करना बेहतर है।


शब्दकोश:

  • अगर हम ऐसी कुंजी ढूंढने का प्रयास करते हैं जो अस्तित्व में नहीं है तो यह अपवाद को वापस / फेंकता है।

  • यह हैशटेबल से तेज़ है क्योंकि कोई मुक्केबाजी और अनबॉक्सिंग नहीं है।

  • केवल सार्वजनिक स्थिर सदस्य धागे सुरक्षित हैं।

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

    उदाहरण: Dictionary<string, string> <NameOfDictionaryVar> = new Dictionary<string, string>();

  • डिक्शनरी हैशटेबल, Keys और Values का एक प्रकार-सुरक्षित कार्यान्वयन दृढ़ता से टाइप किया गया है।

हैश टेबल:

  • अगर हम एक कुंजी खोजने की कोशिश करते हैं जो अस्तित्व में नहीं है तो यह शून्य हो जाता है।

  • यह शब्दकोश से धीमा है क्योंकि इसे मुक्केबाजी और अनबॉक्सिंग की आवश्यकता है।

  • हैशटेबल के सभी सदस्य थ्रेड सुरक्षित हैं,

  • हैशटेबल एक सामान्य प्रकार नहीं है,

  • हैशटेबल ढीली टाइप की गई डेटा संरचना है, हम किसी भी प्रकार की चाबियाँ और मान जोड़ सकते हैं।


एक और अंतर जो मैं समझ सकता हूं वह है:

हम वेब सेवाओं के साथ शब्दकोश <केटी, वीटी> (जेनेरिक) का उपयोग नहीं कर सकते हैं। कारण कोई वेब सेवा मानक जेनेरिक मानक का समर्थन नहीं करता है।


.NET में, Dictionary<,> और HashTable बीच का अंतर मुख्य रूप से एक सामान्य प्रकार है, इसलिए आपको स्थिर प्रकार की जांच (और मुक्केबाजी को कम करने के मामले में जेनेरिक के सभी लाभ मिलते हैं, लेकिन यह उतना बड़ा नहीं है जितना बड़ा लोग प्रदर्शन के संदर्भ में सोचते हैं - हालांकि मुक्केबाजी के लिए एक निश्चित स्मृति लागत है)।


चूंकि Dictionary एक सामान्य वर्ग ( Dictionary<TKey, TValue> ) है, ताकि इसकी सामग्री तक पहुंच प्रकार-सुरक्षित हो (यानी आपको Object से कास्ट करने की आवश्यकता नहीं है, जैसा कि आप Hashtable साथ करते हैं)।

तुलना

var customers = new Dictionary<string, Customer>();
...
Customer customer = customers["Ali G"];

सेवा मेरे

var customers = new Hashtable();
...
Customer customer = customers["Ali G"] as Customer;

हालांकि, Dictionary को Hashtable रूप में कार्यान्वित किया गया है, इसलिए तकनीकी रूप से यह वही काम करता है।


ध्यान दें कि एमएसडीएन कहता है: "शब्दकोश <(का <(टीके, टीवीएयू>)>) वर्ग को हैश तालिका ", नहीं "शब्दकोश <(<<(TKey, TValue>)> के रूप में लागू किया गया है) वर्ग को हैशटेबल के रूप में लागू किया गया है"

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

.NET 1.0 जेनेरिक में मौजूद नहीं था; यह वह जगह है जहां हैशटेबल और ऐरेलिस्ट मूल रूप से शुरू हुआ था।


यदि संभव हो, जेनेरिक का उपयोग करें। यह भी शामिल है:

  • ArrayList के बजाय सूची
  • हैशटेबल के बजाय शब्दकोश






c# .net vb.net data-structures