2011-02-07 9 views
5

मुझे हाल ही में हैशटेबल्स के बारे में कुछ साक्षात्कारों में ड्रिल किया गया है और जब यह GetHashCode() को ओवरराइड करने में सक्षम है। जब तक मैंने तौलिया में फेंक दिया, तब तक चर्चा गहरी और गहरी हो रही थी।हैशटेबल और डिक्शनरी से संबंधित साक्षात्कार प्रश्न

अब मैं अगली बार तैयार होने के लिए सब कुछ कवर करने के लिए कुछ शोध कर रहा हूं।

मैं पाया है इस उत्कृष्ट लेख है कि मैं चाहते हैं साझा करने के लिए: http://msdn.microsoft.com/en-us/library/ms379571(VS.80).aspx#datastructures20_2_topic5

1) कुछ मैं के साथ बहुत सहज महसूस नहीं करते तथ्य यह है कि शब्दकोश हैश आधारित हैं, लेकिन जाहिरा तौर पर सूचियाँ नहीं हैं । क्या इसका मतलब यह है कि सूची <> और ऐरे [] में खोज करना रैखिक है, जबकि एक शब्दकोश या हैशटेबल में खोज करते समय निरंतर और इसलिए बहुत तेज़ है? क्या यह सब कुछ है?

2) यदि मैं किसी शब्दकोश में एक कुंजी के रूप में कक्षा का उपयोग करता हूं, तो मुझे किसी भी आवश्यक पहचान फ़ील्ड के आधार पर उस वर्ग पर GetHashcode() को ओवरराइड करने की आवश्यकता होती है ताकि उदाहरण अद्वितीय हो सकें। हालांकि यह अभी भी हो सकता है कि दोनों आईडी फ़ील्ड बराबर हैं और एक ही हैशकोड उत्पन्न होगा? यदि ऐसा ही होता है तो उसी हैशकोड के साथ दो उदाहरणों की टक्कर के दौरान क्या होता है?

3) टकराव कैसे हल किया जा सकता है? मैंने शब्दकोश के लिए हैशटेबल और चेनिंग के लिए टकराव के मामले में रीहैशिंग पद्धति के बारे में लेख में पढ़ा है। लेकिन मुझे अभी भी यकीन नहीं है कि यह वास्तव में कैसे काम करता है क्योंकि मैं गणित प्रतिभा नहीं हूं। : - \ क्या कोई इसे बेहतर समझा सकता है कि यह कैसे काम करता है?

कई धन्यवाद, Kave

+2

यदि समान हैशकोड उत्पन्न होता है तो बराबर फ़ंक्शन ऑब्जेक्ट पर निर्धारित समानता के लिए चलाया जाता है। इसलिए उस फ़ंक्शन को ओवरराइड करना भी न भूलें। – Magnus

+0

मैं सिर्फ योगदान देने वाले सभी को धन्यवाद देना चाहता था। मेरे पास एक साक्षात्कार था और उन्होंने हैशसेट लॉल के लिए कहा। एक ही समय में मैंने उन सभी प्रो/कॉन्ट्रा को हशों के रूप में दिया जैसा हमने चर्चा की और वह प्रभावित हुए। साक्षात्कार पास किया। तो यह सही होना चाहिए। ;) – Houman

उत्तर

4

1) सामान्यतः, हाँ, Dictionary<T> या HashSet<T> में निरंतर समय पहुंच है। एक अनसुलझा List<T> में किसी आइटम को ढूंढना या ऐरे को रैखिक रूप से किया जाना चाहिए। सॉर्ट किए गए संग्रह आपको ओ (लॉग एन) एक्सेस समय देने, बाइनरी खोज करने देते हैं।

2) यदि आप .NET में GetHashCode ओवरराइड करते हैं, तो आपको Equals विधि को ओवरराइड करना चाहिए। .NET Dictionary और HashSet में, आप समान वस्तुओं को सम्मिलित नहीं कर सकते हैं। हैश टकराव सामान्य मामले में अपरिहार्य हैं (जब तक कि आपने एक परिपूर्ण हैश गणना नहीं की हो)। टकराव को हल करने के कई तरीके हैं।

3) टकराव समाधान के बारे में अधिक जानकारी के लिए, http://en.wikipedia.org/wiki/Hash_table देखें।

+0

विशेष रूप से .net टकरावों में बाल्टी – Andrey

+0

से जुड़ी लिंक्ड सूची होने से हल किया जाता है आपके उत्तर के लिए बहुत धन्यवाद। आगे नीचे मैंने स्टीवन के जवाब पर एक टिप्पणी लिखी है, जो आपको भी बहुत अच्छी तरह से पूछा जा सकता है। :) चूंकि आपने सही हैश का उल्लेख किया है, क्या मैं डीबी से 100% अनन्य प्राथमिक कुंजी का उपयोग कर इसे प्राप्त करूंगा? और क्या हैश टक्कर डेवलपर्स की ज़िम्मेदारी के तहत आती है या क्या इसे किसी भी तरह से स्वचालित रूप से ख्याल रखा जा रहा है? – Houman

+1

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

1

एक हैश तालिका एक डेटा संरचना है। अधिक जानकारी when looking for more general information मिल सकती है।

1) सूचियों में एक डिफ़ॉल्ट खोज रैखिक हैं (सभी तत्वों को पार करने की आवश्यकता है)। बिल्कुल सही हैशिंग (कोई टक्कर नहीं) सबसे खराब मामले में निरंतर समय लुकअप की अनुमति देता है। अधिक टकराव का परिणाम धीमे लुकअप में होता है।

2) संभावित कुंजी के बड़े सेट के यादृच्छिक सबसेट को हश करते समय हैश टकराव व्यावहारिक रूप से अपरिहार्य हैं। इसलिए, अधिकांश हैश टेबल कार्यान्वयन में ऐसी घटनाओं को संभालने के लिए कुछ टकराव समाधान रणनीति है। .NET के हैशटेबल कार्यान्वयन का उपयोग double hashing का उपयोग करना प्रतीत होता है।

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

अद्यतन: टक्कर हैंडलिंग में हैशटेबल और शब्दकोश के कार्यान्वयन में a difference है। स्पष्ट रूप से हैशटेबल अप्रचलित है और Dictionary या HashSet को प्राथमिकता दी गई है।

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

+0

आपके उत्तर के लिए बहुत धन्यवाद। वास्तव में यदि मैं अपने GetHashCode() को डीबी से पुनर्प्राप्त प्राथमिक कुंजी फ़ील्ड पर आधारित करता हूं, तो क्या मैं ज़ीरो से टकराव के परिवर्तन नहीं लाऊंगा? लेकिन यदि हैश को सब के बाद डुप्लिकेट किया जा सकता है, तो क्या यह .NET स्वचालित रूप से टकराव के मामले में मूल्यों को दोबारा बढ़ाने/दोगुनी करने की देखभाल नहीं कर रहा है? साक्षात्कार में ऐसा लगता है कि यह मेरे बारे में कुछ करने की मेरी ज़िम्मेदारी थी। :) शायद वे आंतरिक रूप से इस्तेमाल होने वाले डबल हैशिंग के बारे में सुनना चाहते थे, जिसे मैंने नहीं कहा था। – Houman

+1

यदि डीबी पीके प्रकार int है और शब्दकोश में केवल हां से उस प्रकार की वस्तुएं होती हैं। (आप GetHshCode फ़ंक्शन में केवल पीके फ़ील्ड वापस कर देंगे)। लेकिन अधिकांश समय आपको एक अच्छे हैशिंग फ़ंक्शन की आवश्यकता होती है, http://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-system-object-gethashcode/3880895# देखें 3880895 – Magnus

+0

मैं @Magnus से सहमत हूं। टकराव की देखभाल करने के लिए, यह केवल कुछ ऐसा है जो आपको पता होना चाहिए ताकि आप समझ सकें कि संभावित हैशिंग फ़ंक्शन एक अद्वितीय क्यों महत्वपूर्ण है। –

संबंधित मुद्दे