Псевдокод для поиска ближайшего соседа (NN) в Википедии мне не подходит. Еще несколько сообщений с реализациями, но они, похоже, зависят от языка. Поэтому мне трудно понять, как работает поиск NN. Эта диаграмма взята из https://www.cs.cmu.edu/~ckingsf/bioinfo-lectures/kdtrees.pdf. И я пытаюсь понять это в конкретном случае, скажем, точка запроса Q = (52,52). Предположим, что два dim - это (x, y), и корневой уровень разделен на x-dim.
Поиск NN:
Сначала я спускаюсь от корня к листу, как будто пытаюсь вставить Q; и при этом лист будет (55,1). Обновите (глобальную) переменную current_best с INFINITY до (55-52) 2 + (1-52) 2 = 2610.
Затем я перехожу к (70,70) и обновляю current_best с 2610 до 18 2 +18 2 = 648. Так как это дает лучшее расстояние, мы должны исследовать это поддерево: это правильное понимание?
Кроме того, мы видим, что узел (60,80) не дает лучшего результата (т.е. нет обновления для current_best).
В процессе дальнейшего продвижения мы обнаруживаем, что root (51,75) дает еще лучший результат (current_best получает значение 530). Итак, исходя из моего понимания, мы должны проверить это другое поддерево.
(25,40) не дает лучшего результата. Я понимаю, что нам все еще нужно проверить поддерево (25,40). Однако в этом случае, поскольку этот узел использует y-dim, и поскольку Qy> 40, нам нужно проверить только правое поддерево (с корнем (35,90)): это правильное понимание? Strong >
Короче говоря, я вижу, что если узел обеспечивает лучший результат для current_distance, мы должны проверить оба дочерних узла; и если узел НЕ обеспечивает лучший результат, все, что мы можем сделать, это игнорировать одно поддерево, но необходимо исследовать другое поддерево на основе условия (разделение гиперплоскости по определенному измерению). Это правильное понимание?
Наконец, я очень признателен любому, кто предоставит управляемый псевдокод для поиска NN для Kd-дерева