दिलचस्प पोस्ट
विंडोज पर सी + + स्थिर कोड विश्लेषण उपकरण घुमाए गए आयत को रेखांकित करने के लिए कैसे (2 डी में सेटपिक्सल द्वारा) 1 सेकंड टाइमआउट के साथ आईपी से पायथन लुकअप होस्टनाम जावा में गणितीय अभिव्यक्तियों को पार्स करने के लिए एक अच्छा पुस्तकालय क्या है? Static_cast <> और C शैली कास्टिंग के बीच अंतर क्या है? Git submodules वर्कफ़्लो जावा में if / else बनाम स्विच स्टेटमेंट का रिश्तेदार प्रदर्शन अंतर क्या है? स्विफ्ट में AVPlayerViewController (AVKit) के साथ वीडियो कैसे खेलें Android में "@ आईडी /" और "@ + id /" के बीच अंतर टी-एसक्यूएल में लेवेनशटेन की दूरी एंड्रॉइड स्टूडियो गड़बड़ी को स्थापित करने में त्रुटि ! फ़ंक्शन () {} () बनाम (फ़ंक्शन () {}) () LINQ का उपयोग करके एक सूची <स्ट्रिंग> के अंदर सभी स्ट्रिंग्स को सचेत करें Scope_Identity (), पहचान (), @@ पहचान, और Ident_Current () के बीच अंतर क्या है? क्लाइंट साइड में जावास्क्रिप्ट कैसे लिखने के लिए समय में `ठंडे हुए 'प्रतिक्रिया प्राप्त करना और पार्स करना है?

हैश टेबल वास्तव में हे हो (1) हो सकता है?

यह सामान्य ज्ञान है कि हैश तालिकाओं को हे (1) प्राप्त कर सकते हैं, लेकिन उसने मुझे कभी समझ नहीं पाया है क्या कोई इसे समझा सकता है? यहां दो स्थितियां हैं जो मन में आती हैं:

। मान हैश तालिका के आकार से छोटा है। इसलिए, मान अपने हीश है, इसलिए कोई हैश तालिका नहीं है लेकिन अगर वहां था, तो यह ओ (1) होगा और अभी भी अक्षम होगा

बी। आपको मूल्य के एक हैश की गणना करना है। इस स्थिति में, ऑर्डर ओ (एन) के आंकड़ों के आकार के लिए देखा जा रहा है ओ (एन) काम करने के बाद लुकअप हे (1) हो सकता है, लेकिन यह अभी भी मेरी आँखों में ओ (एन) के लिए बाहर आता है

और जब तक आपके पास एक संपूर्ण हैश या एक बड़ी हैश तालिका नहीं होती है, संभवतः वहाँ प्रति बाल्टी के कई आइटम हैं इसलिए, यह कुछ बिंदु पर एक छोटी रेखीय खोज में मिल जाती है।

मुझे लगता है कि हैश तालिकाओं भयानक हैं, लेकिन मुझे ओ (1) पदनाम नहीं मिलता है, जब तक कि यह सैद्धांतिक नहीं होना चाहिए।

हैश तालिका के लिए विकिपीडिया का लेख लगातार निरंतर लुकअप समय का संदर्भ देता है और पूरी तरह से हैश फ़ंक्शन की लागत को अनदेखा करता है। क्या यह वास्तव में एक उचित उपाय है?


संपादित करें: संक्षेप करने के लिए जो मैंने सीखा है:

  • यह तकनीकी रूप से सत्य है क्योंकि हैश फ़ंक्शन को कुंजी में सारी जानकारी का उपयोग करने के लिए आवश्यक नहीं है और ऐसा निरंतर समय हो सकता है, और क्योंकि एक बड़ी पर्याप्त तालिका collisions को निकट निरंतर समय तक ला सकता है।

  • यह व्यवहार में सच है क्योंकि समय के साथ ही यह तब तक काम करता है जब तक कि टकराव को कम करने के लिए हैश फ़ंक्शन और टेबल आकार का चयन किया जाता है, भले ही अक्सर एक निरंतर समय हैश फ़ंक्शन का उपयोग न करने का मतलब हो।

वेब के समाधान से एकत्रित समाधान "हैश टेबल वास्तव में हे हो (1) हो सकता है?"

आपके पास यहां दो चर, मी और n हैं, जहां m इनपुट की लंबाई है और n हैश में वस्तुओं की संख्या है।

ओ (1) लुकअप प्रदर्शन का दावा कम से कम दो मान्यताओं को बनाता है:

  • ओ (1) समय की तुलना में आपकी वस्तु समानता हो सकती है।
  • कुछ हैश टकराव होंगे।

यदि आपकी ऑब्जेक्ट्स वैरिएबल आकार हैं और एक समानता जांच के लिए सभी बिट्स को देखने की आवश्यकता है तो प्रदर्शन ओ (मी) हो जाएगा। हैश समारोह में ओ (मी) होना जरूरी नहीं है – यह ओ (1) हो सकता है। क्रिप्टोग्राफिक हैश के विपरीत, एक शब्दकोश में उपयोग करने के लिए एक हैश फंक्शन हैश की गणना के लिए इनपुट में हर बिट को देखने नहीं है कार्यान्वयन केवल एक निश्चित संख्या की बिट्स को देखने के लिए स्वतंत्र हैं।

पर्याप्त रूप से कई मदों के लिए आइटम की संख्या संभव हैश की संख्या से अधिक हो जाएगी और फिर आप (1) से ऊपर की वृद्धि के कारण टक्कर प्राप्त कर सकते हैं, उदाहरण के लिए ओ (एन) एक साधारण लिंक्ड सूची ट्रैवर्सल (या ओ (एन * एम) यदि दोनों मान्यताओं झूठी हैं)।

व्यवहार में हालांकि ओ (1) दावे के दौरान तकनीकी तौर पर गलत, कई वास्तविक दुनिया परिस्थितियों के लिए लगभग सच है, और विशेष रूप से उन स्थितियों में जहां उपरोक्त मान्यताओं को पकड़ है

आपको हैश की गणना करना है, इसलिए ऑर्डर ओ (एन) के आंकड़ों के आकार के लिए देखा जा रहा है ओ (एन) काम करने के बाद लुकअप हे (1) हो सकता है, लेकिन यह अभी भी मेरी आँखों में ओ (एन) के लिए बाहर आता है

क्या? हैश करने के लिए एक तत्व लगातार समय लेता है। यह कुछ और क्यों होगा? यदि आप n तत्वों को सम्मिलित कर रहे हैं, तो हाँ, आपको n हैश की गणना करना है, और यह रैखिक समय लेता है … एक तत्व को देखने के लिए, आप जो भी खोज रहे हैं उसके एक ही हश की गणना करें, फिर उपयुक्त बाल्टी पाएं उस के साथ। आप पहले से ही हैश तालिका में मौजूद सभी चीजों की हैश को फिर से नहीं गिनाते हैं

और जब तक आपके पास एक संपूर्ण हैश या बड़ी हॅश टेबल नहीं होती है, तो संभवत: बाल्टी प्रति कई आइटम होते हैं, इसलिए यह किसी बिंदु पर एक छोटे से रैखिक खोज में मिल जाता है।

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

हेश टेबल का व्यापार बंद निश्चित रूप से अंतरिक्ष जटिलता है आप समय के लिए अंतरिक्ष का कारोबार कर रहे हैं, जो कंप्यूटिंग विज्ञान में सामान्य मामला लगता है


आप अपनी अन्य टिप्पणियों में से किसी एक में स्ट्रिंग्स के रूप में कुंजी का उपयोग करने का उल्लेख करते हैं। आप एक स्ट्रिंग के हैश की गणना करने के लिए कितने समय लेते हैं, इस बारे में चिंतित हैं क्योंकि इसमें कई वर्ण हैं? जैसा कि किसी और को फिर से बताया गया है, आपको जरूरी नहीं है कि वह सभी वर्णों को देखने के लिए हैश की गणना करें, हालांकि यह आपके पास बेहतर हैश उत्पन्न कर सकता है। उस स्थिति में, अगर आपकी कुंजी में औसत m अक्षर होते हैं, और आपने अपने सारे हश की गणना करने के लिए उन सभी का उपयोग किया है, तो मुझे लगता है कि आप सही हैं, यह खोज O(m) ले जाएगा। अगर m >> n तो आपको एक समस्या हो सकती है आप शायद उस मामले में बीएसटी के साथ बेहतर होगा। या सस्ती हैशिंग फ़ंक्शन का चयन करें।

हैश निश्चित आकार है – उपयुक्त हैश बाल्टी को देखकर एक निश्चित लागत ऑपरेशन है। इसका अर्थ है कि यह ओ (1) है।

हैश की गणना करना एक विशेष रूप से महंगा ऑपरेशन नहीं है – हम यहां क्रिप्टोग्राफ़िक हैश फ़ंक्शन नहीं बोल रहे हैं लेकिन इसके द्वारा हैश फ़ंक्शन गणना स्वयं तत्वों की संख्या n पर निर्भर नहीं करती है; जबकि यह एक तत्व में डेटा के आकार पर निर्भर हो सकता है, यह ऐसा नहीं है जो n को संदर्भित करता है। तो हैश की गणना n पर निर्भर नहीं होती और यह भी ओ (1) है।

हैशिंग हे (1) केवल तभी है जब तालिका में केवल निरंतर नंबर की चाबियाँ होती हैं और कुछ अन्य मान्यताओं को बना दिया जाता है लेकिन ऐसे मामलों में इसका फायदा है

यदि आपकी कुंजी में n-bit प्रतिनिधित्व है, तो आपके हैश फ़ंक्शन 1, 2, … इन बिट्स का उपयोग कर सकते हैं। एक हैश फ़ंक्शन के बारे में सोच रहा है जो 1 बिट का उपयोग करता है मूल्यांकन सुनिश्चित करने के लिए ओ (1) है लेकिन आप केवल प्रमुख स्थान 2 में विभाजित कर रहे हैं। तो आप 2 ^ (n-1) कुंजी को उसी बिन में मैप कर रहे हैं। बीएसटी खोज का उपयोग करते हुए यह लगभग पूर्ण रूप से एक विशेष कुंजी का पता लगाने के लिए n-1 चरणों तक ले जाता है।

आप इसे यह देखने के लिए बढ़ा सकते हैं कि यदि आपके हैश फ़ंक्शन का बी का उपयोग करता है तो आपका बिन आकार 2 ^ (एनके) है

इसलिए कि-बिट हैश फ़ंक्शन ==> 2 से अधिक नहीं ^ प्रभावी बिन ==> 2 ^ (एनके) एन-बिट कुंजी प्रति बिन ==> (एनके) चरण (बीएसटी) टकराव को हल करने के लिए। असल में अधिकांश हैश फ़ंक्शन बहुत कम "प्रभावी" होते हैं और कश्मीर बिट्स की तुलना में 2 ^ के डिब्बे का उत्पादन करने की आवश्यकता है / अधिक। तो यह भी आशावादी है

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

हालांकि, यह नहीं है कि कैसे / जब आप हैश तालिका का उपयोग करें!

जटिलता विश्लेषण यह मानता है कि एन-बिट कुंजी के लिए, आपको तालिका में ओ (2 ^ एन) कीज़ हो सकती है (जैसे सभी संभव कुंजी के 1/4)। लेकिन ज्यादातर अगर हम हर समय हम हैश तालिका का उपयोग नहीं करते हैं, तो हमारे पास तालिका में एन-बिट कुंजी की एक निरंतर संख्या है। यदि आप केवल तालिका में लगातार चाबियाँ चाहते हैं, तो सी अधिकतम संख्या है, तो आप ओ (सी) डिब्बे की एक हैश तालिका तैयार कर सकते हैं, जो अपेक्षाकृत निरंतर टक्कर की गारंटी देता है (एक अच्छा हैश फ़ंक्शन के साथ); और कुंजी में n बिट्स के ~ logC का उपयोग करते हुए एक हैश फ़ंक्शन। फिर हर क्वेरी O (logC) = हे (1) है इस तरह से लोगों का दावा है कि "हैश टेबल एक्सेस हे है (1)"

यहां कुछ कैच हैं – पहले, कह रहे हैं कि आपको सभी बिट की ज़रूरत नहीं है, केवल एक बिलिंग चाल हो सकती है। सबसे पहले आप वास्तव में हैश फ़ंक्शन के लिए महत्वपूर्ण मान नहीं दे सकते, क्योंकि यह उस स्मृति में n बिट्स चलाना होगा जो ओ (एन) है। तो आपको ऐसा करने की आवश्यकता है जैसे एक संदर्भ पासिंग लेकिन आपको अभी भी इसे पहले से ही स्टोर करना है जो ओ (एन) ऑपरेशन था; आप हिसिंग के लिए इसे बिल नहीं करते हैं; आप समग्र गणना कार्य इस से बच नहीं सकते। दूसरा, आप हैशिंग करते हैं, बिन ढूंढते हैं, और 1 से अधिक कुंजियां पाई जाती हैं; आपकी लागत आपके रिज़ॉल्यूशन विधि पर निर्भर करती है – यदि आप तुलना आधारित (बीएसटी या लिस्ट) करते हैं, तो आपके पास ओ (एन) ऑपरेशन होगा (रिकॉल कुंजी एन-बिट है); यदि आप 2 हैश करते हैं, ठीक है, आपके पास एक ही मुद्दा है यदि 2 हैश की टक्कर है तो ओ (1) 100% गारंटी नहीं है जब तक कि आपको कोई टकराव न हो (आप कुंजियों की तुलना में अधिक डिब्बे वाली तालिका बनाकर मौका को बेहतर बना सकते हैं, लेकिन फिर भी)।

विकल्प पर विचार करें, जैसे बीएसटी, इस मामले में। सी कुंजियां हैं, इसलिए एक संतुलित बीएसटी गहराई में ओ (लॉगसी) होगी, इसलिए एक खोज ओ (लॉग-सी) चरण लेता है हालांकि इस मामले की तुलना ओ (एन) ऑपरेशन होगी … इसलिए इस मामले में ऐसा लगता है कि हिसिंग एक बेहतर विकल्प है।