कार्य स्पष्ट रूप से एक एल्गोरिथ्म को खोजने के लिए है जो संख्याओं की आवश्यक सूची की लंबाई एन में ओ (1) है। इसलिए इससे कोई फर्क नहीं पड़ता कि आपको शीर्ष 100 नंबर या 10000 नंबर की आवश्यकता है, प्रविष्टि का समय ओ (1) होना चाहिए।
यहाँ ट्रिक यह है कि हालांकि ओ (1) आवश्यकता को सूची सम्मिलित करने के लिए उल्लेख किया गया है, इस सवाल ने पूरे नंबर स्थान में खोज समय के क्रम के बारे में कुछ नहीं कहा, लेकिन यह निकला कि इसे O (1) बनाया जा सकता है। भी। समाधान इस प्रकार है:
मानों के लिए लिंक की गई सूचियों की कुंजियों और जोड़े के लिए संख्याओं वाले हैशटेबल की व्यवस्था करें। पॉइंटर्स की प्रत्येक जोड़ी एक लिंक किए गए सूची अनुक्रम का प्रारंभ और अंत है। यह आम तौर पर सिर्फ एक तत्व होगा फिर अगला। लिंक की गई सूची में प्रत्येक तत्व अगले उच्चतम संख्या वाले तत्व के बगल में जाता है। लिंक की गई सूची में इस प्रकार आवश्यक संख्याओं का क्रमबद्ध अनुक्रम शामिल है। सबसे कम संख्या का रिकॉर्ड रखें।
रैंडम स्ट्रीम से नया नंबर x लें।
क्या यह पिछले दर्ज की गई सबसे कम संख्या से अधिक है? हां => चरण 4, नहीं => चरण 2
बस ली गई संख्या के साथ हैश तालिका मारो। क्या कोई प्रविष्टि है? हां => चरण 5। नहीं => एक नया नंबर x-1 लें और इस चरण को दोहराएं (यह एक सरल नीचे की ओर रैखिक खोज है, बस यहां मेरे साथ रहें, इससे सुधार किया जा सकता है और मैं समझाऊंगा कि कैसे)
बस हैश टेबल से प्राप्त सूची तत्व के साथ, लिंक की गई सूची में तत्व के बाद नया नंबर डालें (और हैश को अपडेट करें)
दर्ज की गई सबसे कम संख्या को लें (और इसे हैश / सूची से हटा दें)।
बस ली गई संख्या के साथ हैश तालिका मारो। क्या कोई प्रविष्टि है? हां => चरण 8. नहीं => एक नया नंबर l + 1 लें और इस चरण को दोहराएं (यह एक सरल उर्ध्व रेखीय खोज है)
एक सकारात्मक हिट के साथ यह संख्या सबसे नई संख्या बन जाती है। चरण 2 पर जाएं
डुप्लिकेट मान के लिए अनुमति देने के लिए हैश को वास्तव में डुप्लिकेट वाले तत्वों की लिंक की गई सूची के प्रारंभ और अंत को बनाए रखने की आवश्यकता होती है। दी गई कुंजी पर एक तत्व जोड़ना या हटाना इस प्रकार इंगित की गई सीमा को बढ़ाता या घटाता है।
यहाँ सम्मिलित हे (1) है। उल्लिखित खोजें हैं, मुझे लगता है कि कुछ है, ओ (संख्याओं के बीच औसत अंतर)। औसत अंतर संख्या स्थान के आकार के साथ बढ़ता है, लेकिन संख्याओं की सूची की आवश्यक लंबाई के साथ घट जाती है।
तो रैखिक खोज की रणनीति बहुत खराब है, यदि संख्या स्थान बड़ा है (उदाहरण के लिए 4 बाइट इंट प्रकार के लिए, 0 से 2 ^ 32-1) और एन = 100। इस प्रदर्शन समस्या को हल करने के लिए, आप उपयुक्त कुंजी बनाने के लिए हैशटैब के समानांतर सेट रख सकते हैं, जहाँ संख्याएँ उच्च परिमाण (जैसे 1s, 10s, 100s, अधिकतम) पर गोल हैं। इस तरह आप आवश्यक खोजों को अधिक तेज़ी से करने के लिए गियर को ऊपर और नीचे कर सकते हैं। प्रदर्शन तब O (लॉग संख्या) हो जाता है, मुझे लगता है, जो निरंतर है, अर्थात O (1) भी।
इसे स्पष्ट करने के लिए, कल्पना करें कि आपके पास 197 नंबर है। आपने १० ’हैश टेबल पर hit 190’ मारा, यह निकटतम दस के लिए गोल है। कुछ भी? नहीं, तो आप 10 एस में नीचे जाते हैं जब तक आप कहते हैं कि 120। तब आप 1 एस हैशटेबल में 129 पर शुरू कर सकते हैं, फिर 128, 127 की कोशिश करें जब तक आप कुछ हिट न करें। अब आपने पाया है कि 197 नंबर डालने के लिए लिंक की गई सूची में। इसे डालते समय, आपको 1s हैशटेबल को 197 प्रविष्टि, 10 नंबर हैशटेबल के साथ 190 नंबर, 100 के साथ 100 नंबर, आदि के साथ अपडेट करना होगा। आपको कभी भी यहाँ करना होगा, संख्या सीमा के 10 गुना लॉग।
हो सकता है कि मुझे कुछ विवरण गलत लगे हों, लेकिन चूंकि यह प्रोग्रामर एक्सचेंज है, और संदर्भ साक्षात्कार था, मुझे आशा है कि उपरोक्त उस स्थिति के लिए एक पर्याप्त जवाब है।
EDIT I ने समांतर हैशटेबल स्कीम की व्याख्या करने के लिए यहां कुछ अतिरिक्त विवरण जोड़े और इसका अर्थ है कि मेरे द्वारा उल्लिखित खराब रैखिक खोजों को O (1) खोज से बदला जा सकता है। मैंने यह भी महसूस किया है कि निश्चित रूप से अगले निम्नतम संख्या की खोज करने की कोई आवश्यकता नहीं है, क्योंकि आप सबसे कम संख्या के साथ हैशटेबल में देख कर सीधे अगले चरण पर जा सकते हैं और अगले तत्व पर आगे बढ़ सकते हैं।