2012-07-06 7 views
5

मैं एसएएस हैशटेबल में एक बाल्टी के निर्धारण पर थोड़ा सा स्पष्टीकरण देना चाहता हूं। सवाल वास्तव में हैशैक्स पैरामीटर के बारे में है।हैशक्स द्वारा निर्दिष्ट एसएएस हैशटेबल में टेबल आकार वास्तव में क्या है?

एसएएस डॉक्स में अनुसार, hashexp है:

हैश वस्तु के आंतरिक तालिका आकार, जहां हैश तालिका का आकार 2n है।

हैश तालिका का आकार बनाने के लिए HASHEXP का मान शक्ति के दो एक्सपोनेंट के रूप में उपयोग किया जाता है। उदाहरण के लिए, HASHEXP के लिए 4 के एक मूल्य 24 या 16 वर्ष की एक हैश तालिका आकार के बराबर HASHEXP के लिए अधिकतम मूल्य 20.

हैश तालिका आकार आइटम है कि हो सकता है की संख्या के बराबर नहीं है संग्रहीत। हैश टेबल की कल्पना 'बाल्टी' की सरणी के रूप में करें। 16 के हैश टेबल आकार में 16 'बाल्टी' होंगी। प्रत्येक बाल्टी में अनंत वस्तुओं की संख्या हो सकती है। हैश तालिका की दक्षता बाल्टी से वस्तुओं को पुनर्प्राप्त करने और पुनर्प्राप्त करने के लिए हैशिंग फ़ंक्शन की क्षमता में निहित है।

हैश ऑब्जेक्ट लुकअप दिनचर्या की दक्षता को अधिकतम करने के लिए आपको हैश ऑब्जेक्ट में डेटा की मात्रा के सापेक्ष हैश तालिका आकार सेट करना चाहिए। जब तक आपको सर्वश्रेष्ठ नतीजा न मिल जाए तब तक विभिन्न HASHEXP मानों को आजमाएं। उदाहरण के लिए, यदि हैश ऑब्जेक्ट में एक मिलियन आइटम हैं, तो हैश तालिका का आकार 16 (HASHEXP = 4) काम करेगा, लेकिन बहुत कुशलता से नहीं। 512 या 1024 (हैशएक्सपी = 9 या 10) का हैश टेबल आकार का परिणाम सर्वश्रेष्ठ प्रदर्शन होगा।

सवाल है वास्तव में, एक हैश तालिका आकार है क्या, जबकि यह हैश वस्तु में डेटा का एक राशि नहीं है?

क्या यह समझा जाना चाहिए कि हम उतनी मेमोरी आवंटित करना चाहते थे क्योंकि यह निष्क्रिय हो सकता है लेकिन कम नहीं, और नहीं। चीजें तेजी से काम करने के लिए यह दो की शक्ति है। लेकिन यह संभवतः इस्तेमाल किए गए डेटा की मात्रा को सीमित नहीं करता है, यह केवल इंगित करता है कि कितना उपयोग किया जा रहा है, है ना?

उत्तर

6

पॉल डोर्फ़मैन (हैशिंग का मालिक) इस श्वेतपत्र के पृष्ठ 10 पर विस्तार का एक उचित बिट में चला जाता है:

http://www2.sas.com/proceedings/forum2008/037-2008.pdf

मैं यह समझ के रूप में, hashtables द्विआधारी पेड़ में अपने डेटा स्टोर। हैशेक्स द्वारा बनाई गई प्रत्येक बाल्टी बाइनरी पेड़ की संख्या का प्रतिनिधित्व करती है जिसका उपयोग डेटा को स्टोर करने के लिए किया जाएगा। 0 का हैशैक्स एक पेड़ का उपयोग करेगा, जबकि 8 का हैशक्स 256 पेड़ों का उपयोग करेगा। जब हैश ऑब्जेक्ट के विरुद्ध एक लुकअप किया जाता है, तो एक आंतरिक एल्गोरिदम निर्धारित करता है कि किस पेड़ की कुंजी मौजूद है (हैश मान के आधार पर)। फिर यह उस पेड़ को मूल्य के लिए जांचता है। स्वचालित रूप से यह जानने के लिए कि 256 पेड़ किस प्रकार दिख रहे हैं (उदाहरण के लिए) यह एक बाइनरी पेड़ की तुलना में 8 तुलना (2^8) बचा लेगा।

पूरी बात उससे कहीं अधिक जटिल लगती है लेकिन यह मेरी व्याख्या है कि यह तेजी से क्यों काम करती है।

3

जैसा कि रॉब पेन्रिज ने बताया, पॉल डॉर्फमैन वास्तव में एसएएस हैश ऑब्जेक्ट गुरु है। हैशक्सप हैश टेबल के आकार से संबंधित नहीं है, जैसा कि रॉब के जवाब में बताया गया है।

यदि आपके पास 100 होब्स और 10 न्यूमेरिक चर के साथ एक टेबल है जो हैश तालिका में लोड की गई है, तो हैश तालिका का आकार केवल 100obs * 10vars * 8bytes (मानते हैं कि सभी न्यूमेरिक वर्र्स 8byte फ़ील्ड के रूप में संग्रहीत हैं) 7.8KB दे या 10% ले लो।

याद रखें कि एसएएस गतिशील रूप से रैम स्पेस आवंटित करता है क्योंकि रिकॉर्ड मेमोरी में हैश टेबल में जोड़े जाते हैं, इसलिए आपको पहले से निर्दिष्ट करने की आवश्यकता नहीं है कि यह कितना आकार होना चाहिए। [मैं नियमित रूप से हैश टेबल का उपयोग कर रहा हूं, लेकिन सोच नहीं सकता किसी भी स्थान पर जहां कोई आकार पहले से निर्दिष्ट कर सकता है]।

सामान्य युक्ति: यदि आप जानना चाहते हैं कि आपकी हैश तालिका कितनी बड़ी होगी, तो डेटासेट पर एक प्रोसी सामग्री चलाएं जिसे आप हैश तालिका में लोड करना चाहते हैं और "निरीक्षण की लंबाई" गुणा करें & "डेटासेट में obs की संख्या ", यह बाइट्स में आवश्यक मेमोरी आकार देगा। यदि आपके पास इतना स्मृति है तो आप इसे स्मृति में लोड कर सकते हैं।

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