В записи в Википедии о деревьях kd представлен алгоритм для ближайшего поиск соседей по дереву kd. Чего я не понимаю, так это объяснения шага 3.2. Откуда вы знаете, что более близкой точки нет только потому, что разница между координатой разделения точки поиска и текущего узла больше, чем разница между координатой разделения точки поиска и текущей лучшей?
Поиск ближайшего соседа Анимация поиска NN с помощью KD Tree в 2D
Алгоритм ближайшего соседа (NN) направлен на поиск точки в дереве, которая является ближайшей к заданной входной точке. Этот поиск можно выполнять эффективно, используя свойства дерева для быстрого исключения больших частей пространства поиска. Поиск ближайшего соседа в kd-дереве происходит следующим образом:
- Начиная с корневого узла, алгоритм рекурсивно перемещается вниз по дереву, так же, как если бы точка поиска была вставлена (т. Е. Идет вправо или влево в зависимости от того, больше или меньше точка, чем текущий узел в разделить измерение).
- Как только алгоритм достигает листового узла, он сохраняет эту узловую точку как «лучшую на текущий момент».
- Алгоритм разворачивает рекурсию дерева, выполняя следующие шаги на каждом узле: 1. Если текущий узел ближе, чем текущий лучший, то он становится текущим лучшим. 2. Алгоритм проверяет, могут ли быть какие-либо точки по другую сторону плоскости разделения, которые ближе к точке поиска, чем текущая лучшая. По идее, это делается путем пересечения разделяющей гиперплоскости с гиперсферой вокруг точки поиска, радиус которой равен текущему ближайшему расстоянию. Поскольку все гиперплоскости выровнены по осям, это реализовано как простое сравнение, чтобы увидеть, меньше ли разница между координатой разделения точки поиска и текущего узла, чем расстояние (общие координаты) от точки поиска до текущей наилучшей точки. 1. Если гиперсфера пересекает плоскость, могут быть более близкие точки на другой стороне плоскости, поэтому алгоритм должен двигаться вниз по другой ветви дерева от текущего узла в поисках более близких точек, следуя тому же рекурсивному процессу, что и весь поиск. 2. Если гиперсфера не пересекает плоскость разделения, алгоритм продолжает движение вверх по дереву, и вся ветвь на другой стороне этого узла удаляется.
- Когда алгоритм завершает этот процесс для корневого узла, поиск завершается.
Обычно алгоритм использует квадраты расстояний для сравнения, чтобы избежать вычисления квадратных корней. Кроме того, он может сэкономить вычисления, удерживая квадрат текущего лучшего расстояния в переменной для сравнения.