2012-02-06 10 views
5

यह एक साक्षात्कार प्रश्न है।एक हैशटेबल के प्रदर्शन को 1 मिलियन तत्वों और 997 बाल्टी के साथ कैसे सुधारें?

मान लीजिए कि तालिका में 1 मिलियन तत्व हैं और 997 बाल्टी अनियंत्रित सूचियां हैं। आगे मान लीजिए कि हैश फ़ंक्शन समान संभावना वाले कुंजियों को वितरित करता है (यानी, प्रत्येक बाल्टी में 1000 तत्व होते हैं)।

तालिका में मौजूद तत्व को खोजने का सबसे बुरा समय क्या है? तालिका में मौजूद एक को खोजने के लिए? आप इसे कैसे सुधार सकते हैं?

मेरा समाधान: तालिका में और तालिका में नहीं तत्व को खोजने का सबसे बुरा मामला सभी ओ (1000) है। 1000 अनुरक्षित सूची की लंबाई है।

इसे सुधारें: (0) सीधा, बाल्टी संख्या> 1 मिलियन बढ़ाएं। (1) प्रत्येक बाल्टी में दूसरा हैशटेबल होता है, जो दूसरी तालिका के लिए हैश मान की गणना करने के लिए एक अलग हैश फ़ंक्शन का उपयोग करता है। यह ओ (1) (2) प्रत्येक बाल्टी में एक बाइनरी खोज पेड़ होगा। यह ओ (एलजी एन) होगा।

अंतरिक्ष और समय के बीच व्यापार-बंद करना संभव है। दोनों को उचित सीमा में रखें।

कोई बेहतर विचार? धन्यवाद !

+4

ओ (1000) ओ (1) है। –

+0

मुझे पता है लेकिन मैं सबसे खराब केस समय दिखाना चाहता हूं। धन्यवाद – user1002288

+1

@ आर। मार्टिनिन्हो फर्नांडीस: यह रैली ओ (1000) नहीं है हालांकि यह है। (प्रत्येक बाल्टी मानना ​​एक सूची है) यह ओ (एन/1000) => ओ (एन) की तरह है। जब आप हैश इतनी उत्तेजित रूप से ओवरलोड हो जाते हैं तो यह वास्तव में एक हैश नहीं है, यह अब लिंक्ड सूचियों का एक सेट है (या जो कुछ भी संरचना है वह बाल्टी लागू करता है)। –

उत्तर

7

सबसे सरल और सबसे स्पष्ट सुधार हैश तालिका में बाल्टी की संख्या को 1.2 मिलियन की तरह बढ़ाने के लिए होगा - कम से कम यह मानते हुए कि आपके हैश फ़ंक्शन उस सीमा में संख्याएं उत्पन्न कर सकते हैं (जो आमतौर पर यह होगा)।

+0

मैं मानता हूं कि मैं 50,000 बाल्टी की तरह या एल्गोरिदम (जैसे लॉसन के एल्गोरिदम) का उपयोग करने का सुझाव दूंगा जो गतिशील रूप से बाल्टी की संख्या को समायोजित करता है। –

+0

@ डेविड, इसे गतिशील तरीके से कैसे करें? हैशटेबल आकार बदलने की लागत बहुत अधिक है ओ (एन)। धन्यवाद ! – user1002288

+0

मैं एक बाल्टी गिनती चुनने का सुझाव दूंगा जो कि एक प्रमुख संख्या है (केवल हैशिंग एल्गोरिदम का उपयोग खराब है)। '999,983' –

1

यदि आप किसी अन्य डेटा संरचना या एक बड़ी मेज उपयोग नहीं कर सकते वहाँ अभी भी विकल्प हैं:

तत्वों के सक्रिय सेट 1000 तक करीब प्रत्येक तत्व को ले जाकर 1M से आप औसत सफल देखने के समय में सुधार कर सकते हैं, तो आप इसकी सूची के सामने पाते हैं। इससे पुन: उपयोग किए जाने पर इसे जल्दी से पाया जा सकता है।

इसी प्रकार यदि मिस का एक सेट होता है जो अक्सर होता है तो आप नकारात्मक परिणाम कैश कर सकते हैं (यह हैश तालिका में एक विशेष प्रकार की प्रविष्टि हो सकती है)।

0

मान लीजिए कि तालिका में 1 मिलियन तत्व हैं और 997 बाल्टी अनियंत्रित सूचियां हैं। आगे मान लीजिए कि हैश फ़ंक्शन समान संभावना वाले कुंजियों को वितरित करता है (यानी, प्रत्येक बाल्टी में 1000 तत्व होते हैं)।

है यह काफी जोड़ नहीं है, लेकिन इसके साथ चलाते हैं ....

सबसे खराब स्थिति समय एक तत्व जो तालिका में नहीं है खोजने के लिए क्या है? तालिका में मौजूद एक को खोजने के लिए? आप इसे कैसे सुधार सकते हैं?

सबसे खराब (और सबसे अच्छा = केवल) तत्व गायब लिए मामला है कि आप एक बाल्टी के लिए हैश तो उस विशिष्ट सूची के सभी तत्वों का निरीक्षण के माध्यम से जाना (अर्थात 1000) तो असफल है। यदि वे बड़े-ओ नोटेशन चाहते हैं, तो परिभाषा के अनुसार यह बताता है कि प्रदर्शन एन तत्वों की संख्या के साथ कैसे भिन्न होता है, इसलिए हमें यह समझना होगा कि कैसे # बाल्टी एन के साथ बदलती हैं: मेरा अनुमान है कि 997 बाल्टी एक निश्चित राशि है , और यदि तत्वों की संख्या बढ़ जाती है तो बढ़ने वाला नहीं है। इसलिए तुलना की संख्या एन/997 है, जो - एक रैखिक कारक होने के नाते - अभी भी ओ (एन) है।

मेरा समाधान: तालिका में और तालिका में नहीं तत्व को खोजने का सबसे बुरा मामला सभी ओ (1000) है। 1000 अनुरक्षित सूची की लंबाई है।

नहीं - आप तुलना की संख्या के बारे में सोच रहे हैं - लेकिन बड़े-ओ नोटेशन स्केलेबिलिटी के बारे में है।

इसे सुधारें: (0) सीधा, बाल्टी संख्या> 1 मिलियन बढ़ाएं। (1) प्रत्येक बाल्टी में दूसरा हैशटेबल होता है, जो दूसरी तालिका के लिए हैश मान की गणना करने के लिए एक अलग हैश फ़ंक्शन का उपयोग करता है। यह ओ (1) (2) होगा प्रत्येक बाल्टी एक बाइनरी खोज पेड़ रखती है। यह ओ (एलजी एन) होगा।

अंतरिक्ष और समय के बीच व्यापार-बंद करना संभव है। दोनों को उचित सीमा में रखें।

अच्छी तरह से हाँ - औसत टकराव प्रविष्टियों और बाल्टी की संख्या से संबंधित है। यदि आप बहुत कम टकराव चाहते हैं, तो आपके पास तालिका में 1 मिलियन से अधिक प्रविष्टियां होंगी, लेकिन यह स्मृति की बर्बादी हो जाती है, हालांकि बड़ी वस्तुओं के लिए आपके पास वास्तविक ऑब्जेक्ट में इंडेक्स या पॉइंटर हो सकता है। एक विकल्प है कि तेजी से टकराव हैंडलिंग तंत्र की तलाश करें, जैसे कि शेड-टू बाल्टी से ऑफसेट की श्रृंखला का प्रयास करना (विस्थापन को वापस तालिका आकार में वापस करने के लिए% का उपयोग करना), लिंक्ड सूचियों का उपयोग करके कुछ ढेर का उपयोग करने के बजाय। रिहाशिंग एक और विकल्प है, कम पुन: टकराव दर को देखते हुए, लेकिन आम तौर पर अधिक सीपीयू की आवश्यकता होती है, और अच्छे हैशिंग एल्गोरिदम की मनमाने ढंग से लंबी सूची होने में समस्याग्रस्त है।

हैश टेबल के अंदर हैश टेबल पूरी तरह से व्यर्थ और उल्लेखनीय रूप से स्मृति की बर्बादी है। बाहरी हैश तालिका में टकराव को कम करने के लिए उस स्थान के एक अंश का उपयोग करना बेहतर होगा।

3

स्पष्ट रूप से बाल्टी संख्या में वृद्धि प्रदर्शन को बेहतर बनाती है। मान लीजिए कि यह कोई विकल्प नहीं है (किसी भी कारण से) मैं निम्नलिखित का सुझाव देता हूं:

आम तौर पर हैश तालिका में बाल्टी होती है, प्रत्येक में एक लिंक की गई सूची होती है (इसके सिर पर अंक)। हालांकि आप एक हैश टेबल बना सकते हैं, जिसमें बाल्टी सूची के बजाय बाइनरी सर्च ट्री (इसकी रूट पर पॉइंटर) रखती है।

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

यदि एन तत्वों की संख्या है, और एम बाल्टी की संख्या है, तो समान वितरण के मामले में जटिलता ओ [लॉग (एन/एम)] के रूप में बढ़ती है।

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