Это основано на одном допущении: расстояние сдвига очень мало (по существу, нечеткое измерение) по сравнению с расстоянием между уникальными точками между первым и вторым множеством.
Во-первых, общая структура набора точек не подвержена значительному влиянию перемещения, поворота или масштабирования. Это дает вам довольно много вариантов.
Возьмите мин / макс для каждого измерения (x, y, z и т. Д.). Переведите и измените масштаб двух наборов. Точное масштабирование не имеет значения, но вы можете использовать его таким образом, чтобы все точки были положительными и составляли от 0 до 100 в каждом измерении. Это позволяет сравнивать точки более последовательно. Хотя это может не быть строго необходимо и может быть пропущено
Затем вы должны создать двунаправленное отображение (двунаправленный граф) между множеством точек A и множеством точек B, которое будет O (| A | + | B |), где | A | и | B | размеры наборов.
Пример двунаправленного отображения:
a_to_b[(1.001,2.001)] = [(1.005,1.995)]
b_to_a[(1.005,1.995)] = [(1.001,2.001)]
Если a_to_b
и b_to_a
отображаются друг на друга, то это одна и та же точка с относительно высокой вероятностью.
Если нет, то вы, скорее всего, увидите что-то вроде этого:
a_to_b[(1.001,2.007)] = [(1.005,1.995)]
b_to_a[(1.005,1.995)] = [(1.500, 2.004)]
a_to_b[(1.500, 2.004)] = [(1.495, 2.009)]
b_to_a[(1.495, 2.009)] = [(1.500, 2.004)]
Поскольку больше нет отображения 1-1, это означает, что что-то было добавлено или удалено. Поскольку значение в a не было отображено обратно, оно, вероятно, было удалено. В обратном произошло, скорее всего, добавлено. Если он был добавлен, вам нужно будет перезапустить алгоритм, чтобы попытаться определить исходную ближайшую точку.
Это можно проверить, посмотрев на другую точку и выяснив, является ли она частью отображения 1-1 (и, следовательно, учитывается). По сути, вы хотите учесть все точки сопоставления 1-1 (которые имеют высокую вероятность совпадения точек), а затем попытаться отсортировать точки, которые не совпадают аккуратно
Возможно, вы захотите получить триангуляцию Делоне для обоих наборов точек, чтобы позволить искать ближайший сосед всех точек намного быстрее из-за знания того, какие точки пространственно соседствуют с данной точкой. Число ребер в графе Делоне, если я правильно помню, равно O (V), поэтому среднее ребро по вершинам равно O (1). Как только вы нашли ближайшую точку. Тем не менее, вам может потребоваться внести некоторые изменения в делавнарные графики, чтобы учесть добавленные / удаленные ребра.