Algorithm K-d树:带可处理伪码的最近邻搜索算法

Algorithm K-d树:带可处理伪码的最近邻搜索算法,algorithm,data-structures,nearest-neighbor,kdtree,Algorithm,Data Structures,Nearest Neighbor,Kdtree,维基百科中最近邻(NN)搜索的伪代码对我来说不够容易处理。很少有更多的帖子与实现一起提供,但它们似乎是特定于语言的。所以我发现很难理解NN搜索是如何工作的。这张图取自。我试图用一个具体的例子来理解它,比如查询点Q=(52,52)。 假设两个维度是(x,y),根级别按x-dim进行拆分。 正在搜索NN: 首先,我从根到叶,好像我要插入Q;这样,叶是(55,1)。将(全局)var电流_最好从无穷大更新为(55-52)2+(1-52)2=2610 接下来,我转到(70,70)并将当前的_最佳值从26

维基百科中最近邻(NN)搜索的伪代码对我来说不够容易处理。很少有更多的帖子与实现一起提供,但它们似乎是特定于语言的。所以我发现很难理解NN搜索是如何工作的。这张图取自。我试图用一个具体的例子来理解它,比如查询点Q=(52,52)。 假设两个维度是(x,y),根级别按x-dim进行拆分。

正在搜索NN:

首先,我从根到叶,好像我要插入Q;这样,叶是(55,1)。将(全局)var电流_最好从无穷大更新为(55-52)2+(1-52)2=2610

接下来,我转到(70,70)并将当前的_最佳值从2610更新为182+182=648。由于这提供了更好的距离,我们必须探究它的子树:这是正确的理解吗?

此外,我们看到节点(60,80)并没有给出更好的结果(即当前_-best没有更新)

在进一步上升的过程中,我们发现root(51,75)给出了更好的结果(current_best设置为530)。所以,应用我的理解,我们必须检查它的另一个子树

(25,40)不会产生更好的结果。我的理解是,我们仍然需要验证(25,40)的子树。然而,在这种情况下,由于该节点使用y-dim,并且由于Q.y>40,我们只需要检查正确的子树(根在(35,90)):这是正确的理解吗?

简而言之,我看到的是,如果一个节点为当前_距离提供了更好的结果,那么我们必须探测两个子节点;如果一个节点不能提供更好的结果,我们所能做的就是忽略其中一个子树,但必须根据条件探测另一个子树(按特定维度拆分超平面)这是正确的理解吗?


最后,我非常感谢任何人为Kd树的NN搜索提供一个易于处理的伪代码

想象一下目标点及其周围的一个磁盘,其半径等于迄今为止发现的最短距离(最初为无穷远)

您位于将平面拆分为两个半平面的树的根部。使半径等于当前半径的最小值以及从目标到根的距离。然后递归到与磁盘相交的半平面,只要根有子

确保跟踪哪个根达到最小值

Visit(root):
    d= distance(target, root)
    if d < r:
        r= d
        closest= root

    if root.left and root.x - target.x < r:
        Visit(root.left)
    if root.right and target.x - root.x < r:
        Visit(root.right)
访问(根目录):
d=距离(目标、根)
如果d

注意:半平面测试处于
x
y
状态,具体取决于您使用的轴选择策略。

@Yves Daoust-通过此算法,我们将探测根在(10,30)的子树-这似乎不需要。这是我对目标(52,52)的跟踪:访问(51,75)将设置r=24。Test(root.x-target.x