आपको एक फ़ाइल दी जाती है जिसमें 32-बिट आर्किटेक्चर पर सभी संभावित नंबर होते हैं। उस फ़ाइल से 4 नंबर गायब हैं। 4 लापता संख्याओं का पता लगाएं


22

यह एक साक्षात्कार प्रश्न है जिसे मैंने कुछ समय के लिए चलाया है, और मुझे वास्तव में यकीन नहीं है कि इसे कैसे हल किया जाए कि चार नंबर गायब हैं। मैं एक या दो नंबर खोजने के लिए एल्गोरिदम से परिचित हूं, लेकिन मैं चार में से किसी को भी सामान्य बनाने का तरीका नहीं देखता।


जवाबों:


19

चाहे वह एक साक्षात्कार या वास्तविक काम के लिए हो, आपकी पहली प्राथमिकता एक काम करने वाला समाधान होना चाहिए जो आपके लिए महत्वपूर्ण हो । यही कारण है कि आम तौर पर आप और आसान के लिए पहला समाधान आपको लगता है कि सरल है के बारे में सोच सकते हैं की पेशकश करनी चाहिए इसका मतलब है आप को समझाने के लिए।

मेरे लिए, इसका मतलब है कि संख्याओं को क्रमबद्ध करें और अंतराल के लिए स्कैन करें। लेकिन, मैं बिजनेस सिस्टम और वेब एप पर काम करता हूं। मैं बिट्स के साथ बेला नहीं करता, और मैं अपनी टीम को नहीं चाहता!

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

और फिर, किसी भी तरह से - भले ही आप "गलत" समाधान देते हैं, अगर आपका साक्षात्कारकर्ता (या बॉस!) इसके लिए दबाव डालता है , तो आप प्रबंधक के चिंता के विशिष्ट क्षेत्र पर ध्यान केंद्रित करते हुए कुछ सुधार या विकल्प सुझा सकते हैं।

  • गंभीर रूप से सीमित रैम? 512MB से कम?
    इसे डिस्क पर जगह में सॉर्ट करें। आप सॉर्ट किए गए ब्लॉक को ऑप्टिमाइज़ करने और / या बफर करने के लिए रैम की ज्यादातर-मनमानी राशि का उपयोग कर सकते हैं।
  • सीमित समय?
    उस RAM का उपयोग करें! छँटाई पहले से है O(n*log(n))। (या O (n) पूर्णांक-बाल्टी सॉर्ट के लिए!)
  • रख-रखाव की?
    क्या छँटाई से आसान हो सकता है ?!
  • बिट झंडे / फ़ील्ड का ज्ञान प्रदर्शित नहीं करता है? ( BitSet/ BitMap/ BitArray)
    ठीक है ... आगे बढ़ो और BitArray"पाया संख्या" को चिह्नित करने के लिए एक का उपयोग करें । और फिर स्कैन के लिए है 0
  • भविष्यवाणी "वास्तविक समय" जटिलता?
    बिटमैप समाधान का उपयोग करें। यह फ़ाइल के ऊपर एक सिंगल पास है औरBitArray/BitSet(0'खोजने के लिए)पर एक और पास है। यही कारण है कि केO(n), मुझे लगता है!

जो कुछ भी।

उन चिंताओं का समाधान करें जो आपके पास वास्तव में हैं। यदि आवश्यक हो, तो केवल भोले समाधान का उपयोग करके, पहले समस्या को हल करें। हर किसी का समय बर्बाद न करें जो अभी तक मौजूद चिंताओं को संबोधित नहीं करता है।


मैं एक भोले दृष्टिकोण के साथ 4 बिलियन नंबरों को छांटने की व्यवहार्यता के बारे में इतना निश्चित नहीं हूं, अकेले डिस्क पर। हालांकि, कभी कोशिश नहीं की।
Eiko

1
@ ईको वेल ... और फिर, मुख्य बिंदु यह है ... चीजों को अधिक जटिल न करें। पहला कदम सिर्फ समस्या को हल करना है, किसी भी तरह से आप इसे हल करने के लिए सोच सकते हैं, भले ही यह भोला हो। मैं आपके भविष्य के नियोक्ता की हताशा के स्तर पर भी जोर नहीं दे सकता हूं यदि आप यह सुनिश्चित करने के लिए समय व्यतीत कर रहे हैं कि आपके पास "सही" समाधान है जब व्यवसाय को बस समाधान की आवश्यकता होती है । साबित करो कि तुम दोनों कर सकते हैं! साबित करें कि आप समस्याओं को जल्दी से हल कर सकते हैं, और फिर जरूरत के अनुसार रीफैक्टरिंग और / या अनुकूलन के लायक संभावित समस्याओं की पहचान कर सकते हैं
svidgen

1
@ इवान "क्योंकि आपके पास सवाल यह है कि साक्षात्कार पर आया था" के रूप में ही नहीं है, "एक विशिष्ट जवाब है जिसे प्रत्येक प्रबंधक ढूंढ रहा है।" ... मुझे निश्चित रूप से परवाह नहीं है कि आपने मुझे क्या समाधान दिया है, जब तक आपने समस्या को हल करने की क्षमता का प्रदर्शन किया है और समस्याओं को हल नहीं किया है, मैंने कभी भी आपको नहीं देखा है!
21

1
आप बात याद कर रहे हैं। यह सवाल और इसकी विविधताएं प्रोग्रामिंग पहेलियों और साक्षात्कार सवालों की पुस्तकों में होती हैं। यह सवाल पूछने वाले व्यक्ति द्वारा नहीं बनाया गया है। 32 बिट का सामान माना जाता है कि यह संख्याओं को ट्रैक करके या छाँटकर रखना असंभव है। यह लिखने के बाद से ही इसके कंप्यूटर तेज / बड़े हो गए हैं।
इवान

1
@ ईवान: आप अभी भी मान रहे हैं कि आपके प्रश्न के उदाहरण में ओपी के समान अवरोध हैं। ओपी ने यह नहीं कहा कि उनके एल्गोरिथ्म को 32 बिट मशीन पर चलना है, उन्होंने यह भी नहीं कहा कि इसे कंप्यूटर पर चलाना है, एक वैचारिक एल्गोरिथ्म उपयुक्त हो सकता है। वह यह भी नहीं बताता है कि "सभी संभावित संख्याओं" का मतलब क्या है, क्योंकि 8-बिट माइक्रोकंट्रोलर पर मनमाने आकार के पूर्णांक गणित संभव है। बहुत सारी धारणाएँ जो आप पूर्ण बयान दे रहे हैं।
whatsisname

19

चूंकि यह एक फाइल है, इसलिए मैं मान रहा हूं कि आपको कई पास बनाने की अनुमति है। पहले 256 काउंटरों की एक सरणी बनाएं, फ़ाइल पर पुनरावृत्त करें और प्रत्येक नंबर के लिए नंबर के पहले बाइट के रूप में अनुक्रमित काउंटर को बढ़ाएं। जब आप कर रहे हैं, तो अधिकांश काउंटर 2 ^ 24 पर होने चाहिए, लेकिन 1 से 4 काउंटरों पर कम मान होना चाहिए। इन सूचकांकों में से प्रत्येक लापता संख्याओं में से एक की पहली बाइट का प्रतिनिधित्व करता है (यदि 4 से कम है तो क्योंकि कई लापता संख्या एक ही पहली बाइट साझा करते हैं)।

इन सभी सूचकांकों के लिए, 256 काउंटरों का एक और सरणी बनाएं, और फ़ाइल पर दूसरा पास बनाएं। इस बार, यदि पहली बाइट पहले से मानों में से एक है, तो दूसरी बाइट के आधार पर इसमें सरणी में एक काउंटर बढ़ाएँ। जब आप कर लिए जाते हैं, तो 2 ^ 16 से कम काउंटरों के लिए फिर से देखें, और आपके पास लापता संख्याओं का दूसरा बाइट होगा, प्रत्येक इसे पहले बाइट से मेल खाता है।

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

समय जटिलता - O(n * log n)
अंतरिक्ष जटिलता - निरंतर !

संपादित करें:

वास्तव में, मैंने n=2^32पैरामीटर को पैरामीटर माना , लेकिन लापता संख्याओं k=4की संख्या भी एक पैरामीटर है। मान लिया जाये कि k<<nइस साधन अंतरिक्ष जटिलता है O(k)

अद्यतन करें:

केवल मनोरंजन के लिए (और क्योंकि मैं वर्तमान में रस्ट सीखने की कोशिश कर रहा हूं) मैंने इसे रस्ट में लागू किया: https://gist.github.com/idanarye/90a925ebb2ea57de18f03f570f70ea1f । मैंने एक पाठकीय प्रतिनिधित्व करने के लिए चुना, क्योंकि ऑन-वन ​​इसे ~ 2 ^ 32 संख्याओं के साथ चलाने जा रहा है ...


सभी नंबरों को मेमोरी में (कई पास के लिए) रखने के लिए 4 बाइट्स * 2 ^ 32 मेमोरी की आवश्यकता होती है, जो चीजों को आगे बढ़ा रही है। तो अधिक संभावना है कि आप सभी I / O चार बार करेंगे। लेकिन इस्तेमाल की जाने वाली दूसरी मेमोरी बेहद छोटी है, इसलिए वहां बहुत अच्छा काम है।
user949300

1
@ user949300 मैं यह मान रहा हूं कि यह समाधान एक ही बार में पूरी चीज़ को मेमोरी में लोड करने के बजाय फ़ाइल के टुकड़े को पढ़ता है
रिचर्ड टिंगल

"अधिकांश काउंटर्स 2 ^ 24 पर होने चाहिए, लेकिन 1 से 4 काउंटरों में कम मान होना चाहिए" - गलत: 0 हो सकता है, सभी लापता मूल्यों के साथ पहली बाइट साझा करना (दूसरा और तीसरा भी संभव है)। अगला: आप दूसरे पास में कितने ऐरे बनाते हैं? 256, 1 से 4 गुना 256, 256 गुना 256? और फिर तीसरे और आगे पास में?
बर्नहार्ड हिलर

3
@BernhardHiller फ़ाइल में 32-बिट स्थान में सभी संभावित नंबर हैं, 4 अलग-अलग संख्याओं के लिए सहेजें। जैसे, सभी पहले बाइट्स होंगे, उनमें से केवल 1 से 4 में कम हिट होंगे।
लास वी। कार्लसन

@ LasseV.Karlsen धन्यवाद, अब मैं एल्गोरिथ्म को समझता हूं।
बर्नहार्ड हिलर

6

यदि यह जावा होता, तो आप एक बिटसेट का उपयोग कर सकते थे। खैर, उनमें से दो, क्योंकि वे सभी 32 बिट संख्याओं को पकड़ नहीं सकते हैं। कंकाल कोड, शायद छोटी गाड़ी:

BitSet bitsetForPositives = new Bitset(2^31);  // obviously not 2^31 but you get the idea
BitSet bitsetForNegatives = new Bitset(2^31);

for (int value: valuesTheyPassInSomehow) {
  if ((value & 0x80000000) == 0)
     bitsetForPositives.set(value );
  else
     bitsetForNegatives.set(value & ~0x80000000);
}

फिर BitSet.nextClearBit()खोजने के लिए उपयोग करें कि कौन गायब है।

नोट बहुत बाद में जोड़े गए:

ध्यान दें कि इस एल्गोरिथ्म के साथ, समय लेने वाले भाग को समानांतर में चलाना काफी आसान है । मान लें कि मूल फ़ाइल को लगभग चार भागों में विभाजित किया गया है। बिटसेट्स के 4 जोड़े आवंटित करें (2 जीबी, अभी भी प्रबंधनीय)।

  1. चार धागे हैं, समानांतर में, प्रत्येक प्रक्रिया बिट्स के अपने स्वयं के जोड़े में एक फ़ाइल बनाती है।
  2. जब पूरा हो जाए, तो एक एकल थ्रेड, या बिटसेट्स (ट्रिवियल टाइम) पर वापस जाएं, फिर नेक्स्टबियर को चार बार (काफी तुच्छ समय) कॉल करें।

मुझे उम्मीद है कि I / O अभी भी दर सीमित करने वाला कदम होगा, लेकिन अगर जादुई रूप से सभी संख्याएं स्मृति में थीं, तो आप वास्तव में चीजों को गति दे सकते हैं।


3
@ इदन अयरे। इस समाधान के लिए छोटे कोड की आवश्यकता होती है, इसलिए कोडिंग त्रुटियों की कम संभावना है। मैं सुंदर हूँ यह समय ओ (n) है। न ही यह मानती है / एक बड़ी फ़ाइल के माध्यम से कई पास की आवश्यकता होती है, इसलिए यह एक एल्गोरिथ्म की तुलना में कम स्थान का उपयोग करता है जिसमें कई पास की आवश्यकता होती है। कृपया "ओह डियर" से आपका क्या अभिप्राय है।
उपयोगकर्ता 949300 3

2
Integer.MIN_VALUEसही ढंग से संभाल नहीं करता है। आप इसे ठीक करने के लिए नकारने के बजाय साइन बिट को मास्क कर सकते हैं।
कोडइन्चौस

1
इस भोली दृष्टिकोण को बिट्स के लिए 2 ^ 32 बिट्स = 4 गिब = 512 एमआईबी की आवश्यकता होती है, जो कि 32-बिट सिस्टम पर भी रैम की एक मामूली राशि है।
कोड्सचैट्स

यदि पसंद की भाषा को बिटसेट में नहीं बनाया गया है, तो बाइट सरणी का उपयोग करके उनका अनुकरण करना। उदाहरण के लिए C #:bool GetBit(byte[] byteArray, uint index) { var byteIndex = index >> 3; var bitInByte = index & 7; return (byteArray[byteIndex] >> bitInByte) & 1 != 0; }
CodesInChaos

1
@JoulinRouge (और जैक्सबी) तो, हम सहमत हैं कि यह समय में रैखिक है, मामूली (1/2 गिग) रैम का उपयोग करता है, और केवल I / O का एक पास लेता है। मेरे लिये कार्य करता है।
user949300

5

यह प्रश्न बिट्स (सही / गलत) की एक सरणी का उपयोग करके हल किया जा सकता है। यह उस संख्या को खोजने के लिए सरणी के सूचकांक का उपयोग करके सभी नंबरों के लिए उत्तर धारण करने के लिए सबसे कुशल संरचना होनी चाहिए कि क्या उस विशेष संख्या को पाया गया था।

सी#

var bArray = new BitArray(Int32.MaxValue);

//Assume the file has 1 number per line
using (StreamReader sr = File.OpenText(fileName))
{
        string s = String.Empty;
        while ((s = sr.ReadLine()) != null)
        {
            var n = int32.Parse(s);
            bArray[n] = true;
        }
}

फिर केवल सरणी के माध्यम से पुनरावृत्ति करें और उन मूल्यों के लिए जो अभी भी झूठे हैं वे फ़ाइल में नहीं हैं।

आप फ़ाइल को छोटे हिस्से में तोड़ सकते हैं लेकिन मैं विंडोज 7 (64 बिट) पर चलने वाले अपने 16.0 जीबी लैपटॉप पर पूर्ण इंटॉक्स अधिकतम आकार सरणी (2147483647) आवंटित करने में सक्षम था।

यहां तक ​​कि अगर मैं 64 बिट नहीं चला रहा था तो मैं छोटे बिट सरणियों को आवंटित कर सकता था। मैं उस फाइल को प्री-प्रोसेस करूंगा, जिसमें प्रत्येक छोटी फाइल का एक सेट [0-64000] [64001-128000], आदि संख्याओं के साथ हो, जो उपलब्ध पर्यावरणीय संसाधनों के लिए उपयुक्त होगा। बड़ी फ़ाइल के माध्यम से जाओ और प्रत्येक संख्या को उसी सेट फ़ाइल में लिखें। फिर प्रत्येक छोटी फ़ाइल को संसाधित करें। पूर्व-प्रसंस्करण कदम के कारण इसमें थोड़ा अधिक समय लगेगा, लेकिन सीमित संसाधन होने पर यह संसाधन सीमाओं के आसपास हो जाएगा।


यह नकारात्मक संख्याओं को संभालने के लिए प्रकट नहीं होता है। (या सबसे अधिक बिट सेट के साथ अहस्ताक्षरित अगर इनपुट है।
user949300

@ user949300 - सही है। जब कोई सरणी सभी झूठे मानों के साथ आरंभीकृत की गई थी, तो मैंने किसी बड़ी मेमोरी खपत को नोटिस नहीं किया। नकारात्मक संख्याओं के लिए एक माध्यमिक बिटअरे की आवश्यकता होगी। शायद bArrayNegative = नया BitAreath (Int32.MaxValue)। जब संख्या पढ़ी जाती है तो इसे सकारात्मक या नकारात्मक के लिए जांचा जा सकता है और फिर उपयुक्त बिट ऐरे में डाल दिया जाता है। टिप्पणियों के लिए धन्यवाद।
जॉन रेनोर

2

जैसा कि यह एक साक्षात्कार प्रश्न है, मैं साक्षात्कारकर्ता को बाधाओं के बारे में कुछ समझ दिखाता हूं। फिर, "सभी संभावित संख्याओं" का क्या मतलब है? क्या यह वास्तव में 0 ... 2 <(32-1) है जैसा कि सभी का अनुमान है? सामान्य 32-बिट-आर्किटेक्चर सिर्फ 32 बिट संख्या से अधिक के साथ काम कर सकते हैं। यह सिर्फ प्रतिनिधित्व की बात है, जाहिर है।

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

लेकिन अगर आप वास्तव में इस सवाल को समझना चाहते हैं कि "कुछ को छोड़कर सभी संख्याओं के साथ एक फ़ाइल दी ... 2 ^ (32-1), मुझे एक लापता व्यक्ति दें" (और यह एक बड़ा है !), तो इसे हल करने के कई तरीके हैं।

तुच्छ लेकिन गैर-व्यवहार्य: प्रत्येक संभव संख्या के लिए, फ़ाइल को स्कैन करें और देखें कि क्या यह वहां है।

512 एमबी रैम और फाइल से सिंगल पास के साथ: फाइल से पढ़ी गई हर संख्या (= उस बिट पर इंडेक्स) को चिह्नित करें, और बाद में रैम को एक बार पास करें और लापता लोगों को देखें।


1
कुछ अच्छे प्रश्न, लेकिन क्या 32 बिट सिस्टम ints, floats या huzziwigs का प्रतिनिधित्व कर रहा है, यह अभी भी 32 बिट्स में केवल 2 ^ 32 मानों का प्रतिनिधित्व कर सकता है। यदि प्रश्न "ओह हाँ, हम 128 बिट अल्ट्रा-लॉन्ग" की अनुमति देते हैं, तो प्रश्न में 32 बिट आर्किटेक्चर "बाधा" जानबूझकर भ्रामक है। फिर भी, साक्षात्कारकर्ता से पूछने के लिए एक महान प्रश्न, क्योंकि कई चश्मा भ्रामक या खराब लिखे गए हैं। आपका वास्तविक समाधान मेरा जैसा बिटसैट है।
user949300

@ user949300 हाँ - और यह जानना असंभव है कि साक्षात्कारकर्ता क्या ढूंढ रहा है। यदि अंतिम व्यक्ति जो उन्होंने काम पर रखा था, वह "सोचने से पहले हैकिंग स्टैक" था, तो आपका उत्तर इस बात से अलग होना चाहिए कि क्या यह "आर्किटेक्चर के बारे में बिल्कुल पता नहीं है" या "ऑप्टिमाइज़ेशन गेम खेल रहा है" आदमी। :) मैंने पहले बड़े बिटसेट के साथ काम किया है (हालांकि जावा में नहीं), इसलिए वे स्वाभाविक रूप से मेरे दिमाग में आते हैं। और कम स्मृति के लिए अपनाया जा सकता है अगर जरूरत (बाल्टी)। बिटसेट्स 512 एमबी रैम के साथ रैखिक समय में उपरोक्त टिप्पणियों में "सॉर्टिंग समस्या" को हल करते हैं।
ईको

0

एक दृष्टिकोण जो याद रखना आसान है और एक साक्षात्कार में व्यक्त करना आसान है, इस तथ्य का उपयोग करना होगा कि यदि आप एन बिट्स में सभी संख्याओं को देखते हैं, तो प्रत्येक बिट उन मूल्यों के आधे हिस्से में सेट हो जाएगा और दूसरे आधे में सेट नहीं होगा ।

यदि आप फ़ाइल में सभी मानों पर पुनरावृत्ति करते हैं और अंत में मानों की 32 गिनती रखते हैं, तो आप 32 मानों के साथ समाप्त हो जाएंगे जो वास्तव में (2 ^ 32/2) या उस मूल्य से थोड़ा कम हैं। अंतर जो अधिकतम (2 ^ 32/2) और कुल आपको गुम मानों की प्रत्येक स्थिति में सेट किए गए कुल बिट्स देता है।

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

उदाहरण के लिए एक कुतरना उपयोग करने के लिए, आपके पास निम्न मूल्य हैं:

1010
0110
1111
0111
1101
1001
0100
0101
0001
1011
1100
1110

प्रत्येक स्थिति में निर्धारित कुल बिट हैं:

7867

8 (4 ^ 2/2) से घटाना जो हमें मिलता है:

1021

जिसका अर्थ है कि ये 4 मानों के निम्नलिखित संभव समूह हैं:

1000
0000
0011
0010

1010
0001
0010
0000

(मुझे माफ़ कर दो अगर मैंने कोई मिस किया है, तो मैं इसे दृष्टि से देख रहा हूँ)

और फिर मूल संख्याओं को फिर से देखते हुए, हम 1010 को तुरंत दूर पाते हैं जिसका अर्थ है कि पहला सेट उत्तर था।


लेकिन आप 4 नंबर, नहीं एक खोजने के लिए
freedev

@freedev आप सही हैं। वही करता है। चार नंबर का एक सेट चार नंबर होता है ... एक सेट में।
जिमीजैमेस

दिलचस्प है, लेकिन आप चमकते हैं determine all the possible sets of 4 values that could give those totals। मुझे वास्तव में लगता है कि यह समाधान का एक महत्वपूर्ण हिस्सा है जो आपके उत्तर से गायब है। यह समय और स्थान की जटिलता को भी प्रभावित कर सकता है।
एलोन गुरिलनेक

@AllonGuralnek आप सही हैं। मैंने इसके माध्यम से काम करने में थोड़ा समय बिताया और मैंने बहुत कम करके आंका था कि 4 नंबर के कितने सेट सबसे खराब स्थिति में एक ही नंबर को जोड़ देंगे। मुझे लगता है कि यह एक निंदनीय विचार है, लेकिन जितना मैंने यहां रखा है, उससे कहीं अधिक जटिल है। मैं बाद में विवरण के साथ अद्यतन करूंगा। मैं प्रतिक्रिया की सराहना करता हूं।
जिमीजैम

0

यह मानकर कि फ़ाइल संख्या बढ़ाकर हल की गई है:

बीमा करें कि इसमें वास्तव में (2³²-4) संख्याएँ हैं।
अब यदि फ़ाइल पूर्ण थी (या यदि 4 लापता नंबर अंतिम 4 थे), तो स्थिति एन में फ़ाइल के किसी भी शब्द को पढ़ने से मिलान मान N वापस आ जाएगा।

पहली गैर-प्रत्याशित संख्या X1 खोजने के लिए खोज करने के लिए [0..2 0.-4-1] पदों पर एक डाइकोटॉमी खोज का उपयोग करें।
एक बार पाया कि पहली लापता संख्या, दूसरी बार लापता X2 को खोजने के लिए एक dichtotomy फिर से पदों [X1 .. (2³²-4-1)] पर करें: इस समय, स्थिति N पर एक शब्द पढ़कर मिलान मूल्य N-1 वापस करना चाहिए यदि कोई अधिक लापता संख्या नहीं थी (चूंकि आपने एक लापता संख्या पारित की थी)।
शेष दो संख्याओं के लिए Iterate। तीसरे पुनरावृत्ति पर, स्थिति एन पर पढ़ने वाले शब्द को एन -2 वापस करना चाहिए, और चौथे पर, इसे एन -3 वापस करना चाहिए।

कैविएट: मैंने इसका परीक्षण नहीं किया है। लेकिन मुझे लगता है कि यह काम करना चाहिए। :)

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


-2

जैसा कि सभी मानक प्रश्नों के साथ होता है, समाधान यह है कि साक्षात्कार से पहले उन्हें गूगल कर लें।

इस सवाल और विविधताओं में सभी संख्याओं को शामिल करने वाला एक बहुत ही 'सही' उत्तर है। यह दिखाने के लिए आप डेटाबेस या कुछ में अनुक्रमित समझते हैं। तो किसी भी 'के लिए शून्य अंक काम कर सकते हैं, लेकिन यह नहीं है कि क्या कागज पर' उत्तर im afriad कहते हैं।

प्लस साइड में इन सवालों का एक सीमित सेट है, कुछ घंटों का संशोधन आपको एक प्रतिभा की तरह दिखाई देगा। बस बहाना याद रखें आप इसे अपने सिर में काम कर रहे हैं।

संपादित करें। आह यह 4 के लिए लगता है XOR की तुलना में एक अलग दृष्टिकोण है

http://books.google.com/books?id=415loiMd_c0C&lpg=PP1&dq=muthukrishnan%20data%20stream%20algorithms&hl=el&pg=PA1#v=onepage&q=muthukrishnan%20data%20stream%20algorithms&f=false

संपादित करें। डाउनवोटर्स: यह ओपी में वर्णित सटीक समस्या के लिए एक प्रकाशित पाठ्यपुस्तक ओ (एन) समाधान है।


1
विशेष रूप से, यह लिंक की गई पुस्तक स्ट्रीम प्रोसेसिंग के बारे में है। विशेष रूप से, बाधाओं के भीतर धारा प्रसंस्करण। उस ने कहा, मुझे निश्चित रूप से विश्वास होगा कि यह ओपी द्वारा देखे गए प्रश्न का मूल है, क्योंकि यह अन्यथा बहुत तुच्छ है। विशेष रूप से, आपने वास्तव में इस सवाल का जवाब नहीं दिया है। यदि आपके पास इसे "मूल" या "इच्छित" प्रश्न के रूप में समझा सकते हैं और समाधान की व्याख्या कर सकते हैं तो आपसे +1 होगा ... लेकिन, यह कुछ भी उत्तर नहीं देता है।
svidgen

1
यह उत्तर (एक साक्षात्कार में) सिर्फ दिखाता है कि आप पुस्तक पढ़ते हैं। आपके कौशल या विचार प्रक्रियाओं के बारे में कुछ भी नहीं। और साक्षात्कार से पहले आप "Google सभी मानक प्रश्न " कैसे करते हैं ? क्या "एक साक्षात्कार में पूछे गए सभी प्रश्न" की कुछ परिमित सूची है जो मुझे याद है?
user949300

1
@ यह एक अच्छे उम्मीदवार को काम पर रखने की कठिनाई को भी रेखांकित करता है! यदि "अच्छे" वाले लोग साक्षात्कार के प्रश्नों के लिए अच्छी तरह से तैयार हैं ... तो किसी ऐसे व्यक्ति को नियुक्त करना मुश्किल हो जाता है जो वास्तव में मेरी व्यावसायिक समस्याओं को हल कर सकता है?
11

1
@ewan स्पष्ट होने के लिए, मैं अपने गलत विराम चिह्न का मजाक उड़ा रहा था । ... किसी भी मामले में, मुझे ध्यान में रखते हुए, मुझे अपने दिन में भी अच्छी संख्या में नौकरी के प्रस्ताव मिले हैं, यहां तक ​​कि इस तरह के मानक सवालों और जवाबों से भी अनजान होना। और अब, एक काम पर रखने वाले प्रबंधक के रूप में, मैं आपको वादा कर सकता हूं कि मैं पुनर्पाठ जवाब नहीं चाहता हूं ... हालांकि, मुझे लगता है कि कुछ प्रबंधकों की अलग-अलग आवश्यकताएं होंगी।
svidgen

1
@ इवान को मुझे एक और बात भी स्पष्ट करनी चाहिए, यदि मेरा स्वर जैसा इरादा नहीं था: आपको अपने उत्तर को वास्तव में यह बताने के लिए संशोधित करना चाहिए कि लिंक-बुक में समस्या "इच्छित प्रश्न है।" और फिर सवाल का जवाब ! ... आप निस्संदेह हैं मेरी +1, और बहुत सारे अन्य लोगों, और ऐसा करने के लिए ओ पी की मदद करने की संतुष्टि के लिए है।
13
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.