Возможно, это немного сложно реализовать, но у меня нет других идей, кроме этой:
Чтобы снизить сложность вычислений, возможно, вам придется использовать некоторую структуру данных, такую как KD-Tree или QuadTree.
Вы можете использовать KD-дерево для поиска ближайших соседей, и это то, что вам нужно.
1) Вы строите свое kd-дерево для первого списка в O (n log n).Это должно быть сделано в одном потоке.
2) Для каждого элемента в вашем втором списке вы выполняете поиск в kd-дереве для ближайшего соседа (ближайшей точки к точке, которую вы ищете), в O (m log n).Если расстояние от текущей точки до ближайшей найденной точки меньше вашей дельты, оно у вас есть.Если вы хотите, вы можете сделать этот шаг, используя несколько потоков.
Итак, в конце сложность алгоритма будет O (max (n, m) * log n), где n - количество элементов впервый список, m - это количество элементов во втором списке.
Для KD-деревьев см .:
См. http://home.wlu.edu/~levys/software/kd/ это кажется хорошей реализацией, в Java и C #.
См. http://www.codeproject.com/KB/architecture/KDTree.aspx
Для четырехугольных деревьев см .:
См. http://csharpquadtree.codeplex.com/
См. http://www.codeproject.com/KB/recipes/QuadTree.aspx
Иконечно, посмотрите в Википедии, что такое дерево квадрантов и дерево kd
Учтите, что (2000 * log base 2 (2000)) составляет около 21931,5
Вместо 2000 * 2000 - 4000000, aбольшая разница!
Используя параллельный алгоритм, если у вас есть 4 процессора, нормальный алгоритм O (n * n) потребует 1000000 на процессор, и я думаю, что это будет слишком много, если вам нужно что-то быстроеили почти в режиме реального времени.