如何有效地从 kd 树中找到 k 个最近的邻居
How to efficiently find k nearest neighbours from a kd tree
实际上这个问题之前有人问过,但据我所知没有提供合适的答案。
我了解如何实现 k-d 树以及最近邻搜索它的工作原理。然而,即使环顾四周,我也找不到一种有效的方法来使用 k-d 树非常有效地搜索 k 最近的邻居。我只能想到找到最近的邻居并将其删除并再次重复该过程 k-1 次,然后将所有删除的节点插入回树中。但这似乎是多余的,完全违背了目的。
我只是想找到一种使用 k-d 树找到 k 最近邻的简单方法。我不是在寻找可以让我这样做的在线实施或图书馆。我就是想明白其中的逻辑,然后自己去实现。
https://en.wikipedia.org/wiki/K-d_tree#Nearest_neighbour_search处的算法可以看作是"search the whole tree recursively"的优化,优化是在你要搜索的子树不可能包含对当前最佳邻居的改进时进行计算.
要更改此设置以找到 k 个最近的邻居,请保留到目前为止找到的 k 个节点,而不是只找到一个最近的节点,并跟踪到这些节点中最远的节点的距离。然后根据该子树中最近的点是否可能是这 k 个邻居中最远的一个的改进,决定搜索或忽略它。
你会想要一个数据结构,比如堆,它允许你保留 k 个项目,找到距离值最大的项目,删除那个项目,然后插入一个新找到的项目。
实际上这个问题之前有人问过,但据我所知没有提供合适的答案。
我了解如何实现 k-d 树以及最近邻搜索它的工作原理。然而,即使环顾四周,我也找不到一种有效的方法来使用 k-d 树非常有效地搜索 k 最近的邻居。我只能想到找到最近的邻居并将其删除并再次重复该过程 k-1 次,然后将所有删除的节点插入回树中。但这似乎是多余的,完全违背了目的。
我只是想找到一种使用 k-d 树找到 k 最近邻的简单方法。我不是在寻找可以让我这样做的在线实施或图书馆。我就是想明白其中的逻辑,然后自己去实现。
https://en.wikipedia.org/wiki/K-d_tree#Nearest_neighbour_search处的算法可以看作是"search the whole tree recursively"的优化,优化是在你要搜索的子树不可能包含对当前最佳邻居的改进时进行计算.
要更改此设置以找到 k 个最近的邻居,请保留到目前为止找到的 k 个节点,而不是只找到一个最近的节点,并跟踪到这些节点中最远的节点的距离。然后根据该子树中最近的点是否可能是这 k 个邻居中最远的一个的改进,决定搜索或忽略它。
你会想要一个数据结构,比如堆,它允许你保留 k 个项目,找到距离值最大的项目,删除那个项目,然后插入一个新找到的项目。