Задача такого рода: Есть некий файл, в котором есть последовательность чисел, размер файла может быть до 2 Гб ключительно.
Например в файле есть последовательность: 1 1 2 2 3 3 .. 455 455 466 477 477 ...
и т. д
Тоесть у каждого числа есть пара кроме одного, надо определить у какого.
Каким способои правильнее решить данную задачу?
Занести данные числа в массив и составить рекурсивную функцию, которая разбивалабы массив на несколько частей и наченала проверять. Тоесть так: Сначало массива проверет 5 пар, потом 5 пар с конца двигаясь к середине массива, и 5 пар с середины двигаясь влеево и тоже самое в право.
Надеюсь меня поняли какой алгоритм хочу реализовать?
Или тупо в файле зацыклить и проеверять по порядку?
И еще одна мысль, может реализовать через xor ?
И как быть? В массив занести или срузу в файле.
Просто в массиве будет много памяти жрать, если файл весит 2 Гб, такой массив охренеет, тоемболее будет неизвестна количество элементов и придется динамически.
Хотя можно посчетать сколько байт памяти и выделить столько памяти, но это не корректно будет?
Другие языки программирования и технологии
Поиск в большом файле C++
Имя массива - 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)
Основное время займёт сортировка, если в этом есть необходимость и выгрузка в память, так как на поиск уйдёт один миг
Индексатор - 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)
Основное время займёт сортировка, если в этом есть необходимость и выгрузка в память, так как на поиск уйдёт один миг
Дмитрий Паул
Спасибо большое, это че то напоменает на двоичный поиск в массиве.
Дмитрий Паул
Почему мне в голову такие идеи не приходят))
Всё, что есть в файле, сложить по модулю 2, результат суммы - искомое значение, если, конечно, оно только одно такое во всём файле.
fstream str; //файловый поток
...(открываем файл для чтения)
int a,b;
while ( ! str.eof() )
{
str>>a;
str>>b;
if(a!=b)
///число без пары нашли
}
...(открываем файл для чтения)
int a,b;
while ( ! str.eof() )
{
str>>a;
str>>b;
if(a!=b)
///число без пары нашли
}
Похожие вопросы
- Ошибки открытия файла C++
- считать большой файл.
- Поиск года в файле на С++
- как сжать большой файл?
- что должно быть написано в файле: C:\WINDOWS\system32\drivers\etc\hosts
- взять из массива наибольший элемент c++. Возможно ли это? и как?
- Как в этом коде C++ в файл через каждые две буквы добавить цифру любую? За ранее огромное спасибо
- Где лучше (безопаснее) хранить файлы на D или на C ?
- Visual Studio C++, ошибка : "не удается найти указанный файл"
- C++ Файлы. помогите чем можете . за хороший ответ подарю денюжку