Насколько мне известно, текущий стандартный алгоритм поиска kNN для различных деревьев (R-Trees, quadtree, kd-trees) был разработан:
GR Hjaltason и H. Samet. , «Дистанционный просмотр в пространственных базах данных», ACM TODS 24 (2): 265--318. 1999
См. здесь . Он пересекает дерево на основе приоритетной очереди ближайших узлов / записей. Одним из ключевых моментов является то, что алгоритм также работает для поиска самых дальних соседей .
В алгоритме basi c используется очередь с приоритетами. Очередь может содержать узлы дерева, а также записи данных, отсортированные по расстоянию до точки поиска. На начальном этапе он добавляет узел root в очередь с приоритетами. Затем повторяйте следующее до тех пор, пока не будет найдено k
записей:
- Возьмите первый элемент из очереди. Если это запись, верните ее. Если это узел, добавьте все элементы узла в очередь с приоритетами.
- Повторите 1.
В документе описывается реализация R-деревьев, но они утверждают, что ее можно применять к большинству древовидных структур. Я сам реализовал ближайшую версию соседа для R-Trees и PH-Trees (специальный тип дерева квадрантов), оба в Java. Я думаю, что знаю, как сделать это эффективно для KD-Trees, но я считаю, что это несколько сложно.