कई तकनीकें हैं जो गारंटी देती हैं कि लुकअप को हमेशा ओ (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 है।
डेटा संरचनाएं / हैश टेबल