【发布时间】:2012-12-28 14:00:01
【问题描述】:
我正在寻找有效的算法来找到最接近点 P(x, y, z) 的顶点。顶点集是固定的,每个请求都带有新的点 P。我尝试了 kd-tree 和其他已知方法,但我到处都遇到同样的问题:如果 P 更接近则一切都很好,只对少数树节点执行搜索.但是,如果 P 足够远,那么应该扫描越来越多的节点,最终速度变得无法接受。在我的任务中,我无法指定一个小的搜索半径。这种情况有什么解决办法?
谢谢 伊戈尔
【问题讨论】:
-
k-d 树有多少个点?此外,k-d 树是这个问题的标准解决方案;我很惊讶他们对你来说不够快。您确定问题不在其他地方或不在 k-d 树实现中吗?
-
点数是可变的(取决于用户的型号),通常很小,如 2-5K。但我有大量的查询(数百万)。
-
示例:顶点在球体上,R = 100,查询点 P 在球体的中心。树划分点,到分隔符的距离为 100。需要检查两半。下一个分割-距离再次为100,也需要扫描两者。最后检查所有(或几乎所有)顶点。如果 P 更接近界限 - 事情会变得更好,但仍然检查了很多点。当然,如果 P 在附近的表面 - 树很快,但我也必须计算远点的距离
-
啊,球形数据是 k-d 树的最坏情况输入。 :-)
-
你能保证数据是球形的吗?另外,是所有测试点都靠近中心,还是只是其中一些?
标签: algorithm data-structures nearest-neighbor kdtree closest-points