Сначала вам нужно найти ближайшего соседа каждого элемента в другом наборе.
Чтобы сделать это эффективно, вам нужен алгоритм ближайший сосед . Лично я бы реализовал kd-tree только потому, что я делал это в прошлом в своем классе алгоритмов, и это было довольно просто. Другой жизнеспособной альтернативой является R-дерево .
Сделайте это один раз для каждого элемента в наименьшем наборе. (Добавьте один элемент от меньшего к большему и запустите алгоритм, чтобы найти ближайшего соседа.)
Отсюда вы сможете получить список ближайших соседей для каждого элемента.
При поиске пар ближайших соседей сохраняйте их в отсортированной структуре данных, которая имеет метод быстрого сложения и метод getMax, например heap , отсортированный по Евклидову дистанцию .
Затем, как только вы закончите, просто попросите кучу максимум.
Время выполнения этого разбивается следующим образом:
N = размер меньшего набора
М = размер большего набора
- N * O (log M + 1) для всех проверок ближайшего соседа дерева kd.
- N * O (1) для вычисления евклидова расстояния перед добавлением его в кучу.
- N * O (log N) для добавления пар в кучу.
- O (1), чтобы получить окончательный ответ: D
Итак, в итоге весь алгоритм равен O (N * log M).
Если вам не важен порядок каждой пары, вы можете сэкономить немного времени и пространства, сохранив только найденный максимум.
* Отказ от ответственности: все это предполагает, что вы не будете использовать чрезвычайно большое количество измерений и что ваши элементы будут следовать в основном случайному распределению.