कल्पना करें कि आप स्पॉट-ऑन चेंज होटल के अंदर एक स्मारिका दुकान के गौरवशाली मालिक हैं। कैश रजिस्टर बंद करते समय, आपको 8 यूरो की अधिकता दिखती है। ऐसा लगता है कि किसी अतिथि को सही बदलाव नहीं मिला। इससे होटल की प्रतिष्ठा धूमिल हो सकती है। इससे बचने के लिए, आप गलत बदलाव के रहस्य को सुलझाने का फैसला करते हैं। दुकान की कैश सिस्टम खोलने पर, आपको पता चलता है कि त्रुटि दो अलग-अलग खातों में हुई थी!
आप एक योजना बनाते हैं: प्रत्येक कमरे में जाएँ और मेहमानों से पूछें कि उन्हें दुकान में क्या बदला मिला है, जब तक कि आप दोनों को गलत बिल के साथ न पा लें। पहली मंजिल पर पहुँचने पर, एक मेहमान ने बताया कि उसे 4 यूरो बदले में मिले हैं। आप हिसाब लगाते हैं कि आपको एक संख्या ढूँढ़नी है, जिसे 4 यूरो में जोड़ने पर 8 मिलता है। दूसरी मंजिल पर जाने पर, मेहमान के बदले में 5 यूरो हैं। 4 + 5 का परिणाम 9 होता है, इसलिए यह यह नहीं हो सकता... पाँचवीं मंजिल, छठी... दसवीं, नहीं, नहीं, नहीं!
चूँकि आपको पहले प्रयास में मूल्य नहीं मिला, इसलिए आप दूसरी मंजिल पर जाते हैं और सभी मेहमानों से उनके बदले हुए पैसे के बारे में फिर से पूछना शुरू करते हैं ताकि आप इसकी तुलना अगली शुरुआती मंजिल से मूल्य से कर सकें, यह बहुत थकाऊ है, है न? कंप्यूटर विज्ञान में, इस खोज विधि को ब्रूट फ़ोर्स कहा जाता है, यह एक बहुत ही धीमी खोज विधि है जो सरणी में एक आइटम की तुलना निम्नलिखित लोगों के साथ करके काम करती है।
इसमें बहुत समय लगता है और यह कारगर भी नहीं है, कल्पना करें कि स्पॉट-ऑन चेंज होटल की सभी मंजिलों पर कई बार ऊपर-नीचे जाना पड़े! यह आपके लिए व्यावहारिक नहीं है और कंप्यूटर के लिए भी व्यावहारिक नहीं है।
यदि आप यह जानने के इच्छुक हैं कि किसी सॉफ्टवेयर प्रोग्राम में फर्श पर ऊपर-नीचे जाना कैसा होगा, तो जावास्क्रिप्ट में यह कुछ इस तरह दिखेगा:
twoSum(nums, target) { for (let i = 0; i < nums.length; i++) { for (let j = i + 1; j < nums.length; j++) { if (nums[i] + nums[j] === target) { return [i, j]; } } } }
स्थिति का शांतिपूर्वक आकलन करने के बाद, आपको पता चलता है कि गलत पैसे वाले दो मेहमानों को ढूंढने का एक और अधिक प्रभावी तरीका है।
आप अपने शुरुआती गणितीय अंतर्ज्ञान को परिष्कृत करते हैं कि 9 यूरो x + y के बराबर है। थोड़ा सा अंकगणित लागू करने पर, आपको पता चलता है कि: x + y = 9 यह कहने के समान है कि y = 9 — x, और यह आपकी खोज की दक्षता बढ़ाने में बहुत अंतर लाता है।
आपकी रणनीति में एक और बदलाव यह हुआ है कि अब आप एक नोटपैड लेकर मेहमानों द्वारा बताए गए मूल्यों को लिख लेंगे, ताकि आपको मेहमानों से एक ही मूल्य दो बार न पूछना पड़े, और आपको सीढ़ियों से ऊपर-नीचे जाने में पूरा दिन बर्बाद न करना पड़े। (लिफ्ट के खराब होने का यह कितना भयानक समय है!)।
नए औजारों को हाथ में लेकर आप पहली मंजिल पर जाते हैं, जहाँ एक अतिथि आपको बताता है कि उनके पास 5 यूरो का बदला हुआ पैसा है। आप इसे {5: 0} के रूप में दर्ज करते हैं, जो स्थिति 0 पर 5 के मान को दर्शाता है। समीकरण में x के स्थान पर 5 रखने पर आप y = 8–5 की गणना करते हैं, जिसके परिणामस्वरूप y = 3 होता है। चूँकि आपका नोटपैड अभी भी खाली है, इसलिए आपके पास संख्या 3 दर्ज नहीं है, जो परिणाम 8 तक पहुँचने के लिए 5 की पूरक संख्या होगी। फिर आप अपने नोटपैड पर संख्या 5 लिखते हैं (याद रखें कि हमेशा उस समय सत्यापित संख्या लिखें और उसका पूरक नहीं; आप पूरक का उपयोग केवल उस लक्ष्य संख्या से तुलना करने के लिए करेंगे जिसे आपने लिखा है)। आप दूसरे अतिथि के पास जाते हैं, जो बदले में 2 यूरो प्राप्त करने का उल्लेख करता है। सूत्र को फिर से लागू करते हुए: y = 8–2 => y = 6, आप अपना रिकॉर्ड चेक करते हैं, जहाँ आपको कोई संख्या 6 नहीं मिलती है। इस प्रकार, आप अपने रिकॉर्ड में 2 जोड़ते हैं, जो अब {5: 0, 2: 1} है। खोज जारी रखते हुए, अगले अतिथि ने बदले में 3 यूरो प्राप्त करने की रिपोर्ट की। आप फिर से गणना करते हैं: y = 8–3 => y = 5. बिंगो! आपके नोटपैड पर 5 दर्ज है! फ़्लोर 0 का अतिथि फ़्लोर 2 के अतिथि का पूरक है! इस दृष्टिकोण को हैश टेबल के रूप में जाना जाता है, और यह आपके और कंप्यूटर दोनों के लिए बहुत तेज़ और कुशल है। जावास्क्रिप्ट में, इसे निम्न प्रकार से लागू किया जाएगा:
twoSum(nums, target) { const myTable = {}; for (let i = 0; i < nums.length; i++) { const complementaryNumber = target - nums[i]; if (complementaryNumber in myTable) { return [i, myTable[complementaryNumber]]; } myTable[nums[i]] = i; } }
यह Leetcode की एक आसान समस्या है जो तभी आसान हो जाती है जब आप इसके पीछे की अवधारणाओं को समझ लेते हैं। मेरा सुझाव है कि आप इस समस्या को अपने आप हल करने का प्रयास करें और इसके पीछे अंतर्ज्ञान बनाने की कोशिश में कुछ समय बिताएँ, अपना खुद का सादृश्य बनाएँ, समीक्षा करें और समाधान पर आगे बढ़ने से पहले छद्म कोड लिखने का प्रयास करें।
मुझे आशा है कि मेरे उदाहरण से आपको दो योग चुनौती के पीछे की अवधारणाओं को बेहतर ढंग से समझने में मदद मिली होगी।
आपसे अगली बार मिलेंगे!