在2d空间中给出了大量的点(float64)...
有没有办法使用OpenGL或DirectX的功能确定最近邻居?
我已经实现了一个kd-tree,但仍然不够快。
答案 0 :(得分:3)
kd-tree 应 正常工作。但这里有一些提示。
我为一百万点数据集实现了一次kd-tree。这是我从中学到的东西:
您是否尝试过分析代码?您可能会发现需要进行简单的优化,例如需要强制内联的常见辅助函数。
您是否实际测试过代码以验证它是否正在剔除容易识别为“太远”的分区的树分支。如果你不小心,你很容易就会发现一个错误,这个错误会在太远的点上进行不必要的距离计算。
最简单的事情:在比较点之间的线性距离时,您不需要采用(x2-x1)*(y2-y1)的SQRT。
在我的代码中花费的大部分时间只是从原始数据集构建树,包括在每次迭代时确定哪个轴最适合分区的多个完整排序。更简单的算法是在每个树分支的x和y轴上进行分区之间交替,并缓存每个轴的排序顺序。它可能无法构建最优的搜索树,但总体节省可能是巨大的。