जो का जवाब बेहद अच्छा है, और आपको सभी महत्वपूर्ण कीवर्ड देता है।
आपको पता होना चाहिए कि सक्सेस डेटा स्ट्रक्चर रिसर्च अभी भी एक प्रारंभिक चरण में है, और कई परिणाम काफी हद तक सैद्धांतिक हैं। प्रस्तावित डेटा संरचनाओं में से कई को लागू करने के लिए काफी जटिल हैं, लेकिन अधिकांश जटिलता इस तथ्य के कारण है कि आपको ब्रह्मांड के आकार और संग्रहीत तत्वों की संख्या दोनों पर असममित जटिलता बनाए रखने की आवश्यकता है। यदि इनमें से कोई एक अपेक्षाकृत स्थिर है, तो बहुत सारी जटिलता दूर हो जाती है।
यदि संग्रह अर्ध-स्थिर है (जो कि आवेषण दुर्लभ हैं, या कम से कम कम मात्रा में है), तो यह निश्चित रूप से एक आसान-स्थैतिक डेटा संरचना को लागू करने पर विचार करने के लायक है (सदकेन का सदर एक ठीक विकल्प है) एक अद्यतन के साथ संयोजन के रूप में कैश। असल में, आप एक पारंपरिक डेटा संरचना (जैसे बी-ट्री, ट्राइ, हैश टेबल) में अपडेट रिकॉर्ड करते हैं, और समय-समय पर "मुख्य" डेटा संरचना को अपडेट करते हैं। सूचना पुनर्प्राप्ति में यह एक बहुत लोकप्रिय तकनीक है, क्योंकि उल्टे अनुक्रमितों को खोजने के कई फायदे हैं लेकिन इन-प्लेस को अपडेट करना कठिन है। यदि यह मामला है, तो कृपया मुझे एक टिप्पणी में बताएं और मैं आपको कुछ संकेत देने के लिए इस उत्तर में संशोधन करूंगा।
यदि आवेषण अधिक बार होते हैं, तो मैं सुझाव देता हूं कि हैशटैंग हैशिंग। मूल विचार यहाँ समझाने के लिए पर्याप्त सरल है, इसलिए मैं ऐसा करूँगा।
तो मूल जानकारी सिद्धांतात्मक परिणाम यह है कि यदि आप आइटम के एक ब्रह्मांड से तत्वों को संग्रहीत कर रहे हैं , और कोई अन्य जानकारी नहीं है (उदाहरण के तत्वों के बीच कोई संबंध नहीं है) तो आपको इसे स्टोर करने के लिए बिट्स। (सभी लघुगणक आधार -2 जब तक अन्यथा निर्दिष्ट कर रहे हैं।) आप की जरूरत है इस कितने बिट। इसके आसपास कोई रास्ता नहीं है।nयूलॉग(यूn) +ओ(1)
अब कुछ शब्दावली:
- यदि आपके पास एक डेटा संरचना है, जो डेटा को संग्रहीत कर सकती है और आपके कार्यों को बिट्स स्पेस में सपोर्ट करती है, तो हम इसे एक अंतर्निहित डेटा संरचना कहते हैं।लॉग(यूn) +ओ(1)
- यदि आपके पास एक डेटा संरचना है, जो डेटा को संग्रहीत कर सकती है और आपके स्थान के बिट्स , हम इसे एक कॉम्पैक्ट डेटा संरचना कहते हैं। ध्यान दें कि व्यवहार में इसका मतलब है कि सापेक्ष ओवरहेड (सैद्धांतिक न्यूनतम के सापेक्ष) एक स्थिर के भीतर है। यह 5% ओवरहेड या 10% ओवरहेड या 10 गुना ओवरहेड हो सकता है।लॉग(यूn) +ओ(लॉग करें(यूn) )=(1+O(1))लॉग(यूn)
- यदि आपके पास एक डेटा संरचना है, जो डेटा को संग्रहीत कर सकती है और में अपने संचालन का समर्थन करती है स्थान के बिट्स , हम इसे एक सक्सेसफुल डेटा स्ट्रक्चर कहते हैं।लॉग(यूn) +ओ(लॉग करें(यूn) ) = ( 1 + ओ ( 1 ) ) लॉग(यूn)
सक्सेस और कॉम्पैक्ट के बीच का अंतर थोड़ा-ओह और बड़ा-ओह के बीच का अंतर है। एक पल के लिए निरपेक्ष मूल्य की अनदेखी ...
- जी( n ) = ओ ( एफ)( n ) ) अर्थ है कि एक निरंतर और संख्या ऐसा है जो सभी , ।सीn0n >n0जी( एन ) < ग ⋅ च( एन )
- जी( n ) = ओ ( एफ)( n) ) अर्थ है कि सभी स्थिरांक लिए एक संख्या मौजूद है जैसे कि सभी , ।सीn0n >n0जी( एन ) < ग ⋅ च( एन )
अनौपचारिक रूप से, बड़े-ओह और छोटे-ओह दोनों "एक स्थिर कारक के भीतर" हैं, लेकिन बड़े-ओह के साथ निरंतर आपके लिए चुना जाता है (एल्गोरिथ्म डिजाइनर, सीपीयू निर्माता, भौतिकी के नियम या जो भी हो), लेकिन थोड़ा के साथ -जब आप खुद को लगातार उठाते हैं और यह आपकी तरह छोटा हो सकता है । इसे दूसरे तरीके से रखने के लिए, रसीला डेटा संरचनाओं के साथ, समस्या के आकार में वृद्धि के रूप में सापेक्ष ओवरहेड मनमाने ढंग से छोटा हो जाता है।
बेशक, समस्या का आकार आपके द्वारा इच्छित रिश्तेदार उपरि को महसूस करने के लिए बहुत बड़ा हो सकता है, लेकिन आपके पास सब कुछ नहीं हो सकता है।
ठीक है, हमारे बेल्ट के नीचे, चलो समस्या पर कुछ नंबर डालते हैं। चलो माना जाता है कि कुंजियाँ बिट पूर्णांक हैं (इसलिए ब्रह्मांड का आकार ), और हम इन पूर्णांकों के को संग्रहीत करना चाहते हैं। चलिए मान लेते हैं कि हम जादुई रूप से पूर्ण अधिभोग और अपव्यय के साथ एक आदर्शित हैश तालिका की व्यवस्था कर सकते हैं, ताकि हमें हैश स्लॉट की आवश्यकता हो।n2n2m2m
एक लुकअप ऑपरेशन में -bit की हैश होगी , हैश स्लॉट्स को खोजने के लिए बिट्स से नकाब हटाएं , और फिर यह देखें कि टेबल की वैल्यू कुंजी से मेल खाती है या नहीं। अब तक सब ठीक है।nm
ऐसी हैश तालिका बिट का उपयोग करती है। क्या हम इससे बेहतर कर सकते हैं?n2m
मान लीजिए कि हैश फंक्शन उलटा है। फिर हमें प्रत्येक हैश स्लॉट में पूरी कुंजी संग्रहीत करने की आवश्यकता नहीं है। हैश स्लॉट का स्थान आपको हैश मान के बिट्स देता है , इसलिए यदि आप केवल शेष बिट्स संग्रहीत करते हैं , तो आप उन दो टुकड़ों की जानकारी (हैश स्लॉट स्थान और वहां संग्रहीत मूल्य) से कुंजी को फिर से संगठित कर सकते हैं। तो आपको केवल बिट्स स्टोरेज की आवश्यकता होगी।hmn−m(n−m)2m
यदि , साथ तुलना में छोटा है , तो स्टर्लिंग का अनुमान और थोड़ा अंकगणित (प्रमाण एक अभ्यास है!) से पता चलता है कि2m2n
(n−m)2m=log(2n2m)+o(log(2n2m))
इसलिए यह डेटा संरचना सक्सेज है।
हालांकि, दो कैच हैं।
पहला कैच "अच्छा" उल्टे हैश फ़ंक्शन का निर्माण कर रहा है। सौभाग्य से, यह दिखने में जितना आसान है; क्रिप्टोग्राफ़र हर समय उल्टे कार्य करते हैं, केवल उन्हें "साइबर" कहते हैं। उदाहरण के लिए, आप Feistel नेटवर्क पर एक हैश फ़ंक्शन को आधार बना सकते हैं, जो कि गैर-इनवर्टेबल हैश फ़ंक्शन से एक इनवर्टेड हैश फ़ंक्शन का निर्माण करने का एक सीधा तरीका है।
दूसरा कैच यह है कि असली हैश टेबल आदर्श नहीं है, बर्थडे विरोधाभास के लिए धन्यवाद। इसलिए आप अधिक परिष्कृत प्रकार की हैश तालिका का उपयोग करना चाहते हैं, जो आपको बिना किसी स्पिलिंग के पूर्ण अधिभोग के करीब ले जाती है। कोयल हैशिंग इस के लिए एकदम सही है, क्योंकि यह आपको सिद्धांत रूप में आदर्श के करीब, और व्यवहार में काफी करीब आने देती है।
कोयल हैशिंग को कई हैश फ़ंक्शन की आवश्यकता होती है, और इसके लिए आवश्यक है कि हैश स्लॉट में उन मूल्यों को टैग किया जाए जिनके साथ हैश फ़ंक्शन का उपयोग किया गया था। इसलिए यदि आप चार हैश फ़ंक्शन का उपयोग करते हैं, उदाहरण के लिए, आपको प्रत्येक हैश स्लॉट में एक अतिरिक्त दो बिट्स संग्रहीत करने की आवश्यकता है। यह अभी भी रूप में बढ़ता है, इसलिए यह व्यवहार में कोई समस्या नहीं है, और अभी भी पूरे कुंजियों को संचयित करता है।m
ओह, आप वैन एम्ड बोआस पेड़ों को देखना चाहते हैं।
अधिक जानकारी
यदि कहीं आसपास , तो लगभग , इसलिए (एक बार फिर) यह मानकर कि मूल्यों के बीच कोई और संबंध नहीं है, आप मूल रूप से कोई भी नहीं कर सकते हैं थोड़ा वेक्टर से बेहतर है। आप ध्यान दें कि ऊपर दिया गया हैशिंग समाधान उस मामले को प्रभावी ढंग से कम करता है (आप एक हैश स्लॉट के अनुसार एक बिट भंडारण), लेकिन यह हैश फ़ंक्शन का उपयोग करने के बजाय कुंजी को पते के रूप में उपयोग करने के लिए सस्ता है।nu2log(un)u
यदि , बहुत समीप है , तो सभी सक्सेसफुल डेटा स्ट्रक्चर्स लिटरेचर आपको डिक्शनरी के अर्थ को पलटने की सलाह देता है। उन मानों को संग्रहीत करें जो सेट में नहीं होते हैं। हालाँकि, अब आपको प्रभावी रूप से डिलीट ऑपरेशन का समर्थन करना है, और सक्सेसफुल व्यवहार को बनाए रखने के लिए आपको डेटा संरचना को सिकोड़ने में सक्षम होने की आवश्यकता है क्योंकि अधिक एलिमेंट्स को "जोड़ा" जाता है। हैश टेबल का विस्तार एक अच्छी तरह से समझा गया ऑपरेशन है, लेकिन इसे अनुबंधित करना नहीं है।nu