Другие языки программирования и технологии

Поиск в большом файле C++

Задача такого рода: Есть некий файл, в котором есть последовательность чисел, размер файла может быть до 2 Гб ключительно.

Например в файле есть последовательность: 1 1 2 2 3 3 .. 455 455 466 477 477 ...
и т. д
Тоесть у каждого числа есть пара кроме одного, надо определить у какого.

Каким способои правильнее решить данную задачу?

Занести данные числа в массив и составить рекурсивную функцию, которая разбивалабы массив на несколько частей и наченала проверять. Тоесть так: Сначало массива проверет 5 пар, потом 5 пар с конца двигаясь к середине массива, и 5 пар с середины двигаясь влеево и тоже самое в право.
Надеюсь меня поняли какой алгоритм хочу реализовать?

Или тупо в файле зацыклить и проеверять по порядку?

И еще одна мысль, может реализовать через xor ?

И как быть? В массив занести или срузу в файле.

Просто в массиве будет много памяти жрать, если файл весит 2 Гб, такой массив охренеет, тоемболее будет неизвестна количество элементов и придется динамически.

Хотя можно посчетать сколько байт памяти и выделить столько памяти, но это не корректно будет?
Дмитрий Паул
Дмитрий Паул
4 674
Имя массива - arr
Индексатор - n
Вот массив и уже для простоты отсортированный:

1 1 2 2 3 3 4 4 5 5 6 6 7 8 8 9 9

Согласно задания, количество элементов в нём всегда нечётное, ведь только один элемент не имеет пары. Делим его пополам. В нём 17 элементов, старший индекс равен 16. 16 / 2 = 8. Ставим индексатор на элемент с индексом 8 - 1. Это вторая четвёрка.
Слева у нас: 1 1 2 2 3 3 4 4
Справа у нас: 5 5 6 6 7 8 8 9 9
Выполняем проверку. .
if (arr[n] == arr[n - 1])
если проверка даст true, то слева все элементы парные, искать нужно в правой части.. . А как? Методом бинарного поиска!
Правую часть: опять делим пополам
Слева у нас: 5 5 6 6
Справа у нас: 7 8 8 9 9
Выполняем проверку. .
if (arr[n] == arr[n - 1])
Опять слева true
Правую часть: опять делим пополам
Слева у нас: 7 8
Справа у нас: 8 9 9
Выполняем проверку. .
if (arr[n] == arr[n - 1])
Опаньки, у нас false, а элемент arr[n - 1] является не парным (в противном случае там бы стояло две семёрки и было бы true)

Основное время займёт сортировка, если в этом есть необходимость и выгрузка в память, так как на поиск уйдёт один миг
Кайрат Есмагулов
Кайрат Есмагулов
66 985
Лучший ответ
Дмитрий Паул Спасибо большое, это че то напоменает на двоичный поиск в массиве.
Дмитрий Паул Почему мне в голову такие идеи не приходят))
Всё, что есть в файле, сложить по модулю 2, результат суммы - искомое значение, если, конечно, оно только одно такое во всём файле.
A1
Antonio 1
76 473
Мехмет Каралёв Красиво! минимальный код
...
rez ^=mas;
...
Просто прелесть
fstream str; //файловый поток

...(открываем файл для чтения)
int a,b;
while ( ! str.eof() )
{
str>>a;
str>>b;
if(a!=b)
///число без пары нашли
}