【问题标题】:kd-tree stores points in inner nodes? If yes, how to search for NN?kd-tree 在内部节点中存储点?如果是,如何搜索NN?
【发布时间】:2014-04-10 13:05:58
【问题描述】:

维基百科中关于 kd-trees 的link 将点存储在内部节点中。我必须执行 NN 查询,我认为(这里是新手),我理解这个概念。

但是,据说我从 Computational Geometry Algorithms and Applications(De Berg、Cheong、Van Kreveld 和 Overmars),第 5.2 节,第 99 页研究 Kd-trees。我可以看到的主要区别是 Overmars 放置了分裂数据在内部节点和叶子中数据集的实际点。例如,在 2D 中,内部节点将保存分割线。

另一方面,维基百科似乎将点存储在内部节点和叶子中(而 Overmars 仅在叶子上)。

在这种情况下,我们如何执行最近邻搜索?而且,为什么会有这种差异?

【问题讨论】:

  • 这个网站主要是针对特定编程问题的问题。您可能会在Computer Science 上得到更好的回复。
  • 我不知道其他网站。我也会在那里发布问题,谢谢。
  • 我会说 wiki 文章明确指出切割平面总是穿过数据集的点。从 De Berg 等人可以看出,这是一个不必要的额外限制(出于好奇:是否明确指出该章是由 Overmars 撰写的?我一直认为 Mark de Berg 是主要作者。)你的立场cut 不会影响在 kd-trees 上运行的算法。
  • 是的,这似乎是书中没有执行的约束。我不知道具体部分是谁写的(Overmars 是一个词:))。我也在这里发布了问题cs.stackexchange.com/questions/23636/…

标签: algorithm nearest-neighbor kdtree approximate-nn-searching


【解决方案1】:

默认的 k-d-trees 应该在一个点分割数据集。然后这个点被存储在内部节点上,当你在搜索时沿着这棵树走时,它会被检查为邻居。

当然,您可以拥有各种 k-d-trees 变体,其中拆分可能位于不同的位置,并且当没有元素恰好位于拆分位置时,您不能再在内部节点中拥有一个。

另外,由于 k-d-trees 不是动态的,当通过 tombstone 模拟删除时,内部节点可能只包含一个 tombstone(表示已删除的对象)。

【讨论】:

  • 维基百科的案例是默认案例。我之前提到的这本书,在中点上分割(我们检查第 i 个变量,i 树的深度。当 i 大于坐标时,我们初始化为 0 并再次执行此操作)并保持分割内部节点。例如,在 2D 中,分割实际上是一条线,因此您存储它的坐标。不同之处在于我们只在叶子上有数据点。我的问题是(现在仍然是),在这种情况下如何回溯,在搜索 NN 时?
  • 回溯的问题在哪里?您的空间布局与内部节点中的元素相同,不是吗?我看不出数学会如何改变。
猜你喜欢
  • 2011-05-17
  • 2011-07-05
  • 2016-04-02
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 2022-01-19
  • 2017-01-20
  • 1970-01-01
相关资源
最近更新 更多