मुझे यह साक्षात्कार प्रश्न दिया गया है:
चार बिलियन पूर्णांकों के साथ एक इनपुट फ़ाइल को देखते हुए, एक पूर्णांक उत्पन्न करने के लिए एक एल्गोरिथ्म प्रदान करें जो फ़ाइल में निहित नहीं है। मान लें कि आपके पास 1 जीबी मेमोरी है। यदि आपके पास केवल 10 एमबी मेमोरी है तो आप क्या करेंगे, इसका पालन करें।
मेरा विश्लेषण:
फ़ाइल का आकार 4 × 10 9 × 4 बाइट्स = 16 जीबी है।
हम बाहरी छँटाई कर सकते हैं, इस प्रकार हमें पूर्णांकों की सीमा ज्ञात कर सकते हैं।
मेरा प्रश्न यह है कि छंटे हुए बड़े पूर्णांक सेटों में लापता पूर्णांक का पता लगाने का सबसे अच्छा तरीका क्या है?
मेरी समझ (सभी उत्तरों को पढ़ने के बाद):
मान लें कि हम 32-बिट पूर्णांक के बारे में बात कर रहे हैं, 2 32 = 4 * 10 9 अलग पूर्णांक हैं।
केस 1: हमारे पास 1 जीबी = 1 * 10 9 * 8 बिट्स = 8 बिलियन बिट्स मेमोरी है।
समाधान:
यदि हम एक अलग पूर्णांक का प्रतिनिधित्व करने वाले एक बिट का उपयोग करते हैं, तो यह पर्याप्त है। हमें सॉर्ट की जरूरत नहीं है।
कार्यान्वयन:
int radix = 8;
byte[] bitfield = new byte[0xffffffff/radix];
void F() throws FileNotFoundException{
Scanner in = new Scanner(new FileReader("a.txt"));
while(in.hasNextInt()){
int n = in.nextInt();
bitfield[n/radix] |= (1 << (n%radix));
}
for(int i = 0; i< bitfield.lenght; i++){
for(int j =0; j<radix; j++){
if( (bitfield[i] & (1<<j)) == 0) System.out.print(i*radix+j);
}
}
}
केस 2: 10 एमबी मेमोरी = 10 * 10 6 * 8 बिट्स = 80 मिलियन बिट्स
समाधान:
सभी संभव 16-बिट उपसर्गों के लिए, 2 16 संख्याओं के पूर्णांक = 65536 हैं, हमें 2 16 * 4 * 8 = 2 मिलियन बिट्स की आवश्यकता है। हमें 65536 बाल्टी बनाने की जरूरत है। प्रत्येक बाल्टी के लिए, हमें सभी संभावनाओं को पकड़ने के लिए 4 बाइट्स की आवश्यकता होती है क्योंकि सबसे खराब स्थिति सभी 4 बिलियन पूर्णांक एक ही बाल्टी से संबंधित होती है।
- फ़ाइल के माध्यम से पहले पास के माध्यम से प्रत्येक बाल्टी के काउंटर का निर्माण करें।
- बाल्टियों को स्कैन करें, पहले वाले को ढूंढें, जिसकी 65536 से कम हिट है।
- नई बाल्टियाँ बनाएँ जिनके उच्च 16-बिट उपसर्ग हम फ़ाइल के दूसरे पास के माध्यम से चरण 2 में पाए जाते हैं
- चरण 3 में निर्मित बाल्टियों को स्कैन करें, पहली बाल्टी को खोजें जिसमें कोई हिट न हो।
कोड एक के ऊपर एक समान है।
निष्कर्ष: हम बढ़ते फ़ाइल पास के माध्यम से मेमोरी घटाते हैं।
देर से पहुंचने वालों के लिए एक स्पष्टीकरण: सवाल, जैसा कि पूछा गया है, यह नहीं कहता है कि वास्तव में एक पूर्णांक है जो फ़ाइल में निहित नहीं है- कम से कम यह नहीं है कि अधिकांश लोग इसकी व्याख्या कैसे करते हैं। टिप्पणी थ्रेड में कई टिप्पणियां कार्य की उस भिन्नता के बारे में हैं , हालांकि। दुर्भाग्य से यह टिप्पणी जो इसे टिप्पणी थ्रेड में पेश करती है, बाद में इसके लेखक द्वारा हटा दी गई थी, इसलिए अब यह ऐसा लगता है कि अनाथ जवाबों ने इसे सब कुछ गलत समझा। यह बहुत भ्रामक है, क्षमा करें।