Структура данных, которую я нашел очень полезной, когда мне приходилось выполнять поиск ближайших соседей, была k d-tree. Википедия имеет хороший обзор, а этот является отличным углубленным обсуждением алгоритма, если вы реализуете свой собственный (хотя библиотека может уже существовать - вы не упоминаете какой язык вы используете). Самое важное в d-дереве k заключается в том, что оно позволяет выполнять поиск ближайшего соседа за O (log N).
Таким образом, вы можете составить два списка - членов A и их ближайшего соседа в B и членов B и их ближайшего соседа в A - за O (N log N) времени. Затем вы можете сравнить списки, чтобы увидеть, какие пары совпадают. Сделано наивно, это O (N ^ 2), хотя вы можете придумать способ сделать это быстрее.
[править] Вы заставили меня задуматься; вот моя вторая мысль:
for(a in A)
b := nearest(B, a)
if a = nearest(A, b)
add (a, b) to results
end if
end for
function nearest(X, y)
return nearest member of set X to point y
end function
По моим подсчетам, это O (N log N).