c# - tag - took ka matlab




हैशटेबल पर शब्दकोश क्यों पसंद किया जाता है? (12)

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


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


इसके लायक होने के लिए, एक शब्दकोश है (अवधारणात्मक रूप से) हैश तालिका।

यदि आपका मतलब है "हम Dictionary<TKey, TValue> क्लास के बजाय Dictionary<TKey, TValue> कक्षा का उपयोग क्यों करते हैं?", तो यह एक आसान जवाब है: Dictionary<TKey, TValue> एक सामान्य प्रकार है, Hashtable नहीं है। इसका मतलब है कि आपको Dictionary<TKey, TValue> साथ टाइप सुरक्षा मिलती है, क्योंकि आप इसमें कोई यादृच्छिक वस्तु नहीं डाल सकते हैं, और आपको अपने द्वारा किए गए मानों को नहीं डालना होगा।

दिलचस्प बात यह है कि, Dictionary<TKey, TValue> .NET Framework में कार्यान्वयन Dictionary<TKey, TValue> पर आधारित है, क्योंकि आप इस टिप्पणी से अपने स्रोत कोड में बता सकते हैं:

जेनेरिक डिक्शनरी को हैशटेबल के स्रोत से कॉपी किया गया था

Source


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

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

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

हैशटेबल 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> पर स्विच करने पर विचार करना चाहिए।


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

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

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


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

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

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


Collections और Collections वस्तुओं के समूह को संभालने के लिए उपयोगी हैं। .NET में, सभी संग्रह ऑब्जेक्ट्स इंटरफ़ेस IEnumerable अंतर्गत आता है, जो बदले में ArrayList(Index-Value)) और HashTable(Key-Value) । .NET Framework 2.0 के बाद, ArrayList & HashTable को List और Dictionary साथ बदल दिया गया था। अब, Arraylist और HashTable आजकल परियोजनाओं में अब और अधिक उपयोग नहीं किए जाते हैं।

HashTable और Dictionary बीच के अंतर को लेकर, Dictionary सामान्य है जहां Hastable जेनेरिक नहीं है। हम किसी भी प्रकार की वस्तु को HashTable जोड़ सकते हैं, लेकिन पुनर्प्राप्त करते समय हमें इसे आवश्यक प्रकार में डालना होगा। तो, यह सुरक्षित प्रकार नहीं है। लेकिन dictionary , खुद को घोषित करते समय हम कुंजी और मूल्य के प्रकार को निर्दिष्ट कर सकते हैं, इसलिए पुनर्प्राप्त करते समय कलाकारों की आवश्यकता नहीं है।

आइए एक उदाहरण देखें:

हैश टेबल

class HashTableProgram
{
    static void Main(string[] args)
    {
        Hashtable ht = new Hashtable();
        ht.Add(1, "One");
        ht.Add(2, "Two");
        ht.Add(3, "Three");
        foreach (DictionaryEntry de in ht)
        {
            int Key = (int)de.Key; //Casting
            string value = de.Value.ToString(); //Casting
            Console.WriteLine(Key + " " + value);
        }

    }
}

शब्दकोश,

class DictionaryProgram
{
    static void Main(string[] args)
    {
        Dictionary<int, string> dt = new Dictionary<int, string>();
        dt.Add(1, "One");
        dt.Add(2, "Two");
        dt.Add(3, "Three");
        foreach (KeyValuePair<int, String> kv in dt)
        {
            Console.WriteLine(kv.Key + " " + kv.Value);
        }
    }
}

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

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

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


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

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

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

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

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

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

शब्दकोश:

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

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

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

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

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

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

हैश टेबल:

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

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

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

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

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





data-structures