Мені було дано це питання інтерв'ю:
Дано вхідний файл з чотирма мільярдами цілих чисел, надайте алгоритм для створення цілого числа, яке не міститься у файлі. Припустимо, у вас є 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 через другий прохід файлу
- Скануйте відра, вбудовані в step3, знайдіть перше відро, яке не має хіта.
Код дуже схожий на вищезгаданий.
Висновок: Ми зменшуємо пам’ять за рахунок збільшення пропуску файлів.
Пояснення для тих, хто приходить із запізненням: Запитане запитання не говорить про те, що існує точно одне ціле число, яке не міститься у файлі - принаймні, так не трактує це більшість людей. Багато коментарі в коментар нитка є про те , що зміни завдання, хоча. На жаль, коментар, який вніс його до нитки коментарів, пізніше був видалений його автором, тому зараз схоже, що сиротні відповіді на нього просто неправильно зрозуміли все. Це дуже заплутано, вибачте.