किस प्रकार के डेटा के लिए हैश टेबल संचालन O (1) हैं?


18

(कब) के जवाब से हैश टेबल लुकअप O (1) है? , मैं इकट्ठा करता है कि हैश टेबल में सबसे खराब स्थिति वाला व्यवहार है, कम से कम परिशोधन, जब डेटा कुछ सांख्यिकीय स्थितियों को संतुष्ट करता है, और इन स्थितियों को व्यापक बनाने में मदद करने के लिए तकनीकें हैं।O(1)

हालाँकि, एक प्रोग्रामर के दृष्टिकोण से, मुझे पहले से पता नहीं है कि मेरा डेटा क्या होगा: यह अक्सर किसी न किसी बाहरी स्रोत से आता है। और मेरे पास शायद ही कभी एक साथ सभी डेटा होते हैं: अक्सर सम्मिलन और विलोपन एक दर पर होते हैं जो कि लुकअप की दर से बहुत नीचे नहीं होते हैं, इसलिए हैश फ़ंक्शन को ठीक करने के लिए डेटा को प्रीप्रोसेस करना बाहर है।

इसलिए, एक कदम उठाते हुए: डेटा स्रोत के बारे में कुछ ज्ञान दिया, मैं यह कैसे निर्धारित कर सकता हूं कि क्या हैश तालिका में संचालन होने का मौका है , और संभवतः मेरे हैश फ़ंक्शन पर कौन सी तकनीक का उपयोग करना है?O(1)


ओह, और हैश टेबल बनाम बाइनरी पेड़ संबंधित हैं, लेकिन यहां मैं हैश टेबल पर ध्यान केंद्रित कर रहा हूं और जब वे अपने सबसे अच्छे रूप में (या नहीं) हैं।
गिल्स एसओ- बुराई को रोकें '

किसी भी हैश-फ़ंक्शन के लिए सबसे अच्छा मामला तब होता है जब डेटा समान रूप से वितरित किया जाता है।
0x0

@ सुनील: सच नहीं। आपके पास हैश फ़ंक्शंस हो सकते हैं।
राफेल

मुझे लगता है कि यह सवाल बहुत व्यापक है। विशेष रूप से, क्या आप समझ सकते हैं कि डेटा स्रोतों के बारे में ज्ञान कैसा दिखेगा?
राफेल

@ राफेल उदाहरण के लिए, यदि कुंजी तार हैं: लोगों के नाम, एक निर्देशिका में फ़ाइल नाम, XML टैग, फ़ाइल हैश, ...
गाइल्स का SO- बुराई होने पर रोकें '

जवाबों:


4

कई तकनीकें हैं जो गारंटी देती हैं कि लुकअप को हमेशा ओ (1) संचालन की आवश्यकता होगी, यहां तक ​​कि सबसे खराब स्थिति में भी।

मैं कैसे निर्धारित कर सकता हूं कि क्या हैश तालिका में ओ (1) संचालन होने का मौका है, और संभवत: मेरे हैश फ़ंक्शन पर कौन सी तकनीक का उपयोग करना है?

सबसे खराब स्थिति तब होती है जब कुछ दुर्भावनापूर्ण हमलावर (Mallory) आपको जानबूझकर डेटा देता है जिसे Mallory ने विशेष रूप से सिस्टम को धीमा करने के लिए चुना है।

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

सभी तकनीकें जो "ओ (1) सबसे खराब स्थिति में भी देखने की गारंटी देती हैं" इस समस्या से बचने के लिए प्रत्येक प्रविष्टि पर थोड़ा अतिरिक्त काम करके इस समस्या से बचते हैं, भविष्य में, हर संभव लुक ओ (1) समय में सफल हो सकते हैं। । विशेष रूप से, हम मानते हैं (सबसे खराब स्थिति) कि मैलोरी जल्दी या बाद में पता चलेगा कि हम किस हैश फ़ंक्शन का उपयोग कर रहे हैं; लेकिन उन्हें केवल कुछ डेटा आइटम सम्मिलित करने का मौका मिलता है, इससे पहले कि हम एक अलग हैश फ़ंक्शन - सारणीयन हैशिंग या कुछ अन्य सार्वभौमिक हैशिंग को चुनते हैं - एक जिसे हम विशेष रूप से इस तरह का चयन करते हैं कि हमारे पास अब तक के सभी डेटा 2 में देखे जा सकते हैं या 3 जांच - यानी, ओ (1)। क्योंकि हम बेतरतीब ढंग से इस फ़ंक्शन का चयन करते हैं, इसलिए हम यह सुनिश्चित कर सकते हैं कि Mallory को यह पता नहीं चलेगा कि हमने कुछ समय के लिए कौन सा फ़ंक्शन चुना है। भले ही मैलोरीतुरंत हमें वह डेटा प्रदान करता है, जो इस नए हैश फ़ंक्शन के साथ भी होता है, पिछले डेटा से टकराता है, हम फिर एक और नया हैश फ़ंक्शन ले सकते हैं, जैसे कि, नए डेटा को पुनः प्राप्त करने के बाद, वह और बाकी सभी जो हमें खिलाया गया है, उसे अब देखा जा सकता है। सबसे खराब स्थिति में 2 या 3 जांच में - यानी, ओ (1) सबसे खराब स्थिति में दिखता है।

बेतरतीब ढंग से एक नए हैश फ़ंक्शन का चयन करना काफी आसान है और पूरी तालिका को अक्सर यह गारंटी देने के लिए पर्याप्त है कि प्रत्येक लुकअप हमेशा O (1) है। हालांकि यह गारंटी देता है कि प्रत्येक लुकअप हमेशा O (1) है, ये तकनीकें, जब Nth आइटम को हैश टेबल में सम्मिलित करना जिसमें पहले से ही N-1 आइटम शामिल हैं, कभी-कभी उस प्रविष्टि के लिए O (N) समय की आवश्यकता हो सकती है। हालांकि, इस तरह की प्रणाली को डिजाइन करना संभव है, तब भी जब मैलोरी जानबूझकर आपको नया डेटा देती है, नए हैश फ़ंक्शन का उपयोग करते हुए, पिछले डेटा के साथ टकराती है, सिस्टम को मॉलोरी से बहुत सी वस्तुओं को स्वीकार कर सकता है और अन्य को इससे पहले कि यह करने की आवश्यकता है पूर्ण O (N) पुनर्निर्माण। ओ (1) लुक्स की गारंटी देने के लिए हैश-टेबल तकनीक, जो नए-फंक्शन और रिहैस को चुनती है, यहां तक ​​कि सबसे खराब स्थिति में भी शामिल हैं:

  • कोयल हैशिंग की गारंटी है कि प्रत्येक कुंजी लुकअप 2 हैश गणना और 2 टेबल लुकअप के साथ सफल होता है।
  • hopscotch हैशिंग ने गारंटी दी है कि तालिका में छोटी संख्या एच (शायद एच = 32) लगातार प्रविष्टियों का निरीक्षण करने के बाद प्रत्येक कुंजी लुकअप सफल होता है।
  • डायनेस्टीफ़ेलबिंगर द्वारा डायनामिक परफेक्ट हैशिंग - 1994 का पहला पेपर जो मैंने पढ़ा है वह यह है कि भले ही यह "अक्सर" दोहराता है, यह गारंटी देने के लिए कि प्रत्येक कुंजी लुकअप हमेशा 2 हैश गणना और 2 लुकअप के साथ सफल होता है, यह संभव है। एक पूर्ण पुनर्वसन करने के लिए शायद ही कभी ऐसा होता है कि भले ही प्रत्येक पूर्ण पुनर्भरण O (n) समय का उपयोग करता है, सम्मिलन और विलोपन की अपेक्षित औसत लागत O (1) amortized है।

डेटा संरचनाएं / हैश टेबल



5

हैश टेबल लुकअप हमेशा स्टैटिक सेट्स के लिए हो सकता है , Arne Andersson और Mikkel Thorup द्वारा 2002 का पेपर देखें: घातीय खोज पेड़ों के साथ डायनेमिक ऑर्डर किए गए सेटO(1)

O(1)O(n2W)

O(logn/loglogn)O(1)


5

ha,b(x)=ax+bmodp

अतीत में, क्रोस्बी और वलाक द्वारा यूज़निक्स के एक पेपर के अनुसार , आम प्रोग्रामिंग भाषाओं ने ऐसा कुछ नहीं किया, जिससे बहुत सारे वेब ऐप (और अन्य सर्वर) विनिर्माण टकरावों के आधार पर एक DoS हमले के लिए खुले। (कागज 2003 से है, लेकिन यह बताता है कि डैन बर्नस्टीन ने एक ही विचार को काफी पहले ही खोज लिया था।)

एक त्वरित Google खोज यह दावा करती है कि कार्यान्वयन के मामले में कला की स्थिति में सुधार हुआ है और सुधार नहीं हुआ है

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


0

हैश-टेबल के लिए औसत-केस विश्लेषण इनपुट की एकरूपता की सामान्य धारणा के तहत किया जाता है, जो एक बार ओटम के रेजर के कारण बनता है।

यदि आपके पास डोमेन और कुंजियों के वितरण के बारे में अतिरिक्त जानकारी है, तो आप एक ही औसत-केस विश्लेषण ले सकते हैं और अपने वितरण के साथ समान वितरण को प्रतिस्थापित कर सकते हैं और अपेक्षाओं को कम कर सकते हैं, कम से कम सिद्धांत में।

बेशक कठिनाई इस तथ्य से उपजी है कि गैर-समान एवरेज-केस विश्लेषण 'करना मुश्किल है। और आपका "ज्ञान" एक वितरण के रूप में आसानी से व्यक्त नहीं किया जा सकता है जो इस तरह के विश्लेषण में आसानी से उपयोग किया जा सकता है।

जाहिर है सबसे आसान काम सिमुलेशन हैं। हैश-तालिकाओं को लागू करें और इनपुट के अपने विशिष्ट सेट के लिए वे कैसे प्रदर्शन करते हैं।


8
मुझे पहले वाक्य से असहमत होना है। मानक धारणा है कि हैश फ़ंक्शन यादृच्छिक है, इनपुट डेटा नहीं। समान रूप से वितरित डेटा को मानते हुए विश्लेषण को फंतासी के दायरे में धकेल दिया जाता है - वास्तविक दुनिया डेटा कभी भी एक समान नहीं होता है! लेकिन हैश फ़ंक्शंस को समान रूप से समान बनाने के लिए पाठ्यपुस्तक तकनीकें हैं। देखें सार्वभौमिक हैशिंग और विशेष रूप से सारणीकरण हैशिंग
जेफ ई

@ जेफ राफेल के जवाब में औसत-मामले के विश्लेषण को देखें वह इस एकरूपता की धारणा को बताता है। आप वितरण के बिना औसत-केस विश्लेषण नहीं कर सकते। आपको एक चुनना होगा और यदि गैर दिया जाता है, तो संकट के रेजर एक समान होने का सुझाव देते हैं।
उली

6
बेशक आपके पास एक वितरण है; यह वह वितरण है जिसका उपयोग आप हैश फ़ंक्शन को चुनने के लिए करते हैं। इनपुट डेटा के लिए वितरण चुनना लैम्पपोस्ट के तहत अपनी खोई हुई चाबियों की तलाश करने जैसा है; यकीन है, प्रकाश बेहतर है, लेकिन वह शायद नहीं है जहां आपने उन्हें गिरा दिया।
जेफ ई

@ जेफ़ई यह है कि एक औसत-केस एनाल्जेसिस कैसे किया जाता है, एक वितरण चुनें और गणना शुरू करें। हमेशा की तरह वितरण का विकल्प बहस का मुद्दा है। गैर-समान औसत-केस विश्लेषण करने के लिए आपका बहुत स्वागत है।
औली

4
हां, मुझे पता है कि यह कैसे किया जाता है। (मेरी प्रोफ़ाइल की जाँच करें।) यदि आप चाहते हैं कि आपका विश्लेषण भविष्य कहनेवाला हो (जो विश्लेषण का पूरा बिंदु है), तो आपको हैश फ़ंक्शन को यादृच्छिक करना होगा। फिर आप सटीक वितरण जानते हैं, क्योंकि आपने इसे चुना है।
जेफ ई

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.