हैशिंग हे (1) है तभी तालिका में कुंजी और कुछ अन्य मान्यताओं के केवल स्थिर संख्या बने होते हैं। लेकिन ऐसे मामलों में इसका फायदा है।
अपने प्रमुख एक n बिट प्रतिनिधित्व है, तो आपके हैश समारोह का उपयोग कर सकते 1, 2, ... इन बिट्स की एन।एक हैश फ़ंक्शन के बारे में सोचकर 1 बिट का उपयोग करता है। मूल्यांकन निश्चित रूप से ओ (1) है। लेकिन आप केवल कुंजी स्थान को 2 में विभाजित कर रहे हैं। तो आप एक ही बिन में 2^(एन -1) कुंजी को मैप कर रहे हैं। बीएसटी खोज का उपयोग करते हुए यह लगभग एक पूर्ण कुंजी का पता लगाने के लिए एन -1 कदम उठाता है।
आप यह देखने के लिए इसे बढ़ा सकते हैं कि यदि आपका हैश फ़ंक्शन K बिट्स का उपयोग करता है तो आपका बिन आकार 2^(n-k) है।
तो के-बिट हैश फ़ंक्शन ==> 2 से अधिक के^प्रभावी प्रभावी डिब्बे ==> 2^(एनके) एन-बिट कुंजी प्रति बिन ==> (एनके) चरण (बीएसटी) टकराव को हल करने के लिए । असल में अधिकांश हैश फ़ंक्शन बहुत कम "प्रभावी" होते हैं और 2^के डिब्बे बनाने के लिए के बिट्स से अधिक की आवश्यकता होती है। तो यह आशावादी भी है।
आप इसे इस तरह से देख सकते हैं - आपको सबसे खराब मामले में एन बिट्स की चाबियों की एक जोड़ी को विशिष्ट रूप से अलग करने में सक्षम होने के लिए ~ n चरणों की आवश्यकता होगी। इस जानकारी सिद्धांत सीमा, हैश तालिका या नहीं के आसपास वास्तव में कोई रास्ता नहीं है।
हालांकि, यह हैश टेबल का उपयोग कैसे/कब नहीं है!
जटिलता विश्लेषण मानता है कि एन-बिट कुंजी के लिए, आप तालिका में ओ (2^एन) कुंजी (उदाहरण के लिए सभी संभव कुंजी के 1/4) हो सकते हैं। लेकिन अधिकांश समय जब हम हैश टेबल का उपयोग नहीं करते हैं, तो हमारे पास तालिका में केवल n-bit कुंजी की निरंतर संख्या होती है। यदि आप केवल तालिका में निरंतर कुंजी की आवश्यकता चाहते हैं, तो कहें कि सी आपकी अधिकतम संख्या है, तो आप ओ (सी) डिब्बे की हैश तालिका बना सकते हैं, जो अपेक्षित निरंतर टक्कर (एक अच्छे हैश फ़ंक्शन के साथ) की गारंटी देता है; और कुंजी में एन बिट्स के ~ logC का उपयोग कर एक हैश फ़ंक्शन। फिर हर क्वेरी ओ (लॉगसी) = ओ (1) है। इस प्रकार लोगों का दावा है कि "हैश टेबल एक्सेस ओ (1)"/
यहां कुछ कैच हैं - पहले, कह रहे हैं कि आपको सभी बिट्स की आवश्यकता नहीं है केवल बिलिंग चाल हो सकती है। सबसे पहले आप हैश फ़ंक्शन में मुख्य मान को वास्तव में पास नहीं कर सकते हैं, क्योंकि यह ओ (एन) की स्मृति में एन बिट्स को ले जायेगा। तो आपको उदाहरण करने की ज़रूरत है एक संदर्भ गुजर रहा है। लेकिन आपको अभी भी इसे पहले से स्टोर करने की आवश्यकता है जो ओ (एन) ऑपरेशन था; आप इसे हैशिंग के लिए बिल नहीं देते हैं; आप समग्र गणना कार्य इस से बच नहीं सकते हैं। दूसरा, आप हैशिंग करते हैं, बिन ढूंढते हैं, और 1 से अधिक कुंजी पाते हैं; आपकी लागत आपके रिज़ॉल्यूशन विधि पर निर्भर करती है - यदि आप तुलना आधारित (बीएसटी या सूची) करते हैं, तो आपके पास ओ (एन) ऑपरेशन होगा (याद कुंजी एन-बिट है); यदि आप दूसरे हैश करते हैं, तो, यदि आपके पास 2 हैश की टक्कर है तो आपके पास एक ही समस्या है। तो ओ (1) 100% गारंटी नहीं है जब तक कि आपके पास कोई टकराव न हो (आप चाबियों की तुलना में अधिक डिब्बे वाली तालिका रखने का मौका बेहतर कर सकते हैं)।
वैकल्पिक पर विचार करें, उदा। बीएसटी, इस मामले में। सी कुंजी हैं, इसलिए एक संतुलित बीएसटी गहराई में ओ (लॉगसी) होगा, इसलिए एक खोज ओ (लॉगसी) चरणों को लेती है। हालांकि इस मामले की तुलना ओ (एन) ऑपरेशन होगी ... इसलिए ऐसा लगता है कि इस मामले में हैशिंग एक बेहतर विकल्प है।
कॉपी किया गया यह परिशोधित है हे (1), नहीं हे (1)। – kennytm
याद रखें ओ() बड़ी संख्या में संचालन की सीमा है। 'औसत' पर आपके पास कई टकराव नहीं होते - यह आवश्यक नहीं है कि एक व्यक्तिगत ऑपरेशन में कोई टक्कर न हो। –
स्ट्रिंग कार्यान्वयन के आधार पर, स्ट्रिंग्स उनके साथ उनके हैश किए गए मान को ले जा सकती हैं, इसलिए यह स्थिर रहेगी। मुद्दा यह है कि हैश लुकअप जटिलता के लिए यह अप्रासंगिक है। –