Принцип голубятни. Если у вас есть 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 ГБ данных, зависит от вас :)
Что касается общей категории алгоритмов, то это проблема комбинаторики (математики о счете).
person
BCoates
schedule
03.04.2011