鉴于这些点(7,3),(10,5),(9,0),(5,8),(3,2),(8,1),我需要创建一个平衡的KD树,例如KD树的第一层沿x轴分割,当有两个中位数时,我们选择“较大”的一个作为子树的根。构建完之后,我需要列出尝试找到该点(2,4)的最近邻居时访问的节点。这是我使用上面给定的点构建的树:Here is the KD-Tree I've built
我对寻找最近的邻居非常困惑,而且我必须列出当树找到点(2,4)时访问的节点。到目前为止,我认为它访问(8,1)->(7,3)->(5,8)。但是之后呢?访问哪些节点?
您的k-d树是正确的。
k-d树最近邻居搜索通过在两个阶段之间交替来遍历树:
下降阶段:
注意输入点与树中当前节点之间的距离(实际距离,而不是轴上的距离。
在x轴和y轴之间交替,将输入点的轴坐标与树中当前节点的轴坐标进行比较,以确定要下降到的子树。
重复上载阶段,直到到达树的底部,然后进入上载阶段。
备份阶段:
上一层。如果你不能上去,那就完成了。
如果您已经在当前节点的两个子树上执行了Go-down阶段,请重复Go-back-up。
如果您到目前为止找到的最佳邻居的实际距离比输入节点和树中当前节点之间的轴距离更近,请重复执行上移。
否则,请在与您所在的树相对的子树上进入下移阶段。
这里是您的k-d树的草图,以使其更加清晰:
在示例树和输入节点(2,4)上应用这些步骤:
我们访问的节点在:(8,1),(7,3),(5,8),(7,3),(3,2),(7,3),(8,1)。我们发现的最近邻居是(3,2),距离为2.236。