परिभाषित करें: हाशसेट क्या है?


420

HashSet C # HashSet डेटा संरचना .NET फ्रेमवर्क 3.5 में पेश की गई थी। कार्यान्वित सदस्यों की पूरी सूची HashSet MSDN पृष्ठ पर देखी जा सकती है ।

  1. इसका उपयोग कहां किया जाता है?
  2. आप इसका उपयोग क्यों करना चाहेंगे?


3
डुप्लीकेट का संभावित डुप्लीकेट मुझे HashSet <T> प्रकार का उपयोग कब करना चाहिए?
नवफाल

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

जवाबों:


614
    1. एक HashSetऑब्जेक्ट का एक सेट रखता है, लेकिन एक तरह से यह आपको आसानी से और जल्दी से यह निर्धारित करने की अनुमति देता है कि कोई वस्तु पहले से ही सेट में है या नहीं। यह एक सरणी को आंतरिक रूप से प्रबंधित करके और एक इंडेक्स का उपयोग करके ऑब्जेक्ट को संग्रहीत करता है जिसे ऑब्जेक्ट के हैशकोड से गणना की जाती है। यहाँ एक नज़र रखना

    2. HashSetअद्वितीय तत्वों से युक्त एक अनियंत्रित संग्रह है। इसमें मानक संग्रह ऑपरेशन जोड़ें, निकालें, शामिल हैं, लेकिन चूंकि यह हैश-आधारित कार्यान्वयन का उपयोग करता है, ये ऑपरेशन O (1) हैं। (उदाहरण के लिए सूची के विपरीत, जो कि ओ (एन) है जिसमें कंटेंस और निकालें हैं।) यूनियन , चौराहे और सममित अंतरHashSet जैसे मानक सेट संचालन भी प्रदान करता है । यहाँ एक नज़र रखना

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

HashSetसी # में वर्ग पहले दृष्टिकोण के लिए चला जाता है, इस प्रकार नहीं तत्वों के क्रम को बनाए रखने। यह एक नियमित की तुलना में बहुत तेज हैList । कुछ बुनियादी बेंचमार्क से पता चला है कि प्राथमिक प्रकारों (इंट, डबल, बूल, आदि) के साथ व्यवहार करने पर हैशसेट तेजी से कम होता है। क्लास ऑब्जेक्ट के साथ काम करते समय यह बहुत तेज है। तो वह बिंदु यह है कि हैशसेट तेज है।

एकमात्र पकड़ HashSetयह है कि सूचकांकों तक कोई पहुंच नहीं है। उन तत्वों तक पहुँचने के लिए आप या तो एक एन्यूमरेटर का उपयोग कर सकते हैं या अंतर्निहित फ़ंक्शन का उपयोग करके उस HashSetमें एक Listऔर iterate में परिवर्तित कर सकते हैं। यहाँ एक नज़र रखना


13
दो चीजें, हैशसेट और इसी तरह के .NET हैं, C # के नहीं हैं। इसके अलावा हैशसेट नॉट आर्डर को संरक्षित करता है। एक हैश सेट से आइटम जोड़ने और हटाने का प्रयास करें, आपको पता चल जाएगा कि क्या आप बाद में पुनरावृति करेंगे ..
nawfal

13

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

तो क्यों कोई जानना चाहेगा कि एक सेट में पहले से ही एक प्रविष्टि मौजूद है?

एक स्थिति जहां एक HashSetउपयोगी है एक सूची से अलग-अलग मान प्राप्त करने में है जहां डुप्लिकेट मौजूद हो सकते हैं। एक बार किसी आइटम को जोड़ने के बाद HashSetयह निर्धारित होता है कि आइटम मौजूद है ( Containsऑपरेटर)।

के अन्य लाभों में HashSetसेट संचालन कर रहे हैं: IntersectWith, IsSubsetOf, IsSupersetOf, Overlaps, SymmetricExceptWith, UnionWith

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


20
पुन: नीचे। नहीं, HashSet के माध्यम से पुनरावृत्ति पूरी तरह से तेज़ है। दूसरी बात, सूचकांक द्वारा किसी वस्तु को प्राप्त करना संभव नहीं है। वास्तव में, तत्वों को अनियंत्रित संग्रहीत किया जाता है।
निगेल टच

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

यह समझ में आता है कि यह तेजी से क्यों होगा, क्योंकि कोई भी दो हैश समान नहीं हैं। "शॉर्ट सर्किट" दृष्टिकोण का लाभ उठाने के लिए क्वेरी को सक्षम करना, कुछ मानदंडों को जल्दी से सत्तारूढ़ करना।
शेफ_कोड

8

सीधे शब्दों में और रसोई के रहस्यों को उजागर किए बिना: सामान्य रूप से एक सेट, एक संग्रह है जिसमें कोई डुप्लिकेट तत्व नहीं होते हैं, और जिनके तत्व किसी विशेष क्रम में नहीं होते हैं। तो, A HashSet<T>एक जेनेरिक के समान है List<T>, लेकिन खोने के आदेश की कीमत पर तेज लुकअप (हैशटैब के माध्यम से, जैसा कि नाम का अर्थ है) के लिए अनुकूलित है।


1
लेकिन क्या एक HashSet <T> दो वस्तुओं को संग्रहीत कर सकता है जिनके पास समान डेटा है, जैसे दो उत्पाद वर्ग जो प्रत्येक में समान सामग्री के साथ समान गुण हैं?
जोहान हरस्टैड

मुझे लगता है कि हम कभी नहीं जान पाएंगे
डेनी

@JohanHerstad अपनी श्रेणी के लिए EqualityComparer मानकर उन गुणों की परवाह करता है या आप एक IEqualityComparer के साथ HashSet का निर्माण करते हैं जो उन गुणों के बारे में परवाह करता है, मैं नहीं देखता कि यह क्यों होगा। HashSet के लिए प्रलेखन यह स्पष्ट है कि यह एक या विशिष्टता निर्धारित करने के लिए अन्य पर निर्भर करता है बनाता है।
बेकन बिट्स

2

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

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