【问题标题】:K-d trees: nearest neighbor search algorithmK-d 树:最近邻搜索算法
【发布时间】:2012-11-10 11:16:00
【问题描述】:

这是我的理解: 1. 向下递归树,根据 ELEMENT 位于左子树还是右子树(如果存在)取左子树或右子树。 2. 将 CURRENT_BEST 设置为您到达的第一个叶节点。 3. 当你递归备份时,检查 ELEMENT 是否离分裂超平面比离 CURRENT_BEST 更近。如果是,则将 CURRENT_BEST 设置为当前节点。

这是我从Wikipedia 和我的班级得到的部分,我不明白的部分: 4.查看3.中挑出的分裂点的另一个子树中是否有任何节点比分裂点更接近ELEMENT。

我不明白为什么我们需要做 4.,因为可能位于分裂节点的一个子树中的任何点都必须比另一个子树中的任何点更靠近分裂节点。

显然我对算法的理解有缺陷,因此将不胜感激。

【问题讨论】:

  • 您从哪篇维基百科文章中获得了这些信息?你能在你的问题中提供一个链接吗?
  • @didierc -- 添加,3 年后
  • 第三步的条件是倒退?

标签: algorithm nearest-neighbor kdtree


【解决方案1】:

第 4 步是第 3 步中的“else”,如果平面比点更近,您会做什么。仅仅因为您找到的点与您要为其寻找邻居的点在同一个矩形中并不意味着它是最近的。

想象以下场景:你的 kD-Tree 中有两个点,A 和 B。A 位于矩形的中间,而 B 刚好在边缘上方,位于 A 旁边的分区区域中。如果您现在搜索点 C 的最近邻居,该点紧邻 B,但恰好是边缘的另一侧,并且在 A 的分区区域中,由于初始深度优先搜索,您选择的第一个点将是 A选择与您的搜索点在同一分区中的任何内容。然而,B 实际上更接近,所以即使你选择了 A,你也需要检查 B 是否更接近,否则你的 kD-Tree 不会真正给你正确的结果。

一个很好的可视化方法是将它画出来:

A-------------C--|--B

A 是我们在 DFS 中找到的第一个点,C 是我们想要最近邻的点,B 是实际最近邻,|是我们的分割平面。

另一种思考方式是在点 C 周围画一个半径为 dist(A,C) 的圆。如果任何其他矩形的任何部分都落在这个圆内,那么它们就有可能持有一个点这可能比 A 更接近 C,因此必须检查它们。如果你现在找到 B,你可以减少你的圆的半径(因为 B 更接近),这样更少的矩形有相交的机会,并且一旦你检查了所有与你的圆相交的矩形(减少你的圆半径作为你的找到更近的邻居)你可以肯定地说没有更近的点。

【讨论】:

    【解决方案2】:

    我写了一个基本的C++ implementation on github。它有迭代和递归两种版本。

    【讨论】:

      【解决方案3】:
      function kdtree (list of points pointList, int depth)
      {
          // Select axis based on depth so that axis cycles through all valid values
          var int axis := depth mod k;
      
          // Sort point list and choose median as pivot element
          select median by axis from pointList;
      
          // Create node and construct subtrees
          var tree_node node;
          node.location := median;
          node.leftChild := kdtree(points in pointList before median, depth+1);
          node.rightChild := kdtree(points in pointList after median, depth+1);
          return node;
      }
      

      【讨论】:

      • 这个算法描述的是构造k-d树而不是搜索最近的邻居。
      猜你喜欢
      • 2011-10-23
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      • 2010-12-10
      • 2012-07-19
      • 2018-05-09
      相关资源
      最近更新 更多