Принцип Pigeonhole - Если у вас N голубей в M голубых дыр, и N> M, в норе есть как минимум 2 голубя.Множество 32-битных целых чисел - это наши 2 ^ 32 ячейки, 4,3 миллиарда чисел в нашем файле - голуби.Поскольку 4.3x10 ^ 9> 2 ^ 32, мы знаем, что есть дубликаты.
Вы можете применить этот принцип, чтобы проверить, находится ли искомый дубликат в подмножестве чисел за счет чтениявесь файл, не загружая больше, чем за раз в ОЗУ - просто посчитайте, сколько раз вы видите число в тестовом диапазоне, и сравните с общим числом целых чисел в этом диапазоне.Например, чтобы проверить наличие дубликата от 1 000 000 до 2 000 000 включительно:
int pigeons = 0;
int pigeonholes = 2000000 - 1000000 + 1; // include both fenceposts
for (each number N in file) {
if ( N >= 1000000 && N <= 2000000 ) {
pigeons++
}
}
if (pigeons > pigeonholes) {
// one of the duplicates is between 1,000,000 and 2,000,000
// try again with a narrower range
}
Выбор диапазона проверяемых диапазонов в зависимости от того, сколько раз вы хотите прочитать 16 ГБ данных, зависит от вас:)
Что касается общей категории алгоритмов, то это проблема комбинаторики (математики о счетах).