2009-08-01 15 views
6

हैशैप्स का उपयोग करने के लिए और अधिक कुशल दृष्टिकोण क्या है?कुशल हैशमैप

ए) कई छोटे HashMaps एक विशाल hashmap में सभी वस्तुओं का प्रयोग करें, या

बी) की दुकान?

(मान लें कि चाबी के लिए हैशिंग एल्गोरिथ्म काफी कुशल है, कुछ टक्कर में जिसके परिणामस्वरूप)

स्पष्टीकरण: विकल्प बी प्राथमिक कुंजी द्वारा अलगाव का तात्पर्य - यानी कोई अतिरिक्त देखने जो वास्तविक hashmap उपयोग करने के लिए निर्धारित करने के लिए आवश्यक है । (उदाहरण के लिए, यदि लुकअप कुंजियां अल्फान्यूमेरिक हैं, हैशमैप 1 ए, हैशमैप 2 स्टोर्स बी को स्टोर करता है, और इसी तरह।)

उत्तर

5

निश्चित रूप से बी। हैश टेबल का लाभ यह है कि प्रति लुकअप की तुलना की औसत संख्या स्वतंत्र है आकार का

यदि आप अपने मानचित्र को एन छोटे हैशैप्स में विभाजित करते हैं, तो आपको प्रत्येक लुकअप के लिए औसतन आधा खोजना होगा। यदि छोटे हैशैप्स में वही लोड कारक होता है जो बड़ा नक्शा होता, तो आप लगभग एन/2 के कारक द्वारा तुलना की कुल संख्या में वृद्धि करेंगे।

और यदि छोटे हैशैप्स में एक छोटा लोड कारक है, तो आप स्मृति बर्बाद कर रहे हैं।

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

+0

पहला वाक्य मानता है कि ऑब्जेक्ट्स हैशकोड विधियां सभी अच्छी तरह से वितरित हैश मान उत्पन्न करती हैं। सबसे बुरी स्थिति परिदृश्य में (यानी जहां सभी ऑब्जेक्ट्स एक ही मान पर हैंश हैशटेबल लुकअप 'ओ (एन) 'होगा। –

4

क्या ये मानचित्र उपयोग किए गए हैं तार्किक रूप से अलग स्थानों में? उदाहरण के लिए, मेरे पास एक नक्शा नहीं होगा जिसमें उपयोगकर्ता, कैश किए गए क्वेरी परिणाम, लॉगर्स इत्यादि हों, क्योंकि आपको पता चल जाएगा कि चाबियाँ टकराव नहीं होंगी। हालांकि, मैं समान रूप से एक मानचित्र को कई मानचित्रों में विभाजित नहीं करता।

प्रत्येक लॉजिकल मैपिंग कुंजी से मूल्य के लिए एक हैशप रखें।

1

इसके अलावा @ जॉन का जवाब, व्यावहारिक कारण हो सकते हैं कि आप अलग हैश टेबल क्यों बनाए रखना चाहते हैं।

यदि आपके पास अलग-अलग मैपिंग के लिए अलग-अलग टेबल हैं तो आप प्रत्येक मैपिंग को स्वतंत्र रूप से 'साफ़' कर सकते हैं; जैसे 'स्पष्ट' को कॉल करके या संबंधित तालिका के संदर्भ से छुटकारा पाकर।

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

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

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