Удаление дубликатов в двух файлах

156
18 декабря 2017, 14:24

Собственно есть файл1 и файл2, допустим обьем файла1 100кк строк, а файла2 20кк строк, нужно проверить вхождения файла2 в файл1, и записать в новые 2 файла строки которые либо есть в файле1 либо нету, по сколько обьемы строк очень большие есть ли какие то быстрые не ресурсоемкие решения на с++ или с#?

Answer 1

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

Для начала отсортировать ваши файлы. Это на самом деле самая ресурсоёмкая операция. Для этого вам может понадобиться внешняя сортировка, если ваши файлы не влезают в память.

Теперь, когда файлы отсортированы, вы делаете так. Пусть у вас есть текущая строка из первого файла (назовём его словарём), и второго (назовём его вводом). Откроем оба файла, и считаем первую строку из каждого.

Далее в цикле пока ввод или словарь не окончился, делаем следующее в цикле:

  • сравниваем текущую строку ввода и строку словаря
  • если строка словаря больше строки ввода, то строки ввода нет в словаре, дописываем её во второй выходной файл, считываем следующую строку ввода, и переходим к следующей итерации
  • если строка словаря равна строке ввода, то строка ввода есть в словаре, дописываем её в первый выходной файл, считываем следующую строку ввода, и переходим к следующей итерации
  • если строка словаря меньше строки ввода, считываем следующую строку словаря

Если после окончания цикла ввод не окончился, все его строки тоже попадают во второй выходной файл.

Обратите внимание, что алгоритм довольно сильно напоминает сортировку слиянием, которая вам, судя по всему, понадобится для внешней сортировки.

READ ALSO
mingw g++ компиляция без консоли

mingw g++ компиляция без консоли

Как можно скомпилировать c++ приложение в windows, чтобы оно запускалось без консоли? Я пробовал добавлять флаг -mwindows при компиляции, но тогда...

248
Для каждого объекта класса создать член типа QWidget

Для каждого объекта класса создать член типа QWidget

Всем привет! Я пишу приложение на С++ в среде Qt Creator, в котором будет несколько оконУ меня имеется массив некоторых объектов, и я хочу, чтобы...

208
Как сделать анимацию FAB transforming into a single sheet of materia

Как сделать анимацию FAB transforming into a single sheet of materia

Подскажите пожалуйста, кто знает, как сделать такую анимацию или каким способом? Гугл штурмовал, но толком ничего так и не нашелЗа ранее спасибо...

205
Как отсортировать HashMap

Как отсортировать HashMap

Как отсортировать HashMap по убывания количества повторений, то есть по Integer ? Если у кого-то есть реализация, буду очень благодарен)

324