Я хочу оптимизировать довольно простой алгоритм, который в настоящее время O (n 2 ) .У меня есть файл записей, где каждый из них должен сравниваться друг с другом в одном файле.Если они одинаковы (функция сравнения довольно сложная), соответствующие записи выводятся.Обратите внимание, что может быть несколько записей, совпадающих друг с другом, , и отсутствует порядок следования - только если совпадение истинно или неверно.
Псевдокод:
For (outRec in sourceFile) {
Get new filePointer for targetFile //starting from the top of the file for inner loop
For (inRec in targetFile) {
if (compare(outRec, inRec) == TRUE ) {
write outRec
write inRec
}
increment some counters
}
increment some other counters
}
Данные не сортируются никаким образом, и предварительная обработка данных не позволяет упорядочить данные.
Любые идеи о том, как это может стать чем-то меньшим, чем O (п 2 ) ?Я подумываю применить парадигму MapReduce к коду, разбить внешние и внутренние циклы, возможно используя цепную функцию Map.Я почти уверен, что у меня есть код, разработанный для Hadoop, но хотел проверить альтернативы, прежде чем потратить время на его кодирование.
Предложения приветствуются!
Добавлено: Типы записей.По сути, мне нужно сопоставить имена / строки.Типы соответствия показаны в примере ниже.
1,Joe Smith,Daniel Foster<br>
2,Nate Johnson,Drew Logan<br>
3,Nate Johnson, Jack Crank<br>
4,Joey Smyth,Daniel Jack Foster<br>
5,Joe Morgan Smith,Daniel Foster<br>
<br>
Expected output:
Records 1,4,5 form a match set
End of output
Добавлено: эти файлы будут довольно большими.Ожидается, что самый большой файл будет около 200 миллионов записей.